#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)
{
strcpy(stack[++top], s);
}
void pop()
{
top--;
}
void printStack()
{
for (int i = 0; i <= top; i++)
printf("%s", stack[i]);
printf("\n");
}
// Reduce
int reduce()
{
if (top != -1 && islower(stack[top][0]))
{
pop();
push("E");
return 1;
}
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;
}
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;
}
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;
}
return 0;
}
int main()
{
fgets(input, sizeof(input), stdin);
while (input[pos])
{
if (input[pos] == ' ' || input[pos] == '\n')
{
pos++;
continue;
}
// SHIFT
char temp[2] = { input[pos], '\0' };
push(temp);
pos++;
printf("Shift: ");
printStack();
// REDUCE
while (reduce())
{
printf("Reduce: ");
printStack();
}
}
while (reduce())
{
printf("Reduce: ");
printStack();
}
if (top == 0 && strcmp(stack[0], "E") == 0)
printf("String Accepted\n");
else
printf("String Rejected\n");
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKY2hhciBzdGFja1sxMDBdWzEwXTsKaW50IHRvcCA9IC0xOwppbnQgcG9zID0gMDsgICAKY2hhciBpbnB1dFsxMDBdOwoKCnZvaWQgcHVzaChjb25zdCBjaGFyKiBzKQp7CiAgc3RyY3B5KHN0YWNrWysrdG9wXSwgcyk7Cn0KCgp2b2lkIHBvcCgpCnsKICAgIHRvcC0tOwp9CgoKdm9pZCBwcmludFN0YWNrKCkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG9wOyBpKyspCiAgICAgICAgcHJpbnRmKCIlcyIsIHN0YWNrW2ldKTsKICAgIHByaW50ZigiXG4iKTsKfQoKLy8gUmVkdWNlCmludCByZWR1Y2UoKQp7CiAgICAgICBpZiAodG9wICE9IC0xICYmIGlzbG93ZXIoc3RhY2tbdG9wXVswXSkpCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKIAogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcCAtIDJdLCAiKCIpID09IDAgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wIC0gMV0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiKSIpID09IDApCiAgICB7CiAgICAgICAgcG9wKCk7IHBvcCgpOyBwb3AoKTsKICAgICAgICBwdXNoKCJFIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AgLSAyXSwgIkUiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcCAtIDFdLCAiKiIpID09IDAgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKSA9PSAwKQogICAgewogICAgICAgIHBvcCgpOyBwb3AoKTsgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKCiAgICBpZiAodG9wID49IDIgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wIC0gMl0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AgLSAxXSwgIisiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICJFIikgPT0gMCkKICAgIHsKICAgICAgICBwb3AoKTsgcG9wKCk7IHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oKQp7CiAgICAKICAgIGZnZXRzKGlucHV0LCBzaXplb2YoaW5wdXQpLCBzdGRpbik7CgogICAgd2hpbGUgKGlucHV0W3Bvc10pCiAgICB7CiAgICAgICAgCiAgICAgICAgaWYgKGlucHV0W3Bvc10gPT0gJyAnIHx8IGlucHV0W3Bvc10gPT0gJ1xuJykKICAgICAgICB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIFNISUZUCiAgICAgICAgY2hhciB0ZW1wWzJdID0geyBpbnB1dFtwb3NdLCAnXDAnIH07CiAgICAgICAgcHVzaCh0ZW1wKTsKICAgICAgICBwb3MrKzsKCiAgICAgICAgcHJpbnRmKCJTaGlmdDogIik7CiAgICAgICAgcHJpbnRTdGFjaygpOwoKICAgICAgICAvLyBSRURVQ0UKICAgICAgICB3aGlsZSAocmVkdWNlKCkpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIlJlZHVjZTogIik7CiAgICAgICAgICAgIHByaW50U3RhY2soKTsKICAgICAgICB9CiAgICB9CgogICAgCiAgICB3aGlsZSAocmVkdWNlKCkpCiAgICB7CiAgICAgICAgcHJpbnRmKCJSZWR1Y2U6ICIpOwogICAgICAgIHByaW50U3RhY2soKTsKICAgIH0KCiAgIAogICAgaWYgKHRvcCA9PSAwICYmIHN0cmNtcChzdGFja1swXSwgIkUiKSA9PSAwKQogICAgICAgIHByaW50ZigiU3RyaW5nIEFjY2VwdGVkXG4iKTsKICAgIGVsc2UKICAgICAgICBwcmludGYoIlN0cmluZyBSZWplY3RlZFxuIik7CgogICAgcmV0dXJuIDA7Cn0=