#include <stdio.h>
#include <string.h>
#include <ctype.h>
char stack[ 100 ] ;
int top = - 1 ;
// Function to push a character onto the stack
void push( char c) {
stack[ ++ top] = c;
}
// Function to print the current contents of the stack
void printStack( ) {
for ( int i = 0 ; i <= top; i++ )
}
// Function to apply rules (Shift-Reduce Parsing)
void reduce( ) {
// Rule 1: id -> E
// If top of stack is 'a' or 'b', treat it as identifier (id)
if ( top >= 0 && ( stack[ top] == 'a' || stack[ top] == 'b' ) ) {
stack[ top] = 'E' ; // Replace with non-terminal E
}
// Rule 2: (E) -> E
// If pattern "(E)" is found on top of stack
if ( top >= 2 && stack[ top] == ')' && stack[ top- 1 ] == 'E' && stack[ top- 2 ] == '(' ) {
top -= 2 ; // Remove '(' and ')'
stack[ top] = 'E' ; // Replace with E
}
// Rule 3: E * E -> E
// Handle multiplication
if ( top >= 2 && stack[ top] == 'E' && stack[ top- 1 ] == '*' && stack[ top- 2 ] == 'E' ) {
printf ( "Reduce: E * E -> E\n " ) ; top -= 2 ; // Reduce 3 symbols into 1
stack[ top] = 'E' ;
}
// Rule 4: E + E -> E
// Handle addition
if ( top >= 2 && stack[ top] == 'E' && stack[ top- 1 ] == '+' && stack[ top- 2 ] == 'E' ) {
printf ( "Reduce: E + E -> E\n " ) ; top -= 2 ; // Reduce 3 symbols into 1
stack[ top] = 'E' ;
}
}
int main( ) {
char input[ 100 ] ;
int i = 0 ;
printf ( "Enter an Expression: " ) ; fgets ( input
, sizeof ( input
) , stdin
) ;
// Remove newline character from input
input
[ strcspn ( input
, "\n " ) ] = '\0 ' ;
while ( input[ i] != '\0 ' ) {
// Skip whitespace
i++;
continue ;
}
// SHIFT operation: push character to stack
printf ( "Shift: %c\n " , input
[ i
] ) ; push( input[ i] ) ;
// Print current stack after shift
printStack( ) ;
// Try to REDUCE after shift
reduce( ) ;
i++;
}
// After input ends, try to reduce remaining stack
while ( top > 0 ) {
reduce( ) ;
}
// Final check: if stack contains only 'E', input is accepted
if ( top == 0 && stack[ top] == 'E' ) {
} else {
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpjaGFyIHN0YWNrWzEwMF07CmludCB0b3AgPSAtMTsKCi8vIEZ1bmN0aW9uIHRvIHB1c2ggYSBjaGFyYWN0ZXIgb250byB0aGUgc3RhY2sKdm9pZCBwdXNoKGNoYXIgYykgewogICAgc3RhY2tbKyt0b3BdID0gYzsKfQoKLy8gRnVuY3Rpb24gdG8gcHJpbnQgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHN0YWNrCnZvaWQgcHJpbnRTdGFjaygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKQogICAgICAgIHByaW50ZigiJWMiLCBzdGFja1tpXSk7Cn0KCi8vIEZ1bmN0aW9uIHRvIGFwcGx5IHJ1bGVzIChTaGlmdC1SZWR1Y2UgUGFyc2luZykKdm9pZCByZWR1Y2UoKSB7CgogICAgLy8gUnVsZSAxOiBpZCAtPiBFCiAgICAvLyBJZiB0b3Agb2Ygc3RhY2sgaXMgJ2EnIG9yICdiJywgdHJlYXQgaXQgYXMgaWRlbnRpZmllciAoaWQpCiAgICBpZiAodG9wID49IDAgJiYgKHN0YWNrW3RvcF0gPT0gJ2EnIHx8IHN0YWNrW3RvcF0gPT0gJ2InKSkgewogICAgICAgIHByaW50ZigiUmVkdWNlOiBpZCAtPiBFXG4iKTsKICAgICAgICBzdGFja1t0b3BdID0gJ0UnOyAgLy8gUmVwbGFjZSB3aXRoIG5vbi10ZXJtaW5hbCBFCiAgICB9CgogICAgLy8gUnVsZSAyOiAoRSkgLT4gRQogICAgLy8gSWYgcGF0dGVybiAiKEUpIiBpcyBmb3VuZCBvbiB0b3Agb2Ygc3RhY2sKICAgIGlmICh0b3AgPj0gMiAmJiBzdGFja1t0b3BdID09ICcpJyAmJiBzdGFja1t0b3AtMV0gPT0gJ0UnICYmIHN0YWNrW3RvcC0yXSA9PSAnKCcpIHsKICAgICAgICBwcmludGYoIlJlZHVjZTogKEUpIC0+IEVcbiIpOwogICAgICAgIHRvcCAtPSAyOyAgICAgICAgICAvLyBSZW1vdmUgJygnIGFuZCAnKScKICAgICAgICBzdGFja1t0b3BdID0gJ0UnOyAgLy8gUmVwbGFjZSB3aXRoIEUKICAgIH0KCiAgICAvLyBSdWxlIDM6IEUgKiBFIC0+IEUKICAgIC8vIEhhbmRsZSBtdWx0aXBsaWNhdGlvbgogICAgaWYgKHRvcCA+PSAyICYmIHN0YWNrW3RvcF0gPT0gJ0UnICYmIHN0YWNrW3RvcC0xXSA9PSAnKicgJiYgc3RhY2tbdG9wLTJdID09ICdFJykgewogICAgICAgIHByaW50ZigiUmVkdWNlOiBFICogRSAtPiBFXG4iKTsKICAgICAgICB0b3AgLT0gMjsgICAgICAgICAgLy8gUmVkdWNlIDMgc3ltYm9scyBpbnRvIDEKICAgICAgICBzdGFja1t0b3BdID0gJ0UnOwogICAgfQoKICAgIC8vIFJ1bGUgNDogRSArIEUgLT4gRQogICAgLy8gSGFuZGxlIGFkZGl0aW9uCiAgICBpZiAodG9wID49IDIgJiYgc3RhY2tbdG9wXSA9PSAnRScgJiYgc3RhY2tbdG9wLTFdID09ICcrJyAmJiBzdGFja1t0b3AtMl0gPT0gJ0UnKSB7CiAgICAgICAgcHJpbnRmKCJSZWR1Y2U6IEUgKyBFIC0+IEVcbiIpOwogICAgICAgIHRvcCAtPSAyOyAgICAgICAgICAvLyBSZWR1Y2UgMyBzeW1ib2xzIGludG8gMQogICAgICAgIHN0YWNrW3RvcF0gPSAnRSc7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgY2hhciBpbnB1dFsxMDBdOwogICAgaW50IGkgPSAwOwoKICAgIHByaW50ZigiRW50ZXIgYW4gRXhwcmVzc2lvbjogIik7CiAgICBmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pOwoKICAgIC8vIFJlbW92ZSBuZXdsaW5lIGNoYXJhY3RlciBmcm9tIGlucHV0CiAgICBpbnB1dFtzdHJjc3BuKGlucHV0LCAiXG4iKV0gPSAnXDAnOwoKICAgIHByaW50ZigiXG5QYXJzaW5nIFN0ZXBzOlxuIik7CgogICAgd2hpbGUgKGlucHV0W2ldICE9ICdcMCcpIHsKCiAgICAgICAgLy8gU2tpcCB3aGl0ZXNwYWNlCiAgICAgICAgaWYgKGlzc3BhY2UoaW5wdXRbaV0pKSB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvLyBTSElGVCBvcGVyYXRpb246IHB1c2ggY2hhcmFjdGVyIHRvIHN0YWNrCiAgICAgICAgcHJpbnRmKCJTaGlmdDogJWNcbiIsIGlucHV0W2ldKTsKICAgICAgICBwdXNoKGlucHV0W2ldKTsKCiAgICAgICAgLy8gUHJpbnQgY3VycmVudCBzdGFjayBhZnRlciBzaGlmdAogICAgICAgIHByaW50U3RhY2soKTsKICAgICAgICBwcmludGYoIlxuIik7CgogICAgICAgIC8vIFRyeSB0byBSRURVQ0UgYWZ0ZXIgc2hpZnQKICAgICAgICByZWR1Y2UoKTsKCiAgICAgICAgaSsrOwogICAgfQoKICAgIC8vIEFmdGVyIGlucHV0IGVuZHMsIHRyeSB0byByZWR1Y2UgcmVtYWluaW5nIHN0YWNrCiAgICB3aGlsZSAodG9wID4gMCkgewogICAgICAgIHJlZHVjZSgpOwogICAgfQoKICAgIC8vIEZpbmFsIGNoZWNrOiBpZiBzdGFjayBjb250YWlucyBvbmx5ICdFJywgaW5wdXQgaXMgYWNjZXB0ZWQKICAgIGlmICh0b3AgPT0gMCAmJiBzdGFja1t0b3BdID09ICdFJykgewogICAgICAgIHByaW50ZigiU3RyaW5nIEFjY2VwdGVkXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCJTdHJpbmcgUmVqZWN0ZWRcbiIpOwogICAgfQoKICAgIHJldHVybiAwOwp9