// Simple Shift Reduce parsing for E → E + E | E * E | (E) | id
#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 i = 0; // Input pointer/index
char input[100]; // Holds the input string (e.g., "a + b * c")
// Push a symbol (token or non-terminal) onto the stack
void push(const char *s)
{
}
// Pop the top of the stack
void pop()
{
top--;
}
// Print current stack contents
void printStack()
{
for (int i
= 0; i
<= top
; i
++) printf("%s", stack
[i
]); }
// Try to apply a reduction rule to the top of the stack
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()
{
strcpy(input
, "( a + (b*a))");
// Main parsing loop
while (input[i])
{
// Ignore whitespaces
i++;
continue;
}
// SHIFT step
char temp[2] = {input[i], '\0'};
push(temp);
i++;
printStack();
// REDUCE step
while (reduce())
{
printStack();
}
}
// Final check
if (top
== 0 && strcmp(stack
[0], "E")==0) else
return 0;
}
Ly8gU2ltcGxlIFNoaWZ0IFJlZHVjZSBwYXJzaW5nIGZvciBFIOKGkiBFICsgRSB8IEUgKiBFIHwgKEUpIHwgaWQKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiAKLy8gU3RhY2sgdG8gaG9sZCB0b2tlbnMgYW5kIG5vbi10ZXJtaW5hbHMgZHVyaW5nIHBhcnNpbmcKY2hhciBzdGFja1sxMDBdWzEwXTsKaW50IHRvcCA9IC0xOyAvLyBQb2ludHMgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKaW50IGkgPSAwOyAvLyBJbnB1dCBwb2ludGVyL2luZGV4CmNoYXIgaW5wdXRbMTAwXTsgLy8gSG9sZHMgdGhlIGlucHV0IHN0cmluZyAoZS5nLiwgImEgKyBiICogYyIpCiAKLy8gUHVzaCBhIHN5bWJvbCAodG9rZW4gb3Igbm9uLXRlcm1pbmFsKSBvbnRvIHRoZSBzdGFjawp2b2lkIHB1c2goY29uc3QgY2hhciAqcykKewogICAgc3RyY3B5KHN0YWNrWysrdG9wXSwgcyk7Cn0KIAovLyBQb3AgdGhlIHRvcCBvZiB0aGUgc3RhY2sKdm9pZCBwb3AoKQp7CiAgICB0b3AtLTsKfQogCi8vIFByaW50IGN1cnJlbnQgc3RhY2sgY29udGVudHMKdm9pZCBwcmludFN0YWNrKCkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG9wOyBpKyspIHByaW50ZigiJXMiLCBzdGFja1tpXSk7CiAgICBwcmludGYoIlxuIik7Cn0KIAovLyBUcnkgdG8gYXBwbHkgYSByZWR1Y3Rpb24gcnVsZSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawppbnQgcmVkdWNlKCkKewogICAgLy8gUnVsZSAxOiBFIOKGkiBFICsgRQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIisiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKT09MCkKICAgIHsKICAgICAgICBwb3AoKTsgcG9wKCk7IHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KIAogICAgLy8gUnVsZSAyOiBFIOKGkiBFICogRQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIioiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKT09MCkKICAgIHsKICAgICAgICBwb3AoKTsgcG9wKCk7IHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KIAogICAgLy8gUnVsZSAzOiBFIOKGkiAoRSkKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTJdLCAiKCIpPT0wICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICJFIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICIpIik9PTApCiAgICB7CiAgICAgICAgcG9wKCk7IHBvcCgpOyBwb3AoKTsKICAgICAgICBwdXNoKCJFIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAKICAgIC8vIFJ1bGUgNDogRSDihpIgaWQKICAgIGlmICh0b3AhPS0xICYmIHN0YWNrW3RvcF1bMF0+PSdhJyYmc3RhY2tbdG9wXVswXTw9J3onKQogICAgewogICAgICAgIHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KIAogICAgcmV0dXJuIDA7Cn0KIAppbnQgbWFpbigpCnsKICAgIHN0cmNweShpbnB1dCwgIiggYSArICAgICAgKGIqYSkpIik7CiAKICAgIC8vIE1haW4gcGFyc2luZyBsb29wCiAgICB3aGlsZSAoaW5wdXRbaV0pCiAgICB7CiAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2VzCiAgICAgICAgaWYgKGlzc3BhY2UoaW5wdXRbaV0pKSB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogCiAgICAgICAgLy8gU0hJRlQgc3RlcAogICAgICAgIGNoYXIgdGVtcFsyXSA9IHtpbnB1dFtpXSwgJ1wwJ307CiAgICAgICAgcHVzaCh0ZW1wKTsKICAgICAgICBpKys7CiAKICAgICAgICBwcmludGYoIlNoaWZ0OiAiKTsKICAgICAgICBwcmludFN0YWNrKCk7CiAKICAgICAgICAvLyBSRURVQ0Ugc3RlcAogICAgICAgIHdoaWxlIChyZWR1Y2UoKSkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiUmVkdWNlOiAiKTsKICAgICAgICAgICAgcHJpbnRTdGFjaygpOwogICAgICAgIH0KICAgIH0KIAogICAgLy8gRmluYWwgY2hlY2sKICAgIGlmICh0b3AgPT0gMCAmJiBzdHJjbXAoc3RhY2tbMF0sICJFIik9PTApCiAgICAgICAgcHJpbnRmKCJTdHJpbmcgQWNjZXB0ZWRcbiIpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiU3RyaW5nIFJlamVjdGVkXG4iKTsKIAogICAgcmV0dXJuIDA7Cn0=