#include <stdio.h>
#include <string.h>
#include <ctype.h>
char stack[ 100 ] ;
int top = - 1 ;
void push( char c) {
stack[ ++ top] = c;
}
void printStack( ) {
for ( int i = 0 ; i <= top; i++ )
}
int reduce( ) {
// id → E
if ( top >= 0 && ( stack[ top] >= 'a' && stack[ top] <= 'z' ) ) {
stack[ top] = 'E' ;
return 1 ;
}
// (E) → E
if ( top >= 2 && stack[ top] == ')' && stack[ top- 1 ] == 'E' && stack[ top- 2 ] == '(' ) {
top -= 2 ;
stack[ top] = 'E' ;
return 1 ;
}
// E * E → E
if ( top >= 2 && stack[ top] == 'E' && stack[ top- 1 ] == '*' && stack[ top- 2 ] == 'E' ) {
printf ( "Reduce: E * E -> E\n " ) ; top -= 2 ;
stack[ top] = 'E' ;
return 1 ;
}
// E + E → E
if ( top >= 2 && stack[ top] == 'E' && stack[ top- 1 ] == '+' && stack[ top- 2 ] == 'E' ) {
printf ( "Reduce: E + E -> E\n " ) ; top -= 2 ;
stack[ top] = 'E' ;
return 1 ;
}
return 0 ;
}
int main( ) {
char input[ 100 ] ;
int i = 0 ;
printf ( "Enter an Expression: " ) ; fgets ( input
, sizeof ( input
) , stdin
) ;
input
[ strcspn ( input
, "\n " ) ] = '\0 ' ;
while ( input[ i] != '\0 ' ) {
i++;
continue ;
}
printf ( "Shift: %c\n " , input
[ i
] ) ; push( input[ i] ) ;
printStack( ) ;
while ( reduce( ) ) {
printStack( ) ;
}
i++;
}
while ( reduce( ) ) {
printStack( ) ;
}
if ( top == 0 && stack[ top] == 'E' ) {
} else {
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpjaGFyIHN0YWNrWzEwMF07CmludCB0b3AgPSAtMTsKCnZvaWQgcHVzaChjaGFyIGMpIHsKICAgIHN0YWNrWysrdG9wXSA9IGM7Cn0KCnZvaWQgcHJpbnRTdGFjaygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKQogICAgICAgIHByaW50ZigiJWMiLCBzdGFja1tpXSk7CiAgICBwcmludGYoIlxuIik7Cn0KCmludCByZWR1Y2UoKSB7CgogICAgLy8gaWQg4oaSIEUgCiAgICBpZiAodG9wID49IDAgJiYgKHN0YWNrW3RvcF0gPj0gJ2EnICYmIHN0YWNrW3RvcF0gPD0gJ3onKSkgewogICAgICAgIHByaW50ZigiUmVkdWNlOiBpZCAtPiBFXG4iKTsKICAgICAgICBzdGFja1t0b3BdID0gJ0UnOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIChFKSDihpIgRQogICAgaWYgKHRvcCA+PSAyICYmIHN0YWNrW3RvcF0gPT0gJyknICYmIHN0YWNrW3RvcC0xXSA9PSAnRScgJiYgc3RhY2tbdG9wLTJdID09ICcoJykgewogICAgICAgIHByaW50ZigiUmVkdWNlOiAoRSkgLT4gRVxuIik7CiAgICAgICAgdG9wIC09IDI7CiAgICAgICAgc3RhY2tbdG9wXSA9ICdFJzsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvLyBFICogRSDihpIgRQogICAgaWYgKHRvcCA+PSAyICYmIHN0YWNrW3RvcF0gPT0gJ0UnICYmIHN0YWNrW3RvcC0xXSA9PSAnKicgJiYgc3RhY2tbdG9wLTJdID09ICdFJykgewogICAgICAgIHByaW50ZigiUmVkdWNlOiBFICogRSAtPiBFXG4iKTsKICAgICAgICB0b3AgLT0gMjsKICAgICAgICBzdGFja1t0b3BdID0gJ0UnOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIEUgKyBFIOKGkiBFCiAgICBpZiAodG9wID49IDIgJiYgc3RhY2tbdG9wXSA9PSAnRScgJiYgc3RhY2tbdG9wLTFdID09ICcrJyAmJiBzdGFja1t0b3AtMl0gPT0gJ0UnKSB7CiAgICAgICAgcHJpbnRmKCJSZWR1Y2U6IEUgKyBFIC0+IEVcbiIpOwogICAgICAgIHRvcCAtPSAyOwogICAgICAgIHN0YWNrW3RvcF0gPSAnRSc7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCmludCBtYWluKCkgewogICAgY2hhciBpbnB1dFsxMDBdOwogICAgaW50IGkgPSAwOwoKICAgIHByaW50ZigiRW50ZXIgYW4gRXhwcmVzc2lvbjogIik7CiAgICBmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pOwoKICAgIGlucHV0W3N0cmNzcG4oaW5wdXQsICJcbiIpXSA9ICdcMCc7CgogICAgcHJpbnRmKCJcblBhcnNpbmcgU3RlcHM6XG4iKTsKCiAgICB3aGlsZSAoaW5wdXRbaV0gIT0gJ1wwJykgewoKICAgICAgICBpZiAoaXNzcGFjZShpbnB1dFtpXSkpIHsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHByaW50ZigiU2hpZnQ6ICVjXG4iLCBpbnB1dFtpXSk7CiAgICAgICAgcHVzaChpbnB1dFtpXSk7CiAgICAgICAgcHJpbnRTdGFjaygpOwoKICAgICAgICB3aGlsZSAocmVkdWNlKCkpIHsKICAgICAgICAgICAgcHJpbnRTdGFjaygpOwogICAgICAgIH0KCiAgICAgICAgaSsrOwogICAgfQoKICAgIHdoaWxlIChyZWR1Y2UoKSkgewogICAgICAgIHByaW50U3RhY2soKTsKICAgIH0KCiAgICBpZiAodG9wID09IDAgJiYgc3RhY2tbdG9wXSA9PSAnRScpIHsKICAgICAgICBwcmludGYoIlN0cmluZyBBY2NlcHRlZFxuIik7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ZigiU3RyaW5nIFJlamVjdGVkXG4iKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==