#include <stdio.h>
#include <string.h>
#include <ctype.h>
char stack[ 100 ] [ 20 ] ;
int top = - 1 ;
void push
( const char * s
) { strcpy ( stack
[ ++ top
] , s
) ; } void pop( int n) { top -= n; }
void printStack( ) {
for ( int i
= 0 ; i
<= top
; i
++ ) printf ( "%s " , stack
[ i
] ) ; }
int reduce( ) {
int reduced = 0 , again = 1 ;
while ( again) {
again = 0 ;
// Rule: E -> id
if ( top
>= 0 && isalpha ( stack
[ top
] [ 0 ] ) && strcmp ( stack
[ top
] , "E" ) != 0 ) { printf ( " Reduce id → E (token: %s)\n " , stack
[ top
] ) ; pop( 1 ) ; push( "E" ) ;
again = reduced = 1 ;
}
// Rule: E -> ( E )
else if ( top
>= 2 && ! strcmp ( stack
[ top
- 2 ] , "(" ) && ! strcmp ( stack
[ top
- 1 ] , "E" ) && ! strcmp ( stack
[ top
] , ")" ) ) { printf ( " Reduce ( E ) → E\n " ) ; pop( 3 ) ; push( "E" ) ;
again = reduced = 1 ;
}
// Rule: E -> E * E
else if ( top
>= 2 && ! strcmp ( stack
[ top
- 2 ] , "E" ) && ! strcmp ( stack
[ top
- 1 ] , "*" ) && ! strcmp ( stack
[ top
] , "E" ) ) { printf ( " Reduce E * E → E\n " ) ; pop( 3 ) ; push( "E" ) ;
again = reduced = 1 ;
}
// Rule: E -> E + E
else if ( top
>= 2 && ! strcmp ( stack
[ top
- 2 ] , "E" ) && ! strcmp ( stack
[ top
- 1 ] , "+" ) && ! strcmp ( stack
[ top
] , "E" ) ) { printf ( " Reduce E + E → E\n " ) ; pop( 3 ) ; push( "E" ) ;
again = reduced = 1 ;
}
}
return reduced;
}
int main( ) {
char input[ 200 ] , tok[ 20 ] ;
if ( ! fgets ( input
, sizeof ( input
) , stdin
) ) return 1 ;
for ( int i = 0 ; input[ i] ; ) {
if ( ! input[ i] ) break ;
int j = 0 ;
if ( isalpha ( input
[ i
] ) || input
[ i
] == '_' ) { while ( isalnum ( input
[ i
] ) || input
[ i
] == '_' ) tok
[ j
++ ] = input
[ i
++ ] ; } else {
tok[ j++ ] = input[ i++ ] ;
}
tok[ j] = '\0 ' ;
printf ( " Unknown token '%s' — rejected.\n String Rejected\n " , tok
) ; return 0 ;
}
push( tok) ;
printStack( ) ;
reduce( ) ;
printStack( ) ;
}
while ( reduce( ) ) printStack( ) ;
if ( top
== 0 && ! strcmp ( stack
[ 0 ] , "E" ) ) printf ( "\n String Accepted ✓\n " ) ; else {
printf ( "\n String Rejected ✗ (stack has %d item(s))\n " , top
+ 1 ) ; printStack( ) ;
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpjaGFyIHN0YWNrWzEwMF1bMjBdOwppbnQgdG9wID0gLTE7Cgp2b2lkIHB1c2goY29uc3QgY2hhciAqcykgeyBzdHJjcHkoc3RhY2tbKyt0b3BdLCBzKTsgfQp2b2lkIHBvcChpbnQgbikgeyB0b3AgLT0gbjsgfQoKdm9pZCBwcmludFN0YWNrKCkgewogICAgcHJpbnRmKCIgIFN0YWNrOiBbICIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG9wOyBpKyspIHByaW50ZigiJXMgIiwgc3RhY2tbaV0pOwogICAgcHJpbnRmKCJdXG4iKTsKfQoKaW50IHJlZHVjZSgpIHsKICAgIGludCByZWR1Y2VkID0gMCwgYWdhaW4gPSAxOwogICAgd2hpbGUgKGFnYWluKSB7CiAgICAgICAgYWdhaW4gPSAwOwogICAgICAgIC8vIFJ1bGU6IEUgLT4gaWQKICAgICAgICBpZiAodG9wID49IDAgJiYgaXNhbHBoYShzdGFja1t0b3BdWzBdKSAmJiBzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKSAhPSAwKSB7CiAgICAgICAgICAgIHByaW50ZigiICBSZWR1Y2UgIGlkICDihpIgRSAgICh0b2tlbjogJXMpXG4iLCBzdGFja1t0b3BdKTsKICAgICAgICAgICAgcG9wKDEpOyBwdXNoKCJFIik7CiAgICAgICAgICAgIGFnYWluID0gcmVkdWNlZCA9IDE7CiAgICAgICAgfQogICAgICAgIC8vIFJ1bGU6IEUgLT4gKCBFICkKICAgICAgICBlbHNlIGlmICh0b3AgPj0gMiAmJiAhc3RyY21wKHN0YWNrW3RvcC0yXSwgIigiKSAmJiAhc3RyY21wKHN0YWNrW3RvcC0xXSwgIkUiKSAmJiAhc3RyY21wKHN0YWNrW3RvcF0sICIpIikpIHsKICAgICAgICAgICAgcHJpbnRmKCIgIFJlZHVjZSAgKCBFICkg4oaSIEVcbiIpOwogICAgICAgICAgICBwb3AoMyk7IHB1c2goIkUiKTsKICAgICAgICAgICAgYWdhaW4gPSByZWR1Y2VkID0gMTsKICAgICAgICB9CiAgICAgICAgLy8gUnVsZTogRSAtPiBFICogRQogICAgICAgIGVsc2UgaWYgKHRvcCA+PSAyICYmICFzdHJjbXAoc3RhY2tbdG9wLTJdLCAiRSIpICYmICFzdHJjbXAoc3RhY2tbdG9wLTFdLCAiKiIpICYmICFzdHJjbXAoc3RhY2tbdG9wXSwgIkUiKSkgewogICAgICAgICAgICBwcmludGYoIiAgUmVkdWNlICBFICogRSDihpIgRVxuIik7CiAgICAgICAgICAgIHBvcCgzKTsgcHVzaCgiRSIpOwogICAgICAgICAgICBhZ2FpbiA9IHJlZHVjZWQgPSAxOwogICAgICAgIH0KICAgICAgICAvLyBSdWxlOiBFIC0+IEUgKyBFCiAgICAgICAgZWxzZSBpZiAodG9wID49IDIgJiYgIXN0cmNtcChzdGFja1t0b3AtMl0sICJFIikgJiYgIXN0cmNtcChzdGFja1t0b3AtMV0sICIrIikgJiYgIXN0cmNtcChzdGFja1t0b3BdLCAiRSIpKSB7CiAgICAgICAgICAgIHByaW50ZigiICBSZWR1Y2UgIEUgKyBFIOKGkiBFXG4iKTsKICAgICAgICAgICAgcG9wKDMpOyBwdXNoKCJFIik7CiAgICAgICAgICAgIGFnYWluID0gcmVkdWNlZCA9IDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlZHVjZWQ7Cn0KCmludCBtYWluKCkgewogICAgY2hhciBpbnB1dFsyMDBdLCB0b2tbMjBdOwogICAgcHJpbnRmKCJFbnRlciBleHByZXNzaW9uOiAiKTsKICAgIGlmICghZmdldHMoaW5wdXQsIHNpemVvZihpbnB1dCksIHN0ZGluKSkgcmV0dXJuIDE7CgogICAgZm9yIChpbnQgaSA9IDA7IGlucHV0W2ldOyApIHsKICAgICAgICB3aGlsZSAoaXNzcGFjZShpbnB1dFtpXSkpIGkrKzsKICAgICAgICBpZiAoIWlucHV0W2ldKSBicmVhazsKCiAgICAgICAgaW50IGogPSAwOwogICAgICAgIGlmIChpc2FscGhhKGlucHV0W2ldKSB8fCBpbnB1dFtpXSA9PSAnXycpIHsKICAgICAgICAgICAgd2hpbGUgKGlzYWxudW0oaW5wdXRbaV0pIHx8IGlucHV0W2ldID09ICdfJykgdG9rW2orK10gPSBpbnB1dFtpKytdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRva1tqKytdID0gaW5wdXRbaSsrXTsKICAgICAgICB9CiAgICAgICAgdG9rW2pdID0gJ1wwJzsKCiAgICAgICAgaWYgKCFpc2FscGhhKHRva1swXSkgJiYgIXN0cmNocigiXygpKyoiLCB0b2tbMF0pKSB7CiAgICAgICAgICAgIHByaW50ZigiICBVbmtub3duIHRva2VuICclcycg4oCUIHJlamVjdGVkLlxuU3RyaW5nIFJlamVjdGVkXG4iLCB0b2spOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHByaW50ZigiU2hpZnQgICclcydcbiIsIHRvayk7CiAgICAgICAgcHVzaCh0b2spOwogICAgICAgIHByaW50U3RhY2soKTsKICAgICAgICByZWR1Y2UoKTsKICAgICAgICBwcmludFN0YWNrKCk7CiAgICB9CgogICAgd2hpbGUgKHJlZHVjZSgpKSBwcmludFN0YWNrKCk7CgogICAgaWYgKHRvcCA9PSAwICYmICFzdHJjbXAoc3RhY2tbMF0sICJFIikpCiAgICAgICAgcHJpbnRmKCJcblN0cmluZyBBY2NlcHRlZCDinJNcbiIpOwogICAgZWxzZSB7CiAgICAgICAgcHJpbnRmKCJcblN0cmluZyBSZWplY3RlZCDinJcgIChzdGFjayBoYXMgJWQgaXRlbShzKSlcbiIsIHRvcCArIDEpOwogICAgICAgIHByaW50U3RhY2soKTsKICAgIH0KICAgIHJldHVybiAwOwp9