// 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 index = 0; // Input pointer/index
char input[100]; // Holds the input string (e.g., "a+b+c")
void removeSpaces(char *str)
{
int i = 0, j = 0;
while (str[i] != '\0')
{
if (!isspace(str
[i
])) // keep only NON-whitespace {
str[j] = str[i];
j++;
}
i++;
}
str[j] = '\0'; // terminate new string
}
// 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
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 3: E → (E)
if (top >= 2 &&
strcmp(stack
[top
-2], "(")==0 && strcmp(stack
[top
-1], "E")==0 && {
pop();
pop();
pop(); // Remove "E + E" (3 pops)
push("E"); // Push "E" onto the stack
return 1; // Indicate that a reduction occurred
}
// 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 (e.g., a+b+c)
fgets(input
, sizeof(input
), stdin
); input
[strcspn(input
, "\n")] = '\0'; removeSpaces(input);
//E+a
// Main parsing loop: continue until input ends and no more reductions are possible
while (input[index])
{
// SHIFT step: if input is not yet fully consumed
// Check for "id" token
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;
}
Ly8gU2ltcGxlIFNoaWZ0IFJlZHVjZSBwYXJzaW5nIGZvciBFIOKGkiBFICsgRSB8IGlkCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgovLyBTdGFjayB0byBob2xkIHRva2VucyBhbmQgbm9uLXRlcm1pbmFscyBkdXJpbmcgcGFyc2luZwpjaGFyIHN0YWNrWzEwMF1bMTBdOwppbnQgdG9wID0gLTE7ICAgICAgLy8gUG9pbnRzIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCmludCBpbmRleCA9IDA7ICAgICAgICAvLyBJbnB1dCBwb2ludGVyL2luZGV4CmNoYXIgaW5wdXRbMTAwXTsgICAvLyBIb2xkcyB0aGUgaW5wdXQgc3RyaW5nIChlLmcuLCAiYStiK2MiKQoKCnZvaWQgcmVtb3ZlU3BhY2VzKGNoYXIgKnN0cikKewogICAgaW50IGkgPSAwLCBqID0gMDsKCiAgICB3aGlsZSAoc3RyW2ldICE9ICdcMCcpCiAgICB7CiAgICAgICAgaWYgKCFpc3NwYWNlKHN0cltpXSkpICAgLy8ga2VlcCBvbmx5IE5PTi13aGl0ZXNwYWNlCiAgICAgICAgewogICAgICAgICAgICBzdHJbal0gPSBzdHJbaV07CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgfQogICAgc3RyW2pdID0gJ1wwJzsgLy8gdGVybWluYXRlIG5ldyBzdHJpbmcKfQoKLy8gUHVzaCBhIHN5bWJvbCAodG9rZW4gb3Igbm9uLXRlcm1pbmFsKSBvbnRvIHRoZSBzdGFjawp2b2lkIHB1c2goY29uc3QgY2hhciAqcykKewogICAgc3RyY3B5KHN0YWNrWysrdG9wXSwgcyk7Cn0KLy8gUG9wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCnZvaWQgcG9wKCkKewogICAgdG9wLS07Cn0KLy8gUHJpbnQgY3VycmVudCBzdGFjayBjb250ZW50cwp2b2lkIHByaW50U3RhY2soKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSB0b3A7IGkrKykgcHJpbnRmKCIlcyIsIHN0YWNrW2ldKTsKICAgIHByaW50ZigiXG4iKTsKfQoKCi8vIFRyeSB0byBhcHBseSBhIHJlZHVjdGlvbiBydWxlIHRvIHRoZSAgdG9wIG9mIHRoZSBzdGFjawppbnQgcmVkdWNlKCkKewogICAgLy8gUnVsZSAxOiBFIOKGkiBFICsgRQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIisiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKT09MCkKICAgIHsKICAgICAgICBwb3AoKTsKICAgICAgICBwb3AoKTsKICAgICAgICBwb3AoKTsgICAvLyBSZW1vdmUgIkUgKyBFIiAoMyBwb3BzKQogICAgICAgIHB1c2goIkUiKTsgICAgICAgICAgIC8vIFB1c2ggIkUiIG9udG8gdGhlIHN0YWNrCiAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBhIHJlZHVjdGlvbiBvY2N1cnJlZAogICAgfQoKICAgIC8vIFJ1bGUgMjogRSDihpIgRSAqIEUKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTJdLCAiRSIpPT0wICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICIqIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICJFIik9PTApCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7ICAgLy8gUmVtb3ZlICJFICsgRSIgKDMgcG9wcykKICAgICAgICBwdXNoKCJFIik7ICAgICAgICAgICAvLyBQdXNoICJFIiBvbnRvIHRoZSBzdGFjawogICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgYSByZWR1Y3Rpb24gb2NjdXJyZWQKICAgIH0KCiAgICAvLyBSdWxlIDM6IEUg4oaSIChFKQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICIoIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIkUiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIikiKT09MCkKICAgIHsKICAgICAgICBwb3AoKTsKICAgICAgICBwb3AoKTsKICAgICAgICBwb3AoKTsgICAvLyBSZW1vdmUgIkUgKyBFIiAoMyBwb3BzKQogICAgICAgIHB1c2goIkUiKTsgICAgICAgICAgIC8vIFB1c2ggIkUiIG9udG8gdGhlIHN0YWNrCiAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBhIHJlZHVjdGlvbiBvY2N1cnJlZAogICAgfQoKICAgIC8vIFJ1bGUgNDogRSDihpIgaWQKICAgIGlmICh0b3AhPS0xICYmIHN0YWNrW3RvcF1bMF0+PSdhJyYmc3RhY2tbdG9wXVswXTw9J3onKQogICAgewogICAgICAgIHBvcCgpOyAgLy8gUmVtb3ZlICJpZCIgKDEgcG9wKQogICAgICAgIHB1c2goIkUiKTsgIC8vIFB1c2ggIkUiIG9udG8gdGhlIHN0YWNrCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7IC8vIE5vIHJlZHVjdGlvbiBtYXRjaGVkCn0KCmludCBtYWluKCkKewogICAgLy8gUmVhZCBpbnB1dCBzdHJpbmcgKGUuZy4sIGErYitjKQogICAgZmdldHMoaW5wdXQsIHNpemVvZihpbnB1dCksIHN0ZGluKTsKICAgIGlucHV0W3N0cmNzcG4oaW5wdXQsICJcbiIpXSA9ICdcMCc7CiAgICByZW1vdmVTcGFjZXMoaW5wdXQpOwoKICAgIC8vRSthCiAgICAvLyBNYWluIHBhcnNpbmcgbG9vcDogY29udGludWUgdW50aWwgaW5wdXQgZW5kcyBhbmQgbm8gbW9yZSByZWR1Y3Rpb25zIGFyZSBwb3NzaWJsZQogICAgd2hpbGUgKGlucHV0W2luZGV4XSkKICAgIHsKICAgICAgICAvLyBTSElGVCBzdGVwOiBpZiBpbnB1dCBpcyBub3QgeWV0IGZ1bGx5IGNvbnN1bWVkCiAgICAgICAgLy8gQ2hlY2sgZm9yICJpZCIgdG9rZW4KICAgICAgICBjaGFyIHRlbXBbMl0gPSB7aW5wdXRbaW5kZXhdLCAnXDAnfTsgIC8vIHR1cm4gY2hhcmFjdGVyIGludG8gc3RyaW5nCiAgICAgICAgcHVzaCh0ZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXNoIGFjdHVhbCBjaGFyYWN0ZXIgKGxpa2UgJ3gnKQogICAgICAgIGluZGV4ICsrOyAgICAgICAgLy8gTW92ZSBpbnB1dCBwb2ludGVyIGFoZWFkIGJ5IDEKCiAgICAgICAgLy8gUHJpbnQgc3RhY2sgYWZ0ZXIgc2hpZnQKICAgICAgICBwcmludGYoIlNoaWZ0OiAiKTsKICAgICAgICBwcmludFN0YWNrKCk7CgoKICAgICAgICAvLyBSRURVQ0Ugc3RlcDogYXBwbHkgYWxsIHBvc3NpYmxlIHJlZHVjdGlvbnMgYWZ0ZXIgc2hpZnQKICAgICAgICB3aGlsZSAocmVkdWNlKCkpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIlJlZHVjZTogIik7CiAgICAgICAgICAgIHByaW50U3RhY2soKTsKCiAgICAgICAgfQogICAgfQoKICAgIC8vIEZpbmFsIGNoZWNrOiBpbnB1dCBpcyBhY2NlcHRlZCBpZiB0aGUgc3RhY2sgaGFzIGEgc2luZ2xlIHN5bWJvbCAiRSIKICAgIGlmICh0b3AgPT0gMCAmJiBzdHJjbXAoc3RhY2tbMF0sICJFIik9PTApCiAgICAgICAgcHJpbnRmKCJTdHJpbmcgQWNjZXB0ZWRcbiIpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiU3RyaW5nIFJlamVjdGVkXG4iKTsKCiAgICByZXR1cm4gMDsKfQ==