#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 100
char stack[SIZE];
int top = -1;
char precedenceTable[7][7] = {
// + * id ( ) $
/* + */ {'>', '<', '<', '<', '>', '>'},
/* * */ {'>', '>', '<', '<', '>', '>'},
/*id */ {'>', '>', 'e', 'e', '>', '>'},
/* ( */ {'<', '<', '<', '<', 'e', 'e'},
/* ) */ {'>', '>', 'e', 'e', '>', '>'},
/* $ */ {'<', '<', '<', '<', '<', 'a'}
};
char symbols[] = {'+', '*', 'i', '(', ')', '$'};
int getSymbolIndex(char sym) {
switch (sym) {
case '+': return 0;
case '*': return 1;
case 'i': return 2; // identifier represented as 'i'
case '(': return 3;
case ')': return 4;
case '$': return 5;
default: return -1;
}
}
char getTopTerminal() {
for (int i = top; i >= 0; i--) {
if (stack[i] != 'E') return stack[i];
}
return '$';
}
void push(char c) {
stack[++top] = c;
}
void pop() {
if (top >= 0) top--;
}
void printStack() {
for (int i = 0; i <= top; i++)
printf("%c", stack[i]);
}
int main() {
char input[SIZE];
printf("Enter expression (use 'i' for id): ");
scanf("%s", input);
strcat(input, "$"); // append end symbol
push('$');
int i = 0;
char a = input[i];
printf("\nStack\t\tInput\t\tAction\n");
while (1) {
char topTerminal = getTopTerminal();
char relation = precedenceTable[getSymbolIndex(topTerminal)][getSymbolIndex(a)];
printStack();
printf("\t\t%s\t\t", &input[i]);
if (a == '$' && top == 1 && stack[0] == '$' && stack[1] == 'E') {
printf("Accepted\n");
break;
}
if (relation == '<' || relation == '=') {
printf("Shift\n");
push(a);
i++;
a = input[i];
} else if (relation == '>') {
printf("Reduce\n");
// Reduce: Replace pattern like E op E or (E) or i with E
if (stack[top] == 'i') {
pop(); push('E');
} else if (stack[top] == 'E' && stack[top - 1] == '+' && stack[top - 2] == 'E') {
top -= 2; stack[top] = 'E';
} else if (stack[top] == 'E' && stack[top - 1] == '*' && stack[top - 2] == 'E') {
top -= 2; stack[top] = 'E';
} else if (stack[top] == ')' && stack[top - 1] == 'E' && stack[top - 2] == '(') {
top -= 2; stack[top] = 'E';
} else {
printf("Error in reduction\n");
break;
}
} else {
printf("Error: Invalid expression\n");
break;
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBTSVpFIDEwMAoKY2hhciBzdGFja1tTSVpFXTsKaW50IHRvcCA9IC0xOwoKY2hhciBwcmVjZWRlbmNlVGFibGVbN11bN10gPSB7CiAgICAvLyAgICAgICsgICAgKiAgICBpZCAgICggICAgKSAgICAkIAogICAgLyogKyAqLyB7Jz4nLCAnPCcsICc8JywgJzwnLCAnPicsICc+J30sCiAgICAvKiAqICovIHsnPicsICc+JywgJzwnLCAnPCcsICc+JywgJz4nfSwKICAgIC8qaWQgKi8geyc+JywgJz4nLCAnZScsICdlJywgJz4nLCAnPid9LAogICAgLyogKCAqLyB7JzwnLCAnPCcsICc8JywgJzwnLCAnZScsICdlJ30sCiAgICAvKiApICovIHsnPicsICc+JywgJ2UnLCAnZScsICc+JywgJz4nfSwKICAgIC8qICQgKi8geyc8JywgJzwnLCAnPCcsICc8JywgJzwnLCAnYSd9Cn07CgpjaGFyIHN5bWJvbHNbXSA9IHsnKycsICcqJywgJ2knLCAnKCcsICcpJywgJyQnfTsKCmludCBnZXRTeW1ib2xJbmRleChjaGFyIHN5bSkgewogICAgc3dpdGNoIChzeW0pIHsKICAgICAgICBjYXNlICcrJzogcmV0dXJuIDA7CiAgICAgICAgY2FzZSAnKic6IHJldHVybiAxOwogICAgICAgIGNhc2UgJ2knOiByZXR1cm4gMjsgIC8vIGlkZW50aWZpZXIgcmVwcmVzZW50ZWQgYXMgJ2knCiAgICAgICAgY2FzZSAnKCc6IHJldHVybiAzOwogICAgICAgIGNhc2UgJyknOiByZXR1cm4gNDsKICAgICAgICBjYXNlICckJzogcmV0dXJuIDU7CiAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOwogICAgfQp9CgpjaGFyIGdldFRvcFRlcm1pbmFsKCkgewogICAgZm9yIChpbnQgaSA9IHRvcDsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpZiAoc3RhY2tbaV0gIT0gJ0UnKSByZXR1cm4gc3RhY2tbaV07CiAgICB9CiAgICByZXR1cm4gJyQnOwp9Cgp2b2lkIHB1c2goY2hhciBjKSB7CiAgICBzdGFja1srK3RvcF0gPSBjOwp9Cgp2b2lkIHBvcCgpIHsKICAgIGlmICh0b3AgPj0gMCkgdG9wLS07Cn0KCnZvaWQgcHJpbnRTdGFjaygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKQogICAgICAgIHByaW50ZigiJWMiLCBzdGFja1tpXSk7Cn0KCmludCBtYWluKCkgewogICAgY2hhciBpbnB1dFtTSVpFXTsKICAgIHByaW50ZigiRW50ZXIgZXhwcmVzc2lvbiAodXNlICdpJyBmb3IgaWQpOiAiKTsKICAgIHNjYW5mKCIlcyIsIGlucHV0KTsKCiAgICBzdHJjYXQoaW5wdXQsICIkIik7IC8vIGFwcGVuZCBlbmQgc3ltYm9sCiAgICBwdXNoKCckJyk7CgogICAgaW50IGkgPSAwOwogICAgY2hhciBhID0gaW5wdXRbaV07CgogICAgcHJpbnRmKCJcblN0YWNrXHRcdElucHV0XHRcdEFjdGlvblxuIik7CgogICAgd2hpbGUgKDEpIHsKICAgICAgICBjaGFyIHRvcFRlcm1pbmFsID0gZ2V0VG9wVGVybWluYWwoKTsKICAgICAgICBjaGFyIHJlbGF0aW9uID0gcHJlY2VkZW5jZVRhYmxlW2dldFN5bWJvbEluZGV4KHRvcFRlcm1pbmFsKV1bZ2V0U3ltYm9sSW5kZXgoYSldOwoKICAgICAgICBwcmludFN0YWNrKCk7CiAgICAgICAgcHJpbnRmKCJcdFx0JXNcdFx0IiwgJmlucHV0W2ldKTsKCiAgICAgICAgaWYgKGEgPT0gJyQnICYmIHRvcCA9PSAxICYmIHN0YWNrWzBdID09ICckJyAmJiBzdGFja1sxXSA9PSAnRScpIHsKICAgICAgICAgICAgcHJpbnRmKCJBY2NlcHRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJlbGF0aW9uID09ICc8JyB8fCByZWxhdGlvbiA9PSAnPScpIHsKICAgICAgICAgICAgcHJpbnRmKCJTaGlmdFxuIik7CiAgICAgICAgICAgIHB1c2goYSk7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgYSA9IGlucHV0W2ldOwogICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb24gPT0gJz4nKSB7CiAgICAgICAgICAgIHByaW50ZigiUmVkdWNlXG4iKTsKICAgICAgICAgICAgLy8gUmVkdWNlOiBSZXBsYWNlIHBhdHRlcm4gbGlrZSBFIG9wIEUgb3IgKEUpIG9yIGkgd2l0aCBFCiAgICAgICAgICAgIGlmIChzdGFja1t0b3BdID09ICdpJykgewogICAgICAgICAgICAgICAgcG9wKCk7IHB1c2goJ0UnKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1t0b3BdID09ICdFJyAmJiBzdGFja1t0b3AgLSAxXSA9PSAnKycgJiYgc3RhY2tbdG9wIC0gMl0gPT0gJ0UnKSB7CiAgICAgICAgICAgICAgICB0b3AgLT0gMjsgc3RhY2tbdG9wXSA9ICdFJzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1t0b3BdID09ICdFJyAmJiBzdGFja1t0b3AgLSAxXSA9PSAnKicgJiYgc3RhY2tbdG9wIC0gMl0gPT0gJ0UnKSB7CiAgICAgICAgICAgICAgICB0b3AgLT0gMjsgc3RhY2tbdG9wXSA9ICdFJzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1t0b3BdID09ICcpJyAmJiBzdGFja1t0b3AgLSAxXSA9PSAnRScgJiYgc3RhY2tbdG9wIC0gMl0gPT0gJygnKSB7CiAgICAgICAgICAgICAgICB0b3AgLT0gMjsgc3RhY2tbdG9wXSA9ICdFJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgaW4gcmVkdWN0aW9uXG4iKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogSW52YWxpZCBleHByZXNzaW9uXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9Cg==