// 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(); // Remove "E + E" (3 pops)
push("E"); // Push "E" onto the stack
return 1; // Indicate that a reduction occurred
}
// Rule 2: E → E * E (Added for multiplication)
if (top >= 2 &&
strcmp(stack
[top
-2], "E")==0 && strcmp(stack
[top
-1], "*")==0 && {
pop(); pop(); pop(); // Remove "E * E" (3 pops)
push("E"); // Push "E" onto the stack
return 1;
}
// Rule 3: E → (E) (Added for parentheses)
if (top >= 2 &&
strcmp(stack
[top
-2], "(")==0 && strcmp(stack
[top
-1], "E")==0 && {
pop(); pop(); pop(); // Remove "( E )" (3 pops)
push("E"); // Push "E" onto the stack
return 1;
}
// Rule 4: E → id
if (top!=-1 && stack[top][0]>='a'&&stack[top][0]<='z')
{
pop(); // Remove "id" (1 pop)
push("E"); // Push "E" onto the stack
return 1;
}
return 0; // No reduction matched
}
int main()
{
// Read input string allowing spaces until newline
// Main parsing loop: continue until input ends and no more reductions are possible
while (input[i])
{
// Ignore whitespaces (spaces, tabs, etc.)
i++;
continue;
}
// SHIFT step: if input is not yet fully consumed
char temp[2] = {input[i], '\0'}; // turn character into string
push(temp); // push actual character (like 'x', '+', '*', '(')
i++; // 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+CgovLyBTdGFjayB0byBob2xkIHRva2VucyBhbmQgbm9uLXRlcm1pbmFscyBkdXJpbmcgcGFyc2luZwpjaGFyIHN0YWNrWzEwMF1bMTBdOwppbnQgdG9wID0gLTE7IC8vIFBvaW50cyB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawppbnQgaSA9IDA7IC8vIElucHV0IHBvaW50ZXIvaW5kZXgKY2hhciBpbnB1dFsxMDBdOyAvLyBIb2xkcyB0aGUgaW5wdXQgc3RyaW5nIChlLmcuLCAiYSArIGIgKiBjIikKCi8vIFB1c2ggYSBzeW1ib2wgKHRva2VuIG9yIG5vbi10ZXJtaW5hbCkgb250byB0aGUgc3RhY2sKdm9pZCBwdXNoKGNvbnN0IGNoYXIgKnMpCnsKICAgIHN0cmNweShzdGFja1srK3RvcF0sIHMpOwp9CgovLyBQb3AgdGhlIHRvcCBvZiB0aGUgc3RhY2sKdm9pZCBwb3AoKQp7CiAgICB0b3AtLTsKfQoKLy8gUHJpbnQgY3VycmVudCBzdGFjayBjb250ZW50cwp2b2lkIHByaW50U3RhY2soKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSB0b3A7IGkrKykgcHJpbnRmKCIlcyIsIHN0YWNrW2ldKTsKICAgIHByaW50ZigiXG4iKTsKfQoKLy8gVHJ5IHRvIGFwcGx5IGEgcmVkdWN0aW9uIHJ1bGUgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKaW50IHJlZHVjZSgpCnsKICAgIC8vIFJ1bGUgMTogRSDihpIgRSArIEUKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTJdLCAiRSIpPT0wICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICIrIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICJFIik9PTApCiAgICB7CiAgICAgICAgcG9wKCk7IHBvcCgpOyBwb3AoKTsgLy8gUmVtb3ZlICJFICsgRSIgKDMgcG9wcykKICAgICAgICBwdXNoKCJFIik7IC8vIFB1c2ggIkUiIG9udG8gdGhlIHN0YWNrCiAgICAgICAgcmV0dXJuIDE7IC8vIEluZGljYXRlIHRoYXQgYSByZWR1Y3Rpb24gb2NjdXJyZWQKICAgIH0KICAgIAogICAgLy8gUnVsZSAyOiBFIOKGkiBFICogRSAoQWRkZWQgZm9yIG11bHRpcGxpY2F0aW9uKQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIioiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKT09MCkKICAgIHsKICAgICAgICBwb3AoKTsgcG9wKCk7IHBvcCgpOyAvLyBSZW1vdmUgIkUgKiBFIiAoMyBwb3BzKQogICAgICAgIHB1c2goIkUiKTsgLy8gUHVzaCAiRSIgb250byB0aGUgc3RhY2sKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIAogICAgLy8gUnVsZSAzOiBFIOKGkiAoRSkgKEFkZGVkIGZvciBwYXJlbnRoZXNlcykKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTJdLCAiKCIpPT0wICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICJFIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICIpIik9PTApCiAgICB7CiAgICAgICAgcG9wKCk7IHBvcCgpOyBwb3AoKTsgLy8gUmVtb3ZlICIoIEUgKSIgKDMgcG9wcykKICAgICAgICBwdXNoKCJFIik7IC8vIFB1c2ggIkUiIG9udG8gdGhlIHN0YWNrCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAKICAgIC8vIFJ1bGUgNDogRSDihpIgaWQKICAgIGlmICh0b3AhPS0xICYmIHN0YWNrW3RvcF1bMF0+PSdhJyYmc3RhY2tbdG9wXVswXTw9J3onKQogICAgewogICAgICAgIHBvcCgpOyAvLyBSZW1vdmUgImlkIiAoMSBwb3ApCiAgICAgICAgcHVzaCgiRSIpOyAvLyBQdXNoICJFIiBvbnRvIHRoZSBzdGFjawogICAgICAgIHJldHVybiAxOwogICAgfQogICAgCiAgICByZXR1cm4gMDsgLy8gTm8gcmVkdWN0aW9uIG1hdGNoZWQKfQoKaW50IG1haW4oKQp7CiAgICAvLyBSZWFkIGlucHV0IHN0cmluZyBhbGxvd2luZyBzcGFjZXMgdW50aWwgbmV3bGluZQogICAgc2NhbmYoIiVbXlxuXSIsIGlucHV0KTsgCiAgICAKICAgIC8vIE1haW4gcGFyc2luZyBsb29wOiBjb250aW51ZSB1bnRpbCBpbnB1dCBlbmRzIGFuZCBubyBtb3JlIHJlZHVjdGlvbnMgYXJlIHBvc3NpYmxlCiAgICB3aGlsZSAoaW5wdXRbaV0pCiAgICB7CiAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2VzIChzcGFjZXMsIHRhYnMsIGV0Yy4pCiAgICAgICAgaWYgKGlzc3BhY2UoaW5wdXRbaV0pKSB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvLyBTSElGVCBzdGVwOiBpZiBpbnB1dCBpcyBub3QgeWV0IGZ1bGx5IGNvbnN1bWVkCiAgICAgICAgY2hhciB0ZW1wWzJdID0ge2lucHV0W2ldLCAnXDAnfTsgLy8gdHVybiBjaGFyYWN0ZXIgaW50byBzdHJpbmcKICAgICAgICBwdXNoKHRlbXApOyAvLyBwdXNoIGFjdHVhbCBjaGFyYWN0ZXIgKGxpa2UgJ3gnLCAnKycsICcqJywgJygnKQogICAgICAgIGkrKzsgLy8gTW92ZSBpbnB1dCBwb2ludGVyIGFoZWFkIGJ5IDEKICAgICAgICAKICAgICAgICAvLyBQcmludCBzdGFjayBhZnRlciBzaGlmdAogICAgICAgIHByaW50ZigiU2hpZnQ6ICIpOwogICAgICAgIHByaW50U3RhY2soKTsKICAgICAgICAKICAgICAgICAvLyBSRURVQ0Ugc3RlcDogYXBwbHkgYWxsIHBvc3NpYmxlIHJlZHVjdGlvbnMgYWZ0ZXIgc2hpZnQKICAgICAgICB3aGlsZSAocmVkdWNlKCkpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIlJlZHVjZTogIik7CiAgICAgICAgICAgIHByaW50U3RhY2soKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vIEZpbmFsIGNoZWNrOiBpbnB1dCBpcyBhY2NlcHRlZCBpZiB0aGUgc3RhY2sgaGFzIGEgc2luZ2xlIHN5bWJvbCAiRSIKICAgIGlmICh0b3AgPT0gMCAmJiBzdHJjbXAoc3RhY2tbMF0sICJFIik9PTApCiAgICAgICAgcHJpbnRmKCJTdHJpbmcgQWNjZXB0ZWRcbiIpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiU3RyaW5nIFJlamVjdGVkXG4iKTsKICAgICAgICAKICAgIHJldHVybiAwOwp9