#include <stdio.h>
#include <string.h>
#include <ctype.h>
char stack[100][10];
int top = -1;
int pos = 0;
char input[100];
void push(const char *s)
{
}
void pop()
{
top--;
}
void printStack()
{
for (int i
= 0; i
<= top
; i
++) printf("%s", stack
[i
]); }
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 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 1: E → (E)
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; // Indicate that a reduction occurred
}
// 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;
}
int main()
{
fgets(input
, sizeof(input
), stdin
); printf("===============================\n");
if (len > 0 && input[len - 1] == '\n') {
input[len - 1] = '\0';
}
while (input[pos])
{
if (input[pos] == ' ' || input[pos] == '\0'){
pos ++;
continue;
}
char temp[2] = {input[pos], '\0'};
push(temp);
pos ++;
printStack();
while (reduce())
{
printStack();
}
}
// Final check: input is accepted if the stack has a single symbol "E"
if (top
== 0 && strcmp(stack
[0], "E")==0){ printf("===============================\n"); printf("==============================="); }
else{
printf("===============================\n"); printf("==============================="); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpjaGFyIHN0YWNrWzEwMF1bMTBdOwppbnQgdG9wID0gLTE7CmludCBwb3MgPSAwOwpjaGFyIGlucHV0WzEwMF07Cgp2b2lkIHB1c2goY29uc3QgY2hhciAqcykKewogICAgc3RyY3B5KHN0YWNrWysrdG9wXSwgcyk7Cn0KCnZvaWQgcG9wKCkKewogICAgdG9wLS07Cn0KCnZvaWQgcHJpbnRTdGFjaygpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKSBwcmludGYoIiVzIiwgc3RhY2tbaV0pOwogICAgcHJpbnRmKCJcbiIpOwp9CgppbnQgcmVkdWNlKCkKewogICAgLy8gUnVsZSAxOiBFIOKGkiBFICsgRQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIik9PTAgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIisiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKT09MCkKICAgIHsKICAgICAgICBwb3AoKTsKICAgICAgICBwb3AoKTsKICAgICAgICBwb3AoKTsgICAvLyBSZW1vdmUgIkUgKyBFIiAoMyBwb3BzKQogICAgICAgIHB1c2goIkUiKTsgICAgICAgICAgIC8vIFB1c2ggIkUiIG9udG8gdGhlIHN0YWNrCiAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBhIHJlZHVjdGlvbiBvY2N1cnJlZAogICAgfQogICAgCiAgICAvLyBSdWxlIDE6IEUg4oaSIEUgKiBFCiAgICBpZiAodG9wID49IDIgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0yXSwgIkUiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTFdLCAiKiIpPT0wICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiRSIpPT0wKQogICAgewogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOyAgIC8vIFJlbW92ZSAiRSAqIEUiICgzIHBvcHMpCiAgICAgICAgcHVzaCgiRSIpOyAgICAgICAgICAgLy8gUHVzaCAiRSIgb250byB0aGUgc3RhY2sKICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IGEgcmVkdWN0aW9uIG9jY3VycmVkCiAgICB9CiAgICAKICAgIC8vIFJ1bGUgMTogRSDihpIgKEUpCiAgICBpZiAodG9wID49IDIgJiYKICAgICAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0yXSwgIigiKT09MCAmJgogICAgICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTFdLCAiRSIpPT0wICYmCiAgICAgICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiKSIpPT0wKQogICAgewogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOyAgIC8vIFJlbW92ZSAiKEUpIiAoMyBwb3BzKQogICAgICAgIHB1c2goIkUiKTsgICAgICAgICAgIC8vIFB1c2ggIkUiIG9udG8gdGhlIHN0YWNrCiAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCBhIHJlZHVjdGlvbiBvY2N1cnJlZAogICAgfQogICAgCiAgICAvLyBSdWxlIDI6IEUg4oaSIGlkCiAgICBpZiAodG9wIT0tMSAmJiBzdGFja1t0b3BdWzBdPj0nYScmJnN0YWNrW3RvcF1bMF08PSd6JykKICAgIHsKICAgICAgICBwb3AoKTsgIC8vIFJlbW92ZSAiaWQiICgxIHBvcCkKICAgICAgICBwdXNoKCJFIik7ICAvLyBQdXNoICJFIiBvbnRvIHRoZSBzdGFjawogICAgICAgIHJldHVybiAxOwogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oKQp7CiAgICBmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pOwogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKCiAgICBzaXplX3QgbGVuID0gc3RybGVuKGlucHV0KTsKCiAgICBpZiAobGVuID4gMCAmJiBpbnB1dFtsZW4gLSAxXSA9PSAnXG4nKSB7CiAgICAgICAgaW5wdXRbbGVuIC0gMV0gPSAnXDAnOwogICAgfQoKICAgIHdoaWxlIChpbnB1dFtwb3NdKQogICAgewogICAgICAgIAogICAgICAgIGlmIChpbnB1dFtwb3NdID09ICcgJyB8fCBpbnB1dFtwb3NdID09ICdcMCcpewogICAgICAgICAgICBwb3MgKys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgY2hhciB0ZW1wWzJdID0ge2lucHV0W3Bvc10sICdcMCd9OwogICAgICAgIHB1c2godGVtcCk7CiAgICAgICAgcG9zICsrOyAKICAgICAgICAKICAgICAgICBwcmludGYoIlNoaWZ0OiAiKTsKICAgICAgICBwcmludFN0YWNrKCk7CgogICAgICAgIHdoaWxlIChyZWR1Y2UoKSkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiUmVkdWNlOiAiKTsKICAgICAgICAgICAgcHJpbnRTdGFjaygpOwoKICAgICAgICB9CiAgICB9CgogICAgLy8gRmluYWwgY2hlY2s6IGlucHV0IGlzIGFjY2VwdGVkIGlmIHRoZSBzdGFjayBoYXMgYSBzaW5nbGUgc3ltYm9sICJFIgogICAgaWYgKHRvcCA9PSAwICYmIHN0cmNtcChzdGFja1swXSwgIkUiKT09MCl7CiAgICAgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKICAgICAgICBwcmludGYoIlN0cmluZyBBY2NlcHRlZFxuIik7CiAgICAgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CiAgICB9CiAgICBlbHNlewogICAgICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAgICAgICAgcHJpbnRmKCJTdHJpbmcgUmVqZWN0ZWRcbiIpOwogICAgICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==