#include <stdio.h>
#include <string.h>
#include <ctype.h>
char stack[100][10];
int top = -1; // stack top
int ip = 0; // input position
char input[100];
void push(const char* s)
{
strcpy(stack[++top], s);
}
void pop()
{
top--;
}
void printStack()
{
for (int i = 0; i <= top; i++)
printf("%s", stack[i]);
printf("\n");
}
int reduce()
{
// ( E ) → E
if (top >= 2 &&
strcmp(stack[top - 2], "(") == 0 &&
strcmp(stack[top - 1], "E") == 0 &&
strcmp(stack[top], ")") == 0)
{
pop(); pop(); pop();
push("E");
return 1;
}
// id → E
if (top != -1 && isalpha(stack[top][0]) && strcmp(stack[top], "E") != 0)
{
pop();
push("E");
return 1;
}
// E * E → E
if (top >= 2 &&
strcmp(stack[top - 2], "E") == 0 &&
strcmp(stack[top - 1], "*") == 0 &&
strcmp(stack[top], "E") == 0)
{
pop(); pop(); pop();
push("E");
return 1;
}
// E + E → E
if (top >= 2 &&
strcmp(stack[top - 2], "E") == 0 &&
strcmp(stack[top - 1], "+") == 0 &&
strcmp(stack[top], "E") == 0)
{
pop(); pop(); pop();
push("E");
return 1;
}
return 0;
}
int main()
{
printf("Enter an Expression: ");
fgets(input, sizeof(input), stdin); // input with spaces
while (input[ip])
{
// ignore spaces
if (input[ip] == ' ' || input[ip] == '\n')
{
ip++;
continue;
}
char temp[2] = { input[ip], '\0' };
// shift
push(temp);
ip++;
printf("Shift: ");
// print stack after shifting
printStack();
// reduce which in stack
while (reduce())
{
printf("Reduce: ");
printStack();
}
}
if (top == 0 && strcmp(stack[0], "E") == 0)
printf("String Accepted\n");
else
printf("String Rejected\n");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpjaGFyIHN0YWNrWzEwMF1bMTBdOwppbnQgdG9wID0gLTE7IC8vIHN0YWNrIHRvcCAKaW50IGlwID0gMDsgLy8gaW5wdXQgcG9zaXRpb24KY2hhciBpbnB1dFsxMDBdOwoKdm9pZCBwdXNoKGNvbnN0IGNoYXIqIHMpCnsKICAgIHN0cmNweShzdGFja1srK3RvcF0sIHMpOwp9Cgp2b2lkIHBvcCgpCnsKICAgIHRvcC0tOwp9Cgp2b2lkIHByaW50U3RhY2soKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSB0b3A7IGkrKykKICAgICAgICBwcmludGYoIiVzIiwgc3RhY2tbaV0pOwogICAgcHJpbnRmKCJcbiIpOwp9CgppbnQgcmVkdWNlKCkKewogICAgLy8gKCBFICkg4oaSIEUKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AgLSAyXSwgIigiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcCAtIDFdLCAiRSIpID09IDAgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIikiKSA9PSAwKQogICAgewogICAgICAgIHBvcCgpOyBwb3AoKTsgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIGlkIOKGkiBFCiAgICBpZiAodG9wICE9IC0xICYmIGlzYWxwaGEoc3RhY2tbdG9wXVswXSkgJiYgc3RyY21wKHN0YWNrW3RvcF0sICJFIikgIT0gMCkKICAgIHsKICAgICAgICBwb3AoKTsKICAgICAgICBwdXNoKCJFIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgLy8gRSAqIEUg4oaSIEUKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AgLSAyXSwgIkUiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcCAtIDFdLCAiKiIpID09IDAgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKSA9PSAwKQogICAgewogICAgICAgIHBvcCgpOyBwb3AoKTsgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIEUgKyBFIOKGkiBFCiAgICBpZiAodG9wID49IDIgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wIC0gMl0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AgLSAxXSwgIisiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICJFIikgPT0gMCkKICAgIHsKICAgICAgICBwb3AoKTsgcG9wKCk7IHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oKQp7CiAgICBwcmludGYoIkVudGVyIGFuIEV4cHJlc3Npb246ICIpOwogICAgZmdldHMoaW5wdXQsIHNpemVvZihpbnB1dCksIHN0ZGluKTsgLy8gaW5wdXQgd2l0aCBzcGFjZXMKCiAgICB3aGlsZSAoaW5wdXRbaXBdKQogICAgewogICAgICAgIC8vIGlnbm9yZSBzcGFjZXMKICAgICAgICBpZiAoaW5wdXRbaXBdID09ICcgJyB8fCBpbnB1dFtpcF0gPT0gJ1xuJykKICAgICAgICB7CiAgICAgICAgICAgIGlwKys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgY2hhciB0ZW1wWzJdID0geyBpbnB1dFtpcF0sICdcMCcgfTsKCiAgICAgICAgLy8gc2hpZnQKICAgICAgICBwdXNoKHRlbXApOwogICAgICAgIGlwKys7CiAgICAgICAgcHJpbnRmKCJTaGlmdDogIik7CgogICAgICAgIC8vIHByaW50IHN0YWNrIGFmdGVyIHNoaWZ0aW5nCiAgICAgICAgcHJpbnRTdGFjaygpOwoKICAgICAgICAvLyByZWR1Y2Ugd2hpY2ggaW4gc3RhY2sKICAgICAgICB3aGlsZSAocmVkdWNlKCkpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIlJlZHVjZTogIik7CiAgICAgICAgICAgIHByaW50U3RhY2soKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHRvcCA9PSAwICYmIHN0cmNtcChzdGFja1swXSwgIkUiKSA9PSAwKQogICAgICAgIHByaW50ZigiU3RyaW5nIEFjY2VwdGVkXG4iKTsKICAgIGVsc2UKICAgICAgICBwcmludGYoIlN0cmluZyBSZWplY3RlZFxuIik7CgogICAgcmV0dXJuIDA7Cn0=