#include <stdio.h>
#include <string.h>
#include <ctype.h>
char stack[100][10];
int top = -1;
int index = 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 && strcmp(stack
[top
], "E") == 0) { pop(); pop(); pop();
push("E");
return 1;
}
// Rule 2: 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 3: 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;
}
// Rule 4: E -> id
if(top!=-1 && stack[top][0]>= 'a' && stack[top][0] <= 'z') {
pop();
push("E");
return 1;
}
return 0; // No reduction applied
}
int main() {
fgets(input
, sizeof(input
), stdin
); // allow input with spaces
while(input[index]) {
index++; // skip whitespace
continue;
}
char temp[2] = {input[index], '\0'};
push(temp);
index++;
printStack();
while(reduce()) {
printStack();
}
}
if(top
== 0 && strcmp(stack
[0], "E") == 0) else
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpjaGFyIHN0YWNrWzEwMF1bMTBdOwppbnQgdG9wID0gLTE7CmludCBpbmRleCA9IDA7CmNoYXIgaW5wdXRbMTAwXTsKCnZvaWQgcHVzaChjb25zdCBjaGFyICpzKSB7CiAgICBzdHJjcHkoc3RhY2tbKyt0b3BdLCBzKTsKfQoKdm9pZCBwb3AoKSB7CiAgICB0b3AtLTsKfQoKdm9pZCBwcmludFN0YWNrKCkgewogICAgZm9yKGludCBpID0gMDsgaSA8PSB0b3A7IGkrKykgcHJpbnRmKCIlcyIsIHN0YWNrW2ldKTsKICAgIHByaW50ZigiXG4iKTsKfQoKaW50IHJlZHVjZSgpIHsKICAgIC8vIFJ1bGUgMTogRSAtPiBFICsgRQogICAgaWYodG9wID49IDIgJiYKICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIikgPT0gMCAmJgogICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIisiKSA9PSAwICYmCiAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKSA9PSAwKSB7CiAgICAgICAgcG9wKCk7IHBvcCgpOyBwb3AoKTsKICAgICAgICBwdXNoKCJFIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgLy8gUnVsZSAyOiBFIC0+IEUgKiBFCiAgICBpZih0b3AgPj0gMiAmJgogICAgICAgc3RyY21wKHN0YWNrW3RvcC0yXSwgIkUiKSA9PSAwICYmCiAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTFdLCAiKiIpID09IDAgJiYKICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiRSIpID09IDApIHsKICAgICAgICBwb3AoKTsgcG9wKCk7IHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvLyBSdWxlIDM6IEUgLT4gKCBFICkKICAgIGlmKHRvcCA+PSAyICYmCiAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTJdLCAiKCIpID09IDAgJiYKICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICJFIikgPT0gMCAmJgogICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICIpIikgPT0gMCkgewogICAgICAgIHBvcCgpOyBwb3AoKTsgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIFJ1bGUgNDogRSAtPiBpZCAKICAgIGlmKHRvcCE9LTEgJiYgc3RhY2tbdG9wXVswXT49ICdhJyAmJiBzdGFja1t0b3BdWzBdIDw9ICd6JykgewogICAgICAgIHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsgLy8gTm8gcmVkdWN0aW9uIGFwcGxpZWQKfQoKaW50IG1haW4oKSB7CiAgICBmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pOyAvLyBhbGxvdyBpbnB1dCB3aXRoIHNwYWNlcwoKICAgIHdoaWxlKGlucHV0W2luZGV4XSkgewogICAgICAgIGlmKGlzc3BhY2UoaW5wdXRbaW5kZXhdKSkgewogICAgICAgICAgICBpbmRleCsrOyAvLyBza2lwIHdoaXRlc3BhY2UKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBjaGFyIHRlbXBbMl0gPSB7aW5wdXRbaW5kZXhdLCAnXDAnfTsKICAgICAgICBwdXNoKHRlbXApOwogICAgICAgIGluZGV4Kys7CgogICAgICAgIHByaW50ZigiU2hpZnQ6ICIpOwogICAgICAgIHByaW50U3RhY2soKTsKCiAgICAgICAgd2hpbGUocmVkdWNlKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJSZWR1Y2U6ICIpOwogICAgICAgICAgICBwcmludFN0YWNrKCk7CiAgICAgICAgfQogICAgfQoKICAgIGlmKHRvcCA9PSAwICYmIHN0cmNtcChzdGFja1swXSwgIkUiKSA9PSAwKQogICAgICAgIHByaW50Zigic3RyaW5nIEFjY2VwdGVkXG4iKTsKICAgIGVsc2UKICAgICAgICBwcmludGYoInN0cmluZyBSZWplY3RlZFxuIik7CgogICAgcmV0dXJuIDA7Cn0K