#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 100
char input[MAX];
char stack[MAX];
int top = -1;
int inputIndex = 0;
void push(char c)
{
stack[++top] = c;
stack[top + 1] = '\0';
}
void printState(const char *action)
{
printf("%-15s Stack: %-20s Input: %s\n", action
, stack
, input
+ inputIndex
); }
int reduce()
{
if (top
>= 0 && isalpha(stack
[top
]) && stack
[top
] != 'E') {
stack[top] = 'E';
printState("Reduce id->E");
return 1;
}
if (top >= 2 &&
stack[top] == ')' &&
stack[top - 1] == 'E' &&
stack[top - 2] == '(')
{
stack[top - 2] = 'E';
top -= 2;
stack[top + 1] = '\0';
printState("Reduce (E)->E");
return 1;
}
if (top >= 2 &&
stack[top] == 'E' &&
stack[top - 1] == '*' &&
stack[top - 2] == 'E')
{
stack[top - 2] = 'E';
top -= 2;
stack[top + 1] = '\0';
printState("Reduce E*E->E");
return 1;
}
if (top >= 2 &&
stack[top] == 'E' &&
stack[top - 1] == '+' &&
stack[top - 2] == 'E')
{
stack[top - 2] = 'E';
top -= 2;
stack[top + 1] = '\0';
printState("Reduce E+E->E");
return 1;
}
return 0;
}
void parse()
{
while (input[inputIndex] != '\0')
{
{
inputIndex++;
continue;
}
push(input[inputIndex]);
printState("Shift");
inputIndex++;
while (reduce());
}
while (reduce());
if (top == 0 && stack[0] == 'E')
printf("\nString Accepted\n"); else
printf("\nString Rejected\n"); }
int main()
{
fgets(input
, sizeof(input
), stdin
);
input
[strcspn(input
, "\n")] = '\0';
stack[0] = '\0';
parse();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojZGVmaW5lIE1BWCAxMDAKCmNoYXIgaW5wdXRbTUFYXTsKY2hhciBzdGFja1tNQVhdOwppbnQgdG9wID0gLTE7CmludCBpbnB1dEluZGV4ID0gMDsKCnZvaWQgcHVzaChjaGFyIGMpCnsKICAgIHN0YWNrWysrdG9wXSA9IGM7CiAgICBzdGFja1t0b3AgKyAxXSA9ICdcMCc7Cn0KCnZvaWQgcHJpbnRTdGF0ZShjb25zdCBjaGFyICphY3Rpb24pCnsKICAgIHByaW50ZigiJS0xNXMgU3RhY2s6ICUtMjBzIElucHV0OiAlc1xuIiwgYWN0aW9uLCBzdGFjaywgaW5wdXQgKyBpbnB1dEluZGV4KTsKfQoKaW50IHJlZHVjZSgpCnsKICAgIGlmICh0b3AgPj0gMCAmJiBpc2FscGhhKHN0YWNrW3RvcF0pICYmIHN0YWNrW3RvcF0gIT0gJ0UnKQogICAgewogICAgICAgIHN0YWNrW3RvcF0gPSAnRSc7CiAgICAgICAgcHJpbnRTdGF0ZSgiUmVkdWNlIGlkLT5FIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgc3RhY2tbdG9wXSA9PSAnKScgJiYKICAgICAgICBzdGFja1t0b3AgLSAxXSA9PSAnRScgJiYKICAgICAgICBzdGFja1t0b3AgLSAyXSA9PSAnKCcpCiAgICB7CiAgICAgICAgc3RhY2tbdG9wIC0gMl0gPSAnRSc7CiAgICAgICAgdG9wIC09IDI7CiAgICAgICAgc3RhY2tbdG9wICsgMV0gPSAnXDAnOwogICAgICAgIHByaW50U3RhdGUoIlJlZHVjZSAoRSktPkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZiAodG9wID49IDIgJiYKICAgICAgICBzdGFja1t0b3BdID09ICdFJyAmJgogICAgICAgIHN0YWNrW3RvcCAtIDFdID09ICcqJyAmJgogICAgICAgIHN0YWNrW3RvcCAtIDJdID09ICdFJykKICAgIHsKICAgICAgICBzdGFja1t0b3AgLSAyXSA9ICdFJzsKICAgICAgICB0b3AgLT0gMjsKICAgICAgICBzdGFja1t0b3AgKyAxXSA9ICdcMCc7CiAgICAgICAgcHJpbnRTdGF0ZSgiUmVkdWNlIEUqRS0+RSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0YWNrW3RvcF0gPT0gJ0UnICYmCiAgICAgICAgc3RhY2tbdG9wIC0gMV0gPT0gJysnICYmCiAgICAgICAgc3RhY2tbdG9wIC0gMl0gPT0gJ0UnKQogICAgewogICAgICAgIHN0YWNrW3RvcCAtIDJdID0gJ0UnOwogICAgICAgIHRvcCAtPSAyOwogICAgICAgIHN0YWNrW3RvcCArIDFdID0gJ1wwJzsKICAgICAgICBwcmludFN0YXRlKCJSZWR1Y2UgRStFLT5FIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQgcGFyc2UoKQp7CiAgICB3aGlsZSAoaW5wdXRbaW5wdXRJbmRleF0gIT0gJ1wwJykKICAgIHsKICAgICAgICBpZiAoaXNzcGFjZShpbnB1dFtpbnB1dEluZGV4XSkpCiAgICAgICAgewogICAgICAgICAgICBpbnB1dEluZGV4Kys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgcHVzaChpbnB1dFtpbnB1dEluZGV4XSk7CiAgICAgICAgcHJpbnRTdGF0ZSgiU2hpZnQiKTsKICAgICAgICBpbnB1dEluZGV4Kys7CgogICAgICAgIHdoaWxlIChyZWR1Y2UoKSk7CiAgICB9CgogICAgd2hpbGUgKHJlZHVjZSgpKTsKCiAgICBpZiAodG9wID09IDAgJiYgc3RhY2tbMF0gPT0gJ0UnKQogICAgICAgIHByaW50ZigiXG5TdHJpbmcgQWNjZXB0ZWRcbiIpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiXG5TdHJpbmcgUmVqZWN0ZWRcbiIpOwp9CgppbnQgbWFpbigpCnsKICAgIHByaW50ZigiRW50ZXIgZXhwcmVzc2lvbjogIik7CiAgICBmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pOwoKICAgIGlucHV0W3N0cmNzcG4oaW5wdXQsICJcbiIpXSA9ICdcMCc7CgogICAgc3RhY2tbMF0gPSAnXDAnOwoKICAgIHBhcnNlKCk7CgogICAgcmV0dXJuIDA7Cn0=