%{
#include <stdio.h>
#include <stdlib.h>
enum ActionType { SHIFT, REDUCE, ACCEPT, ERROR };
typedef struct {
enum ActionType type;
int value;
} TableEntry;
// Columns: i=0, + =1, * =2, ( =3, )=4, $=5, E=6, T=7, F=8
TableEntry parsingTable[12][9] = {
// i + * ( ) $ E T F
{{SHIFT,5}, {ERROR,0}, {ERROR,0}, {SHIFT,4}, {ERROR,0}, {ERROR,0}, {SHIFT,1}, {SHIFT,2}, {SHIFT,3}}, // 0
{{ERROR,0}, {SHIFT,6}, {ERROR,0}, {ERROR,0}, {ERROR,0}, {ACCEPT,0}, {ERROR,0}, {ERROR,0}, {ERROR,0}}, // 1
{{ERROR,0}, {REDUCE,2}, {SHIFT,7}, {ERROR,0}, {REDUCE,2}, {REDUCE,2}, {ERROR,0}, {ERROR,0}, {ERROR,0}}, // 2
{{ERROR,0}, {REDUCE,4}, {REDUCE,4}, {ERROR,0}, {REDUCE,4}, {REDUCE,4}, {ERROR,0}, {ERROR,0}, {ERROR,0}}, // 3
{{SHIFT,5}, {ERROR,0}, {ERROR,0}, {SHIFT,4}, {ERROR,0}, {ERROR,0}, {SHIFT,8}, {SHIFT,2}, {SHIFT,3}}, // 4
{{ERROR,0}, {REDUCE,6}, {REDUCE,6}, {ERROR,0}, {REDUCE,6}, {REDUCE,6}, {ERROR,0}, {ERROR,0}, {ERROR,0}}, // 5
{{SHIFT,5}, {ERROR,0}, {ERROR,0}, {SHIFT,4}, {ERROR,0}, {ERROR,0}, {ERROR,0}, {SHIFT,9}, {SHIFT,3}}, // 6
{{SHIFT,5}, {ERROR,0}, {ERROR,0}, {SHIFT,4}, {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0}, {SHIFT,10}}, // 7
{{ERROR,0}, {SHIFT,6}, {ERROR,0}, {ERROR,0}, {SHIFT,11}, {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0}}, // 8
{{ERROR,0}, {REDUCE,1}, {SHIFT,7}, {ERROR,0}, {REDUCE,1}, {REDUCE,1}, {ERROR,0}, {ERROR,0}, {ERROR,0}}, // 9
{{ERROR,0}, {REDUCE,3}, {REDUCE,3}, {ERROR,0}, {REDUCE,3}, {REDUCE,3}, {ERROR,0}, {ERROR,0}, {ERROR,0}}, //10
{{ERROR,0}, {REDUCE,5}, {REDUCE,5}, {ERROR,0}, {REDUCE,5}, {REDUCE,5}, {ERROR,0}, {ERROR,0}, {ERROR,0}} //11
};
// Productions:
// 1. E -> E + T
// 2. E -> T
// 3. T -> T * F
// 4. T -> F
// 5. F -> (E)
// 6. F -> id
char* productions[] = {
"E -> E + T", //1
"E -> T", //2
"T -> T * F", //3
"T -> F", //4
"F -> ( E )", //5
"F -> id" //6
};
int productionLengths[] = {3, 1, 3, 1, 3, 1};
int productionLHS[] = {6, 6, 7, 7, 8, 8}; // E=6, T=7, F=8
int stack[100];
int top = -1;
void push(int state) {
stack[++top] = state;
}
int pop() {
return stack[top--];
}
void printGrammar() {
printf
("Given Grammar
is:\n"
); printf("E -> E + T | T\n");
printf("T -> T * F | F\n");
printf("F -> (E) | id\n\n");
}
%}
%option noyywrap
%%
. ;
%%
int main() {
printGrammar();
char input[100];
printf("Enter input string (e.g., i+i*i$): ");
scanf("%s", input);
int inputPtr = 0;
push(0);
printf("\nStack\t\tInput\t\tAction\n");
while (1) {
int currentState = stack[top];
char currentInputSymbol = input[inputPtr];
int col = -1;
switch (currentInputSymbol) {
case 'i': col = 0; break;
case '+': col = 1; break;
case '*': col = 2; break;
case '(': col = 3; break;
case ')': col = 4; break;
case '$': col = 5; break;
default:
printf("Error: Invalid symbol '%c'\n", currentInputSymbol);
return 1;
}
TableEntry action = parsingTable[currentState][col];
// Print stack
printf("State ");
for (int i = 0; i <= top; i++) {
printf("%d ", stack[i]);
}
// Print input
printf("\t%s\t", &input[inputPtr]);
// Take action
switch (action.type) {
case SHIFT:
printf("\tSHIFT %d\n", action.value);
push(action.value);
inputPtr++;
break;
case REDUCE: {
int prodNum = action.value;
printf("\tREDUCE by %s\n", productions[prodNum - 1]);
for (int i = 0; i < productionLengths[prodNum - 1]; i++) {
pop();
}
int stateAfterPop = stack[top];
int gotoCol = productionLHS[prodNum - 1];
TableEntry gotoEntry = parsingTable[stateAfterPop][gotoCol];
if (gotoEntry.type != SHIFT) {
printf("ERROR: Invalid goto after reduction\n");
return 1;
}
push(gotoEntry.value);
break;
}
case ACCEPT:
printf("\tACCEPT\n");
return 0;
case ERROR:
printf("\tERROR\n");
return 1;
}
}
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmVudW0gQWN0aW9uVHlwZSB7IFNISUZULCBSRURVQ0UsIEFDQ0VQVCwgRVJST1IgfTsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGVudW0gQWN0aW9uVHlwZSB0eXBlOwogICAgaW50IHZhbHVlOwp9IFRhYmxlRW50cnk7CgovLyBDb2x1bW5zOiBpPTAsICsgPTEsICogPTIsICggPTMsICk9NCwgJD01LCBFPTYsIFQ9NywgRj04ClRhYmxlRW50cnkgcGFyc2luZ1RhYmxlWzEyXVs5XSA9IHsKICAgIC8vIGkgICAgICAgICArICAgICAgICAgKiAgICAgICAgICggICAgICAgICApICAgICAgICAgJCAgICAgICAgIEUgICAgICAgICBUICAgICAgICAgRgogICAge3tTSElGVCw1fSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtTSElGVCw0fSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtTSElGVCwxfSwge1NISUZULDJ9LCB7U0hJRlQsM319LCAvLyAwCiAgICB7e0VSUk9SLDB9LCB7U0hJRlQsNn0sIHtFUlJPUiwwfSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtBQ0NFUFQsMH0sIHtFUlJPUiwwfSwge0VSUk9SLDB9LCB7RVJST1IsMH19LCAvLyAxCiAgICB7e0VSUk9SLDB9LCB7UkVEVUNFLDJ9LCB7U0hJRlQsN30sIHtFUlJPUiwwfSwge1JFRFVDRSwyfSwge1JFRFVDRSwyfSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtFUlJPUiwwfX0sIC8vIDIKICAgIHt7RVJST1IsMH0sIHtSRURVQ0UsNH0sIHtSRURVQ0UsNH0sIHtFUlJPUiwwfSwge1JFRFVDRSw0fSwge1JFRFVDRSw0fSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtFUlJPUiwwfX0sIC8vIDMKICAgIHt7U0hJRlQsNX0sIHtFUlJPUiwwfSwge0VSUk9SLDB9LCB7U0hJRlQsNH0sIHtFUlJPUiwwfSwge0VSUk9SLDB9LCB7U0hJRlQsOH0sIHtTSElGVCwyfSwge1NISUZULDN9fSwgLy8gNAogICAge3tFUlJPUiwwfSwge1JFRFVDRSw2fSwge1JFRFVDRSw2fSwge0VSUk9SLDB9LCB7UkVEVUNFLDZ9LCB7UkVEVUNFLDZ9LCB7RVJST1IsMH0sIHtFUlJPUiwwfSwge0VSUk9SLDB9fSwgLy8gNQogICAge3tTSElGVCw1fSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtTSElGVCw0fSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtFUlJPUiwwfSwge1NISUZULDl9LCB7U0hJRlQsM319LCAvLyA2CiAgICB7e1NISUZULDV9LCB7RVJST1IsMH0sIHtFUlJPUiwwfSwge1NISUZULDR9LCB7RVJST1IsMH0sIHtFUlJPUiwwfSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtTSElGVCwxMH19LCAvLyA3CiAgICB7e0VSUk9SLDB9LCB7U0hJRlQsNn0sIHtFUlJPUiwwfSwge0VSUk9SLDB9LCB7U0hJRlQsMTF9LCB7RVJST1IsMH0sIHtFUlJPUiwwfSwge0VSUk9SLDB9LCB7RVJST1IsMH19LCAvLyA4CiAgICB7e0VSUk9SLDB9LCB7UkVEVUNFLDF9LCB7U0hJRlQsN30sIHtFUlJPUiwwfSwge1JFRFVDRSwxfSwge1JFRFVDRSwxfSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtFUlJPUiwwfX0sIC8vIDkKICAgIHt7RVJST1IsMH0sIHtSRURVQ0UsM30sIHtSRURVQ0UsM30sIHtFUlJPUiwwfSwge1JFRFVDRSwzfSwge1JFRFVDRSwzfSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtFUlJPUiwwfX0sIC8vMTAKICAgIHt7RVJST1IsMH0sIHtSRURVQ0UsNX0sIHtSRURVQ0UsNX0sIHtFUlJPUiwwfSwge1JFRFVDRSw1fSwge1JFRFVDRSw1fSwge0VSUk9SLDB9LCB7RVJST1IsMH0sIHtFUlJPUiwwfX0gIC8vMTEKfTsKCi8vIFByb2R1Y3Rpb25zOgovLyAxLiBFIC0+IEUgKyBUCi8vIDIuIEUgLT4gVAovLyAzLiBUIC0+IFQgKiBGCi8vIDQuIFQgLT4gRgovLyA1LiBGIC0+IChFKQovLyA2LiBGIC0+IGlkCgpjaGFyKiBwcm9kdWN0aW9uc1tdID0gewogICAgIkUgLT4gRSArIFQiLCAvLzEKICAgICJFIC0+IFQiLCAgICAgLy8yCiAgICAiVCAtPiBUICogRiIsIC8vMwogICAgIlQgLT4gRiIsICAgICAvLzQKICAgICJGIC0+ICggRSApIiwgLy81CiAgICAiRiAtPiBpZCIgICAgIC8vNgp9OwppbnQgcHJvZHVjdGlvbkxlbmd0aHNbXSA9IHszLCAxLCAzLCAxLCAzLCAxfTsKaW50IHByb2R1Y3Rpb25MSFNbXSA9IHs2LCA2LCA3LCA3LCA4LCA4fTsgLy8gRT02LCBUPTcsIEY9OAoKaW50IHN0YWNrWzEwMF07CmludCB0b3AgPSAtMTsKCnZvaWQgcHVzaChpbnQgc3RhdGUpIHsKICAgIHN0YWNrWysrdG9wXSA9IHN0YXRlOwp9CgppbnQgcG9wKCkgewogICAgcmV0dXJuIHN0YWNrW3RvcC0tXTsKfQoKdm9pZCBwcmludEdyYW1tYXIoKSB7CiAgICBwcmludGYoIkdpdmVuIEdyYW1tYXIgaXM6XG4iKTsKICAgIHByaW50ZigiRSAtPiBFICsgVCB8IFRcbiIpOwogICAgcHJpbnRmKCJUIC0+IFQgKiBGIHwgRlxuIik7CiAgICBwcmludGYoIkYgLT4gKEUpIHwgaWRcblxuIik7Cn0KJX0KCiVvcHRpb24gbm95eXdyYXAKCiUlCgouIDsKCiUlCgppbnQgbWFpbigpIHsKICAgIHByaW50R3JhbW1hcigpOwoKICAgIGNoYXIgaW5wdXRbMTAwXTsKICAgIHByaW50ZigiRW50ZXIgaW5wdXQgc3RyaW5nIChlLmcuLCBpK2kqaSQpOiAiKTsKICAgIHNjYW5mKCIlcyIsIGlucHV0KTsKCiAgICBpbnQgaW5wdXRQdHIgPSAwOwogICAgcHVzaCgwKTsKCiAgICBwcmludGYoIlxuU3RhY2tcdFx0SW5wdXRcdFx0QWN0aW9uXG4iKTsKCiAgICB3aGlsZSAoMSkgewogICAgICAgIGludCBjdXJyZW50U3RhdGUgPSBzdGFja1t0b3BdOwogICAgICAgIGNoYXIgY3VycmVudElucHV0U3ltYm9sID0gaW5wdXRbaW5wdXRQdHJdOwoKICAgICAgICBpbnQgY29sID0gLTE7CiAgICAgICAgc3dpdGNoIChjdXJyZW50SW5wdXRTeW1ib2wpIHsKICAgICAgICAgICAgY2FzZSAnaSc6IGNvbCA9IDA7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcrJzogY29sID0gMTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJyonOiBjb2wgPSAyOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnKCc6IGNvbCA9IDM7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcpJzogY29sID0gNDsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJyQnOiBjb2wgPSA1OyBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IEludmFsaWQgc3ltYm9sICclYydcbiIsIGN1cnJlbnRJbnB1dFN5bWJvbCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgogICAgICAgIFRhYmxlRW50cnkgYWN0aW9uID0gcGFyc2luZ1RhYmxlW2N1cnJlbnRTdGF0ZV1bY29sXTsKCiAgICAgICAgLy8gUHJpbnQgc3RhY2sKICAgICAgICBwcmludGYoIlN0YXRlICIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQgIiwgc3RhY2tbaV0pOwogICAgICAgIH0KCiAgICAgICAgLy8gUHJpbnQgaW5wdXQKICAgICAgICBwcmludGYoIlx0JXNcdCIsICZpbnB1dFtpbnB1dFB0cl0pOwoKICAgICAgICAvLyBUYWtlIGFjdGlvbgogICAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSBTSElGVDoKICAgICAgICAgICAgICAgIHByaW50ZigiXHRTSElGVCAlZFxuIiwgYWN0aW9uLnZhbHVlKTsKICAgICAgICAgICAgICAgIHB1c2goYWN0aW9uLnZhbHVlKTsKICAgICAgICAgICAgICAgIGlucHV0UHRyKys7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUkVEVUNFOiB7CiAgICAgICAgICAgICAgICBpbnQgcHJvZE51bSA9IGFjdGlvbi52YWx1ZTsKICAgICAgICAgICAgICAgIHByaW50ZigiXHRSRURVQ0UgYnkgJXNcbiIsIHByb2R1Y3Rpb25zW3Byb2ROdW0gLSAxXSk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2R1Y3Rpb25MZW5ndGhzW3Byb2ROdW0gLSAxXTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgcG9wKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbnQgc3RhdGVBZnRlclBvcCA9IHN0YWNrW3RvcF07CiAgICAgICAgICAgICAgICBpbnQgZ290b0NvbCA9IHByb2R1Y3Rpb25MSFNbcHJvZE51bSAtIDFdOwogICAgICAgICAgICAgICAgVGFibGVFbnRyeSBnb3RvRW50cnkgPSBwYXJzaW5nVGFibGVbc3RhdGVBZnRlclBvcF1bZ290b0NvbF07CiAgICAgICAgICAgICAgICBpZiAoZ290b0VudHJ5LnR5cGUgIT0gU0hJRlQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBJbnZhbGlkIGdvdG8gYWZ0ZXIgcmVkdWN0aW9uXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1c2goZ290b0VudHJ5LnZhbHVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYXNlIEFDQ0VQVDoKICAgICAgICAgICAgICAgIHByaW50ZigiXHRBQ0NFUFRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgICAgICBjYXNlIEVSUk9SOgogICAgICAgICAgICAgICAgcHJpbnRmKCJcdEVSUk9SXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCsKgwqDCoMKgcmV0dXJuwqAwOwp9Cg==