// Simple Shift Reduce parsing for 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 indx = 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
}
if (top >= 2 &&
strcmp(stack
[top
-2], "E")==0 && strcmp(stack
[top
-1], "*")==0 && {
pop();
pop();
pop();
push("E");
return 1;
}
if (top>=2
&& strcmp(stack
[top
-1],"E")==0 && strcmp(stack
[top
-2],"(")==0 ) {
pop();
pop();
pop();
push("E");
return 1;
}
// Rule 2: 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()
{
while (input[indx])
{
if(input[indx]==' ')
{
indx++;
continue ;
}
char temp[2] = {input[indx], '\0'}; // turn character into string
push(temp); // push actual character (like 'x')
indx ++; // 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;
}
Ly8gU2ltcGxlIFNoaWZ0IFJlZHVjZSBwYXJzaW5nIGZvciBFIOKGkiBFICsgRSB8IGlkCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgovLyBTdGFjayB0byBob2xkIHRva2VucyBhbmQgbm9uLXRlcm1pbmFscyBkdXJpbmcgcGFyc2luZwpjaGFyIHN0YWNrWzEwMF1bMTBdOwppbnQgdG9wID0gLTE7ICAgICAgLy8gUG9pbnRzIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCmludCBpbmR4ID0gMDsgICAgICAgIC8vIElucHV0IHBvaW50ZXIvaW5kZXgKY2hhciBpbnB1dFsxMDBdOyAgIC8vIEhvbGRzIHRoZSBpbnB1dCBzdHJpbmcgKGUuZy4sICJhK2IrYyIpCgovLyBQdXNoIGEgc3ltYm9sICh0b2tlbiBvciBub24tdGVybWluYWwpIG9udG8gdGhlIHN0YWNrCnZvaWQgcHVzaChjb25zdCBjaGFyICpzKQp7CiAgICBzdHJjcHkoc3RhY2tbKyt0b3BdLCBzKTsKfQovLyBQb3AgdGhlIHRvcCBvZiB0aGUgc3RhY2sKdm9pZCBwb3AoKQp7CiAgICB0b3AtLTsKfQovLyBQcmludCBjdXJyZW50IHN0YWNrIGNvbnRlbnRzCnZvaWQgcHJpbnRTdGFjaygpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKSBwcmludGYoIiVzIiwgc3RhY2tbaV0pOwogICAgcHJpbnRmKCJcbiIpOwp9CgoKLy8gVHJ5IHRvIGFwcGx5IGEgcmVkdWN0aW9uIHJ1bGUgdG8gdGhlICB0b3Agb2YgdGhlIHN0YWNrCmludCByZWR1Y2UoKQp7CiAgICAvLyBSdWxlIDE6IEUg4oaSIEUgKyBFCiAgICBpZiAodG9wID49IDIgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0yXSwgIkUiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTFdLCAiKyIpPT0wICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiRSIpPT0wKQogICAgewogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOyAgIC8vIFJlbW92ZSAiRSArIEUiICgzIHBvcHMpCiAgICAgICAgcHVzaCgiRSIpOyAgICAgICAgICAgLy8gUHVzaCAiRSIgb250byB0aGUgc3RhY2sKICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGEgcmVkdWN0aW9uIG9jY3VycmVkCiAgICB9CiAgICAKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTJdLCAiRSIpPT0wICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICIqIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICJFIik9PTApCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfSAKICAgIAogICAgaWYgKHRvcD49MgogICAgJiYgc3RyY21wKHN0YWNrW3RvcF0sIikiKT09MAogICAgJiYgc3RyY21wKHN0YWNrW3RvcC0xXSwiRSIpPT0wCiAgICAmJiBzdHJjbXAoc3RhY2tbdG9wLTJdLCIoIik9PTAgKQogICAgewogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvLyBSdWxlIDI6IEUg4oaSIGlkCiAgICBpZiAodG9wIT0tMSAmJiBzdGFja1t0b3BdWzBdPj0nYScmJnN0YWNrW3RvcF1bMF08PSd6JykKICAgIHsKICAgICAgICBwb3AoKTsgIC8vIFJlbW92ZSAiaWQiICgxIHBvcCkKICAgICAgICBwdXNoKCJFIik7ICAvLyBQdXNoICJFIiBvbnRvIHRoZSBzdGFjawogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOyAvLyBObyByZWR1Y3Rpb24gbWF0Y2hlZAp9CgppbnQgbWFpbigpCnsKICAgIAogICAgZmdldHMoaW5wdXQsMTAwLHN0ZGluKTsgCiAgICBpbnB1dFtzdHJjc3BuKGlucHV0LCJcbiIpXT0wOwogICAgCiAgICB3aGlsZSAoaW5wdXRbaW5keF0pCiAgICB7CiAgICAgICAgCiAgICAgICAgaWYoaW5wdXRbaW5keF09PScgJykKICAgICAgICB7CiAgICAgICAgICAgIGluZHgrKzsKICAgICAgICAgICAgY29udGludWUgOwogICAgICAgIAogICAgICAgIH0KICAgICAgICBjaGFyIHRlbXBbMl0gPSB7aW5wdXRbaW5keF0sICdcMCd9OyAgLy8gdHVybiBjaGFyYWN0ZXIgaW50byBzdHJpbmcKICAgICAgICAKICAgICAgICBwdXNoKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1c2ggYWN0dWFsIGNoYXJhY3RlciAobGlrZSAneCcpCiAgICAgICAgaW5keCArKzsgICAgICAgIC8vIE1vdmUgaW5wdXQgcG9pbnRlciBhaGVhZCBieSAxCgogICAgICAgIC8vIFByaW50IHN0YWNrIGFmdGVyIHNoaWZ0CiAgICAgICAgcHJpbnRmKCJTaGlmdDogIik7CiAgICAgICAgcHJpbnRTdGFjaygpOwoKCiAgICAgICAgLy8gUkVEVUNFIHN0ZXA6IGFwcGx5IGFsbCBwb3NzaWJsZSByZWR1Y3Rpb25zIGFmdGVyIHNoaWZ0CiAgICAgICAgd2hpbGUgKHJlZHVjZSgpKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCJSZWR1Y2U6ICIpOwogICAgICAgICAgICBwcmludFN0YWNrKCk7CgogICAgICAgIH0KICAgIH0KCiAgICAvLyBGaW5hbCBjaGVjazogaW5wdXQgaXMgYWNjZXB0ZWQgaWYgdGhlIHN0YWNrIGhhcyBhIHNpbmdsZSBzeW1ib2wgIkUiCiAgICBpZiAodG9wID09IDAgJiYgc3RyY21wKHN0YWNrWzBdLCAiRSIpPT0wKQogICAgICAgIHByaW50ZigiU3RyaW5nIEFjY2VwdGVkXG4iKTsKICAgIGVsc2UKICAgICAgICBwcmludGYoIlN0cmluZyBSZWplY3RlZFxuIik7CgogICAgcmV0dXJuIDA7Cn0=