// Shift Reduce Parser Improved
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Stack to hold tokens and non-terminals during parsing
char stack[100][10];
int top = -1; // Points to the top of the stack
int pos = 0; // Input pointer
char input[100]; // Holds input string
// Push a symbol onto stack
void push(const char *s)
{
}
// Pop top element
void pop()
{
top--;
}
// Print stack contents
void printStack()
{
for (int i = 0; i <= top; i++)
}
// Apply reduce rules
int reduce()
{
// Rule 1: E -> E + E
if (top >= 2 &&
strcmp(stack
[top
-2], "E") == 0 && strcmp(stack
[top
-1], "+") == 0 && {
pop();
pop();
pop();
push("E");
return 1;
}
// Rule 2: E -> E * E
if (top >= 2 &&
strcmp(stack
[top
-2], "E") == 0 && strcmp(stack
[top
-1], "*") == 0 && {
pop();
pop();
pop();
push("E");
return 1;
}
// Rule 3: E -> (E)
if (top >= 2 &&
strcmp(stack
[top
-2], "(") == 0 && strcmp(stack
[top
-1], "E") == 0 && {
pop();
pop();
pop();
push("E");
return 1;
}
// Rule 4: E -> id
if (top != -1 &&
stack[top][0] >= 'a' &&
stack[top][0] <= 'z')
{
pop();
push("E");
return 1;
}
return 0;
}
int main()
{
printf("Enter an Expression:\n"); fgets(input
, 100, stdin
);
while (input[pos])
{
// Ignore spaces
{
pos++;
continue;
}
char temp[2] = {input[pos], '\0'};
push(temp);
pos++;
printStack();
while (reduce())
{
printStack();
}
}
if (top
== 0 && strcmp(stack
[0], "E") == 0) else
return 0;
}
Ly8gU2hpZnQgUmVkdWNlIFBhcnNlciBJbXByb3ZlZAojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCi8vIFN0YWNrIHRvIGhvbGQgdG9rZW5zIGFuZCBub24tdGVybWluYWxzIGR1cmluZyBwYXJzaW5nCmNoYXIgc3RhY2tbMTAwXVsxMF07CmludCB0b3AgPSAtMTsgICAgICAvLyBQb2ludHMgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKaW50IHBvcyA9IDA7ICAgICAgIC8vIElucHV0IHBvaW50ZXIKY2hhciBpbnB1dFsxMDBdOyAgIC8vIEhvbGRzIGlucHV0IHN0cmluZwoKLy8gUHVzaCBhIHN5bWJvbCBvbnRvIHN0YWNrCnZvaWQgcHVzaChjb25zdCBjaGFyICpzKQp7CiAgICBzdHJjcHkoc3RhY2tbKyt0b3BdLCBzKTsKfQoKLy8gUG9wIHRvcCBlbGVtZW50CnZvaWQgcG9wKCkKewogICAgdG9wLS07Cn0KCi8vIFByaW50IHN0YWNrIGNvbnRlbnRzCnZvaWQgcHJpbnRTdGFjaygpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKQogICAgICAgIHByaW50ZigiJXMiLCBzdGFja1tpXSk7CiAgICBwcmludGYoIlxuIik7Cn0KCi8vIEFwcGx5IHJlZHVjZSBydWxlcwppbnQgcmVkdWNlKCkKewogICAgLy8gUnVsZSAxOiBFIC0+IEUgKyBFCiAgICBpZiAodG9wID49IDIgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTJdLCAiRSIpID09IDAgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTFdLCAiKyIpID09IDAgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKSA9PSAwKQogICAgewogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvLyBSdWxlIDI6IEUgLT4gRSAqIEUKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICIqIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiRSIpID09IDApCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIFJ1bGUgMzogRSAtPiAoRSkKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICIoIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiKSIpID09IDApCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIFJ1bGUgNDogRSAtPiBpZAogICAgaWYgKHRvcCAhPSAtMSAmJgogICAgICAgIHN0YWNrW3RvcF1bMF0gPj0gJ2EnICYmCiAgICAgICAgc3RhY2tbdG9wXVswXSA8PSAneicpCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9CgppbnQgbWFpbigpCnsKICAgIHByaW50ZigiRW50ZXIgYW4gRXhwcmVzc2lvbjpcbiIpOwogICAgZmdldHMoaW5wdXQsIDEwMCwgc3RkaW4pOwoKICAgIHdoaWxlIChpbnB1dFtwb3NdKQogICAgewogICAgICAgIC8vIElnbm9yZSBzcGFjZXMKICAgICAgICBpZiAoaXNzcGFjZShpbnB1dFtwb3NdKSkKICAgICAgICB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGNoYXIgdGVtcFsyXSA9IHtpbnB1dFtwb3NdLCAnXDAnfTsKICAgICAgICBwdXNoKHRlbXApOwogICAgICAgIHBvcysrOwoKICAgICAgICBwcmludGYoIlNoaWZ0OiAiKTsKICAgICAgICBwcmludFN0YWNrKCk7CgogICAgICAgIHdoaWxlIChyZWR1Y2UoKSkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiUmVkdWNlOiAiKTsKICAgICAgICAgICAgcHJpbnRTdGFjaygpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodG9wID09IDAgJiYgc3RyY21wKHN0YWNrWzBdLCAiRSIpID09IDApCiAgICAgICAgcHJpbnRmKCJTdHJpbmcgQWNjZXB0ZWRcbiIpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiU3RyaW5nIFJlamVjdGVkXG4iKTsKCiAgICByZXR1cm4gMDsKfQ==