// Shift Reduce Parser Improved
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Stack to hold tokens and non-terminals during parsing
char stack[ 100 ] [ 10 ] ;
int top = - 1 ; // Points to the top of the stack
int pos = 0 ; // Input pointer
char input[ 100 ] ; // Holds input string
// Push a symbol onto stack
void push( const char * s)
{
}
// Pop top element
void pop( )
{
top--;
}
// Print stack contents
void printStack( )
{
for ( int i = 0 ; i <= top; i++ )
}
// Apply reduce rules
int reduce( )
{
// Rule 1: E -> E + E
if ( top >= 2 &&
strcmp ( stack
[ top
- 2 ] , "E" ) == 0 && strcmp ( stack
[ top
- 1 ] , "+" ) == 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 && {
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 && {
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
, 100 , stdin
) ;
while ( input[ pos] )
{
// Ignore spaces
{
pos++;
continue ;
}
char temp[ 2 ] = { input[ pos] , '\0 ' } ;
push( temp) ;
pos++;
printStack( ) ;
while ( reduce( ) )
{
printStack( ) ;
}
}
if ( top
== 0 && strcmp ( stack
[ 0 ] , "E" ) == 0 ) else
return 0 ;
}
Ly8gU2hpZnQgUmVkdWNlIFBhcnNlciBJbXByb3ZlZAojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCi8vIFN0YWNrIHRvIGhvbGQgdG9rZW5zIGFuZCBub24tdGVybWluYWxzIGR1cmluZyBwYXJzaW5nCmNoYXIgc3RhY2tbMTAwXVsxMF07CmludCB0b3AgPSAtMTsgICAgICAvLyBQb2ludHMgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKaW50IHBvcyA9IDA7ICAgICAgIC8vIElucHV0IHBvaW50ZXIKY2hhciBpbnB1dFsxMDBdOyAgIC8vIEhvbGRzIGlucHV0IHN0cmluZwoKLy8gUHVzaCBhIHN5bWJvbCBvbnRvIHN0YWNrCnZvaWQgcHVzaChjb25zdCBjaGFyICpzKQp7CiAgICBzdHJjcHkoc3RhY2tbKyt0b3BdLCBzKTsKfQoKLy8gUG9wIHRvcCBlbGVtZW50CnZvaWQgcG9wKCkKewogICAgdG9wLS07Cn0KCi8vIFByaW50IHN0YWNrIGNvbnRlbnRzCnZvaWQgcHJpbnRTdGFjaygpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRvcDsgaSsrKQogICAgICAgIHByaW50ZigiJXMiLCBzdGFja1tpXSk7CiAgICBwcmludGYoIlxuIik7Cn0KCi8vIEFwcGx5IHJlZHVjZSBydWxlcwppbnQgcmVkdWNlKCkKewogICAgLy8gUnVsZSAxOiBFIC0+IEUgKyBFCiAgICBpZiAodG9wID49IDIgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTJdLCAiRSIpID09IDAgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wLTFdLCAiKyIpID09IDAgJiYKICAgICAgICBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKSA9PSAwKQogICAgewogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHBvcCgpOwogICAgICAgIHB1c2goIkUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvLyBSdWxlIDI6IEUgLT4gRSAqIEUKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICIqIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiRSIpID09IDApCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIFJ1bGUgMzogRSAtPiAoRSkKICAgIGlmICh0b3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMl0sICIoIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3AtMV0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChzdGFja1t0b3BdLCAiKSIpID09IDApCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIFJ1bGUgNDogRSAtPiBpZAogICAgaWYgKHRvcCAhPSAtMSAmJgogICAgICAgIHN0YWNrW3RvcF1bMF0gPj0gJ2EnICYmCiAgICAgICAgc3RhY2tbdG9wXVswXSA8PSAneicpCiAgICB7CiAgICAgICAgcG9wKCk7CiAgICAgICAgcHVzaCgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9CgppbnQgbWFpbigpCnsKICAgIHByaW50ZigiRW50ZXIgYW4gRXhwcmVzc2lvbjpcbiIpOwogICAgZmdldHMoaW5wdXQsIDEwMCwgc3RkaW4pOwoKICAgIHdoaWxlIChpbnB1dFtwb3NdKQogICAgewogICAgICAgIC8vIElnbm9yZSBzcGFjZXMKICAgICAgICBpZiAoaXNzcGFjZShpbnB1dFtwb3NdKSkKICAgICAgICB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGNoYXIgdGVtcFsyXSA9IHtpbnB1dFtwb3NdLCAnXDAnfTsKICAgICAgICBwdXNoKHRlbXApOwogICAgICAgIHBvcysrOwoKICAgICAgICBwcmludGYoIlNoaWZ0OiAiKTsKICAgICAgICBwcmludFN0YWNrKCk7CgogICAgICAgIHdoaWxlIChyZWR1Y2UoKSkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiUmVkdWNlOiAiKTsKICAgICAgICAgICAgcHJpbnRTdGFjaygpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodG9wID09IDAgJiYgc3RyY21wKHN0YWNrWzBdLCAiRSIpID09IDApCiAgICAgICAgcHJpbnRmKCJTdHJpbmcgQWNjZXB0ZWRcbiIpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiU3RyaW5nIFJlamVjdGVkXG4iKTsKCiAgICByZXR1cm4gMDsKfQ==