#include <stdio.h>
#include <ctype.h>
#include <string.h>
char stack[100];
int top = -1;
char input[100];
int i = 0;
void printStack()
{
for (int j = 0; j <= top; j++)
}
void push(char c)
{
stack[++top] = c;
}
void pop()
{
if (top >= 0)
top--;
}
int tryReduce()
{
// Rule: E → (E)
if (top >= 2 &&
stack[top] == ')' &&
stack[top - 1] == 'E' &&
stack[top - 2] == '(')
{
top -= 3;
push('E');
return 1;
}
// Rule: E → E*E
if (top >= 2 &&
stack[top] == 'E' &&
stack[top - 1] == '*' &&
stack[top - 2] == 'E')
{
top -= 3;
push('E');
return 1;
}
// Rule: E → E+E
if (top >= 2 &&
stack[top] == 'E' &&
stack[top - 1] == '+' &&
stack[top - 2] == 'E')
{
top -= 3;
push('E');
return 1;
}
// Rule: E → id
if (top >= 0 && stack[top] >= 'a' && stack[top] <= 'z')
{
pop();
push('E');
return 1;
}
return 0;
}
int main()
{
printf("Enter an expression: "); fgets(input
, sizeof(input
), stdin
);
while (input[i])
{
{
i++;
continue;
}
push(input[i]);
i++;
printStack();
while (tryReduce())
{
printStack();
}
}
if (top == 0 && stack[0] == 'E')
else
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgpjaGFyIHN0YWNrWzEwMF07CmludCB0b3AgPSAtMTsKY2hhciBpbnB1dFsxMDBdOwppbnQgaSA9IDA7Cgp2b2lkIHByaW50U3RhY2soKQp7CiAgZm9yIChpbnQgaiA9IDA7IGogPD0gdG9wOyBqKyspCiAgICBwcmludGYoIiVjIiwgc3RhY2tbal0pOwogIHByaW50ZigiXG4iKTsKfQoKdm9pZCBwdXNoKGNoYXIgYykKewogIHN0YWNrWysrdG9wXSA9IGM7Cn0KCnZvaWQgcG9wKCkKewogIGlmICh0b3AgPj0gMCkKICAgIHRvcC0tOwp9CgppbnQgdHJ5UmVkdWNlKCkKewogIC8vIFJ1bGU6IEUg4oaSIChFKQogIGlmICh0b3AgPj0gMiAmJgogICAgICBzdGFja1t0b3BdID09ICcpJyAmJgogICAgICBzdGFja1t0b3AgLSAxXSA9PSAnRScgJiYKICAgICAgc3RhY2tbdG9wIC0gMl0gPT0gJygnKQogIHsKICAgIHRvcCAtPSAzOwogICAgcHVzaCgnRScpOwogICAgcmV0dXJuIDE7CiAgfQoKICAvLyBSdWxlOiBFIOKGkiBFKkUKICBpZiAodG9wID49IDIgJiYKICAgICAgc3RhY2tbdG9wXSA9PSAnRScgJiYKICAgICAgc3RhY2tbdG9wIC0gMV0gPT0gJyonICYmCiAgICAgIHN0YWNrW3RvcCAtIDJdID09ICdFJykKICB7CiAgICB0b3AgLT0gMzsKICAgIHB1c2goJ0UnKTsKICAgIHJldHVybiAxOwogIH0KCiAgLy8gUnVsZTogRSDihpIgRStFCiAgaWYgKHRvcCA+PSAyICYmCiAgICAgIHN0YWNrW3RvcF0gPT0gJ0UnICYmCiAgICAgIHN0YWNrW3RvcCAtIDFdID09ICcrJyAmJgogICAgICBzdGFja1t0b3AgLSAyXSA9PSAnRScpCiAgewogICAgdG9wIC09IDM7CiAgICBwdXNoKCdFJyk7CiAgICByZXR1cm4gMTsKICB9CgogIC8vIFJ1bGU6IEUg4oaSIGlkCiAgaWYgKHRvcCA+PSAwICYmIHN0YWNrW3RvcF0gPj0gJ2EnICYmIHN0YWNrW3RvcF0gPD0gJ3onKQogIHsKICAgIHBvcCgpOwogICAgcHVzaCgnRScpOwogICAgcmV0dXJuIDE7CiAgfQoKICByZXR1cm4gMDsKfQoKaW50IG1haW4oKQp7CiAgcHJpbnRmKCJFbnRlciBhbiBleHByZXNzaW9uOiAiKTsKICBmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pOwoKICB3aGlsZSAoaW5wdXRbaV0pCiAgewogICAgaWYgKGlzc3BhY2UoaW5wdXRbaV0pKQogICAgewogICAgICBpKys7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgcHVzaChpbnB1dFtpXSk7CiAgICBpKys7CiAgICBwcmludGYoIlNoaWZ0OiAiKTsKICAgIHByaW50U3RhY2soKTsKICAgIHdoaWxlICh0cnlSZWR1Y2UoKSkKICAgIHsKICAgICAgcHJpbnRmKCJSZWR1Y2U6ICIpOwogICAgICBwcmludFN0YWNrKCk7CiAgICB9CiAgfQogIGlmICh0b3AgPT0gMCAmJiBzdGFja1swXSA9PSAnRScpCiAgICBwcmludGYoIlN0cmluZyBBY2NlcHRlZFxuIik7CiAgZWxzZQogICAgcHJpbnRmKCJTdHJpbmcgUmVqZWN0ZWRcbiIpOwoKICByZXR1cm4gMDsKfQ==