#include <stdio.h>
#include <string.h>
#include <ctype.h>
char stack[ 100 ] [ 10 ] ;
int top = - 1 ;
int idx = 0 ;
char input[ 100 ] ;
void push( const char * s) {
}
void pop( ) {
top--;
}
// Print stack with spaces between symbols (matches expected output)
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 ;
}
int main( ) {
printf ( "Enter an Expression:\n " ) ; fgets ( input
, sizeof ( input
) , stdin
) ; // fgets allows spaces in input
while ( input[ idx] ) {
// Skip whitespace characters
idx++;
continue ;
}
char temp[ 2 ] = { input[ idx] , '\0 ' } ;
push( temp) ;
idx++;
printStack( ) ;
while ( reduce( ) ) {
printStack( ) ;
}
}
if ( top
== 0 && strcmp ( stack
[ 0 ] , "E" ) == 0 ) else
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpjaGFyIHN0YWNrWzEwMF1bMTBdOwppbnQgdG9wID0gLTE7CmludCBpZHggPSAwOwpjaGFyIGlucHV0WzEwMF07Cgp2b2lkIHB1c2goY29uc3QgY2hhciAqcykgewogICAgc3RyY3B5KHN0YWNrWysrdG9wXSwgcyk7Cn0KCnZvaWQgcG9wKCkgewogICAgdG9wLS07Cn0KCi8vIFByaW50IHN0YWNrIHdpdGggc3BhY2VzIGJldHdlZW4gc3ltYm9scyAobWF0Y2hlcyBleHBlY3RlZCBvdXRwdXQpCnZvaWQgcHJpbnRTdGFjaygpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKSBwcmludGYoIiVzICIsIHN0YWNrW2ldKTsKICAgIHByaW50ZigiXG4iKTsKfQoKaW50IHJlZHVjZSgpIHsKICAgIC8vIFJ1bGUgMTogRSDihpIgRSArIEUKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICIrIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAgICJFIikgPT0gMCkgewogICAgICAgIHBvcCgpOyBwb3AoKTsgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgLy8gUnVsZSAyOiBFIOKGkiBFICogRQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0yXSwgIkUiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIioiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICAgIkUiKSA9PSAwKSB7CiAgICAgICAgcG9wKCk7IHBvcCgpOyBwb3AoKTsKICAgICAgICBwdXNoKCJFIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAvLyBSdWxlIDM6IEUg4oaSIChFKQogICAgaWYgKHRvcCA+PSAyICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0yXSwgIigiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcC0xXSwgIkUiKSA9PSAwICYmCiAgICAgICAgc3RyY21wKHN0YWNrW3RvcF0sICAgIikiKSA9PSAwKSB7CiAgICAgICAgcG9wKCk7IHBvcCgpOyBwb3AoKTsKICAgICAgICBwdXNoKCJFIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAvLyBSdWxlIDQ6IEUg4oaSIGlkCiAgICBpZiAodG9wICE9IC0xICYmIHN0YWNrW3RvcF1bMF0gPj0gJ2EnICYmIHN0YWNrW3RvcF1bMF0gPD0gJ3onKSB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCmludCBtYWluKCkgewogICAgcHJpbnRmKCJFbnRlciBhbiBFeHByZXNzaW9uOlxuIik7CiAgICBmZ2V0cyhpbnB1dCwgc2l6ZW9mKGlucHV0KSwgc3RkaW4pOyAvLyBmZ2V0cyBhbGxvd3Mgc3BhY2VzIGluIGlucHV0CgogICAgd2hpbGUgKGlucHV0W2lkeF0pIHsKICAgICAgICAvLyBTa2lwIHdoaXRlc3BhY2UgY2hhcmFjdGVycwogICAgICAgIGlmIChpc3NwYWNlKGlucHV0W2lkeF0pKSB7CiAgICAgICAgICAgIGlkeCsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGNoYXIgdGVtcFsyXSA9IHtpbnB1dFtpZHhdLCAnXDAnfTsKICAgICAgICBwdXNoKHRlbXApOwogICAgICAgIGlkeCsrOwoKICAgICAgICBwcmludGYoIlNoaWZ0OiAiKTsKICAgICAgICBwcmludFN0YWNrKCk7CgogICAgICAgIHdoaWxlIChyZWR1Y2UoKSkgewogICAgICAgICAgICBwcmludGYoIlJlZHVjZTogIik7CiAgICAgICAgICAgIHByaW50U3RhY2soKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHRvcCA9PSAwICYmIHN0cmNtcChzdGFja1swXSwgIkUiKSA9PSAwKQogICAgICAgIHByaW50ZigiU3RyaW5nIEFjY2VwdGVkXG4iKTsKICAgIGVsc2UKICAgICAgICBwcmludGYoIlN0cmluZyBSZWplY3RlZFxuIik7CgogICAgcmV0dXJuIDA7Cn0=