// 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 index = 0; // Input pointer/index
char input[100]; // Holds the input string (e.g., "a + b * (c + d)")
// 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 && strcmp(stack
[top
], "E") == 0) { pop(); pop(); pop();
push("E");
return 1;
}
// Rule 2: E → id
if (top!=-1 && stack[top][0]>='a'&&stack[top][0]<='z')
{
pop();
push("E");
return 1;
}
// Rule 3: 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;
}
// Rule 4: 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;
}
return 0; // No reduction matched
}
int main() {
// Read input string (e.g., a + b * (c + d))
fgets(input
, sizeof(input
), stdin
);
// Main parsing loop: continue until input ends and no more reductions are possible
while (input[index]) {
index++;
continue;
}
// SHIFT step: if input is not yet fully consumed
char temp[2] = {input[index], '\0'}; // turn character into string
push(temp); // push actual character (like 'x')
index++; // Move input pointer ahead by 1
// Print stack after shift
printStack();
// REDUCE step: apply all possible reductions after shift
while (reduce()) {
printStack();
}
}
// Final check: input is accepted if the stack has a single symbol "E"
if (top
== 0 && strcmp(stack
[0], "E") == 0) else
return 0;
}
Ly8gU2ltcGxlIFNoaWZ0IFJlZHVjZSBwYXJzaW5nIGZvciBFIOKGkiBFICsgRSB8IEUgKiBFIHwgKEUpIHwgaWQKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiAKLy8gU3RhY2sgdG8gaG9sZCB0b2tlbnMgYW5kIG5vbi10ZXJtaW5hbHMgZHVyaW5nIHBhcnNpbmcKY2hhciBzdGFja1sxMDBdWzEwXTsKaW50IHRvcCA9IC0xOyAgICAgIC8vIFBvaW50cyB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawppbnQgaW5kZXggPSAwOyAgICAgLy8gSW5wdXQgcG9pbnRlci9pbmRleApjaGFyIGlucHV0WzEwMF07ICAgLy8gSG9sZHMgdGhlIGlucHV0IHN0cmluZyAoZS5nLiwgImEgKyBiICogKGMgKyBkKSIpCiAKLy8gUHVzaCBhIHN5bWJvbCAodG9rZW4gb3Igbm9uLXRlcm1pbmFsKSBvbnRvIHRoZSBzdGFjawp2b2lkIHB1c2goY29uc3QgY2hhciAqcykgewogICAgc3RyY3B5KHN0YWNrWysrdG9wXSwgcyk7Cn0KIAovLyBQb3AgdGhlIHRvcCBvZiB0aGUgc3RhY2sKdm9pZCBwb3AoKSB7CiAgICB0b3AtLTsKfQogCi8vIFByaW50IGN1cnJlbnQgc3RhY2sgY29udGVudHMKdm9pZCBwcmludFN0YWNrKCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG9wOyBpKyspIHByaW50ZigiJXMiLCBzdGFja1tpXSk7CiAgICBwcmludGYoIlxuIik7Cn0KIAovLyBUcnkgdG8gYXBwbHkgYSByZWR1Y3Rpb24gcnVsZSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawppbnQgcmVkdWNlKCkgewogICAgLy8gUnVsZSAxOiBFIOKGkiBFICsgRQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0yXSwgIkUiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIisiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICJFIikgPT0gMCkgewogICAgICAgIHBvcCgpOyBwb3AoKTsgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgCiAgICAvLyBSdWxlIDI6IEUg4oaSIGlkCiAgICBpZiAodG9wIT0tMSAmJiBzdGFja1t0b3BdWzBdPj0nYScmJnN0YWNrW3RvcF1bMF08PSd6JykKICAgIHsKICAgICAgICBwb3AoKTsgCiAgICAgICAgcHVzaCgiRSIpOyAgCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAKICAgIC8vIFJ1bGUgMzogRSDihpIgRSAqIEUKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICIqIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiRSIpID09IDApIHsKICAgICAgICBwb3AoKTsgcG9wKCk7IHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KIAogICAgLy8gUnVsZSA0OiBFIOKGkiAoRSkKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICIoIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiKSIpID09IDApIHsKICAgICAgICBwb3AoKTsgcG9wKCk7IHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAKICAgIHJldHVybiAwOyAvLyBObyByZWR1Y3Rpb24gbWF0Y2hlZAp9CiAKaW50IG1haW4oKSB7CiAgICAvLyBSZWFkIGlucHV0IHN0cmluZyAoZS5nLiwgYSArIGIgKiAoYyArIGQpKQogICAgZmdldHMoaW5wdXQsIHNpemVvZihpbnB1dCksIHN0ZGluKTsgCiAKICAgIC8vIE1haW4gcGFyc2luZyBsb29wOiBjb250aW51ZSB1bnRpbCBpbnB1dCBlbmRzIGFuZCBubyBtb3JlIHJlZHVjdGlvbnMgYXJlIHBvc3NpYmxlCiAgICB3aGlsZSAoaW5wdXRbaW5kZXhdKSB7CiAgICAgICAgaWYgKGlzc3BhY2UoaW5wdXRbaW5kZXhdKSkgeyAKICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogCiAgICAgICAgLy8gU0hJRlQgc3RlcDogaWYgaW5wdXQgaXMgbm90IHlldCBmdWxseSBjb25zdW1lZAogICAgICAgIGNoYXIgdGVtcFsyXSA9IHtpbnB1dFtpbmRleF0sICdcMCd9OyAgLy8gdHVybiBjaGFyYWN0ZXIgaW50byBzdHJpbmcKICAgICAgICBwdXNoKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1c2ggYWN0dWFsIGNoYXJhY3RlciAobGlrZSAneCcpCiAgICAgICAgaW5kZXgrKzsgICAgICAgIC8vIE1vdmUgaW5wdXQgcG9pbnRlciBhaGVhZCBieSAxCiAKICAgICAgICAvLyBQcmludCBzdGFjayBhZnRlciBzaGlmdAogICAgICAgIHByaW50ZigiU2hpZnQ6ICIpOwogICAgICAgIHByaW50U3RhY2soKTsKIAogICAgICAgIC8vIFJFRFVDRSBzdGVwOiBhcHBseSBhbGwgcG9zc2libGUgcmVkdWN0aW9ucyBhZnRlciBzaGlmdAogICAgICAgIHdoaWxlIChyZWR1Y2UoKSkgewogICAgICAgICAgICBwcmludGYoIlJlZHVjZTogIik7CiAgICAgICAgICAgIHByaW50U3RhY2soKTsKICAgICAgICB9CiAgICB9CiAKICAgIC8vIEZpbmFsIGNoZWNrOiBpbnB1dCBpcyBhY2NlcHRlZCBpZiB0aGUgc3RhY2sgaGFzIGEgc2luZ2xlIHN5bWJvbCAiRSIKICAgIGlmICh0b3AgPT0gMCAmJiBzdHJjbXAoc3RhY2tbMF0sICJFIikgPT0gMCkKICAgICAgICBwcmludGYoIlN0cmluZyBBY2NlcHRlZFxuIik7CiAgICBlbHNlCiAgICAgICAgcHJpbnRmKCJTdHJpbmcgUmVqZWN0ZWRcbiIpOwogCiAgICByZXR1cm4gMDsKfQ==