#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Array functioning as our parsing stack
char p_stack[ 100 ] [ 10 ] ;
int sp = - 1 ; // Stack pointer
int cursor = 0 ; // Tracks current position in the input string
char expr_str[ 100 ] ; // Stores the user's expression
// Add a token to the top of the stack
void push_sym( const char * val) {
}
// Remove the topmost token
void pop_sym( ) {
if ( sp >= 0 ) {
sp--;
}
}
// Output the current state of the stack
void show_stack( ) {
for ( int k = 0 ; k <= sp; k++ ) {
}
}
// Check if the top of the stack matches any grammar rules
int attempt_reduction( ) {
// Rule: E -> ( E )
if ( sp >= 2 &&
strcmp ( p_stack
[ sp
- 2 ] , "(" ) == 0 && strcmp ( p_stack
[ sp
- 1 ] , "E" ) == 0 && strcmp ( p_stack
[ sp
] , ")" ) == 0 ) { pop_sym( ) ; pop_sym( ) ; pop_sym( ) ;
push_sym( "E" ) ;
return 1 ;
}
// Rule: E -> E + E
if ( sp >= 2 &&
strcmp ( p_stack
[ sp
- 2 ] , "E" ) == 0 && strcmp ( p_stack
[ sp
- 1 ] , "+" ) == 0 && strcmp ( p_stack
[ sp
] , "E" ) == 0 ) { pop_sym( ) ; pop_sym( ) ; pop_sym( ) ;
push_sym( "E" ) ;
return 1 ;
}
// Rule: E -> E * E
if ( sp >= 2 &&
strcmp ( p_stack
[ sp
- 2 ] , "E" ) == 0 && strcmp ( p_stack
[ sp
- 1 ] , "*" ) == 0 && strcmp ( p_stack
[ sp
] , "E" ) == 0 ) { pop_sym( ) ; pop_sym( ) ; pop_sym( ) ;
push_sym( "E" ) ;
return 1 ;
}
// Rule: E -> id (any single lowercase char)
if ( sp
!= - 1 && islower ( p_stack
[ sp
] [ 0 ] ) && strlen ( p_stack
[ sp
] ) == 1 ) { pop_sym( ) ;
push_sym( "E" ) ;
return 1 ;
}
return 0 ; // No rule matched
}
int main( ) {
printf ( "Input an arithmetic expression: " ) ; // Read the string including spaces
fgets ( expr_str
, sizeof ( expr_str
) , stdin
) ;
// Strip the trailing newline character if it exists
expr_str
[ strcspn ( expr_str
, "\n " ) ] = 0 ;
while ( expr_str[ cursor] != '\0 ' ) {
// 1. Skip over any whitespaces
cursor++;
continue ;
}
// 2. Perform SHIFT operation
char sym_buf[ 2 ] = { expr_str[ cursor] , '\0 ' } ;
push_sym( sym_buf) ;
cursor++;
show_stack( ) ;
// 3. Perform REDUCE operation as long as rules match
while ( attempt_reduction( ) ) {
show_stack( ) ;
}
}
// Final validation: Stack should contain only 'E'
if ( sp
== 0 && strcmp ( p_stack
[ 0 ] , "E" ) == 0 ) { printf ( "Result: String Accepted\n " ) ; } else {
printf ( "Result: String Rejected\n " ) ; }
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiAKLy8gQXJyYXkgZnVuY3Rpb25pbmcgYXMgb3VyIHBhcnNpbmcgc3RhY2sKY2hhciBwX3N0YWNrWzEwMF1bMTBdOwppbnQgc3AgPSAtMTsgICAgICAgIC8vIFN0YWNrIHBvaW50ZXIKaW50IGN1cnNvciA9IDA7ICAgICAvLyBUcmFja3MgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyaW5nCmNoYXIgZXhwcl9zdHJbMTAwXTsgLy8gU3RvcmVzIHRoZSB1c2VyJ3MgZXhwcmVzc2lvbgogCi8vIEFkZCBhIHRva2VuIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCnZvaWQgcHVzaF9zeW0oY29uc3QgY2hhciAqdmFsKSB7CiAgICBzdHJjcHkocF9zdGFja1srK3NwXSwgdmFsKTsKfQogCi8vIFJlbW92ZSB0aGUgdG9wbW9zdCB0b2tlbgp2b2lkIHBvcF9zeW0oKSB7CiAgICBpZiAoc3AgPj0gMCkgewogICAgICAgIHNwLS07CiAgICB9Cn0KIAovLyBPdXRwdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN0YWNrCnZvaWQgc2hvd19zdGFjaygpIHsKICAgIGZvciAoaW50IGsgPSAwOyBrIDw9IHNwOyBrKyspIHsKICAgICAgICBwcmludGYoIiVzICIsIHBfc3RhY2tba10pOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwp9CiAKLy8gQ2hlY2sgaWYgdGhlIHRvcCBvZiB0aGUgc3RhY2sgbWF0Y2hlcyBhbnkgZ3JhbW1hciBydWxlcwppbnQgYXR0ZW1wdF9yZWR1Y3Rpb24oKSB7CiAgICAvLyBSdWxlOiBFIC0+ICggRSApCiAgICBpZiAoc3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwIC0gMl0sICIoIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwIC0gMV0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwXSwgIikiKSA9PSAwKSB7CiAgICAgICAgcG9wX3N5bSgpOyBwb3Bfc3ltKCk7IHBvcF9zeW0oKTsKICAgICAgICBwdXNoX3N5bSgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQogCiAgICAvLyBSdWxlOiBFIC0+IEUgKyBFCiAgICBpZiAoc3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwIC0gMl0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwIC0gMV0sICIrIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwXSwgIkUiKSA9PSAwKSB7CiAgICAgICAgcG9wX3N5bSgpOyBwb3Bfc3ltKCk7IHBvcF9zeW0oKTsKICAgICAgICBwdXNoX3N5bSgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQogCiAgICAvLyBSdWxlOiBFIC0+IEUgKiBFCiAgICBpZiAoc3AgPj0gMiAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwIC0gMl0sICJFIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwIC0gMV0sICIqIikgPT0gMCAmJgogICAgICAgIHN0cmNtcChwX3N0YWNrW3NwXSwgIkUiKSA9PSAwKSB7CiAgICAgICAgcG9wX3N5bSgpOyBwb3Bfc3ltKCk7IHBvcF9zeW0oKTsKICAgICAgICBwdXNoX3N5bSgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQogCiAgICAvLyBSdWxlOiBFIC0+IGlkIChhbnkgc2luZ2xlIGxvd2VyY2FzZSBjaGFyKQogICAgaWYgKHNwICE9IC0xICYmIGlzbG93ZXIocF9zdGFja1tzcF1bMF0pICYmIHN0cmxlbihwX3N0YWNrW3NwXSkgPT0gMSkgewogICAgICAgIHBvcF9zeW0oKTsKICAgICAgICBwdXNoX3N5bSgiRSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQogCiAgICByZXR1cm4gMDsgLy8gTm8gcnVsZSBtYXRjaGVkCn0KIAppbnQgbWFpbigpIHsKICAgIHByaW50ZigiSW5wdXQgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uOiAiKTsKICAgIC8vIFJlYWQgdGhlIHN0cmluZyBpbmNsdWRpbmcgc3BhY2VzCiAgICBmZ2V0cyhleHByX3N0ciwgc2l6ZW9mKGV4cHJfc3RyKSwgc3RkaW4pOwogCiAgICAvLyBTdHJpcCB0aGUgdHJhaWxpbmcgbmV3bGluZSBjaGFyYWN0ZXIgaWYgaXQgZXhpc3RzCiAgICBleHByX3N0cltzdHJjc3BuKGV4cHJfc3RyLCAiXG4iKV0gPSAwOwogCiAgICB3aGlsZSAoZXhwcl9zdHJbY3Vyc29yXSAhPSAnXDAnKSB7CiAgICAgICAgLy8gMS4gU2tpcCBvdmVyIGFueSB3aGl0ZXNwYWNlcwogICAgICAgIGlmIChpc3NwYWNlKGV4cHJfc3RyW2N1cnNvcl0pKSB7CiAgICAgICAgICAgIGN1cnNvcisrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAKICAgICAgICAvLyAyLiBQZXJmb3JtIFNISUZUIG9wZXJhdGlvbgogICAgICAgIGNoYXIgc3ltX2J1ZlsyXSA9IHtleHByX3N0cltjdXJzb3JdLCAnXDAnfTsKICAgICAgICBwdXNoX3N5bShzeW1fYnVmKTsKICAgICAgICBjdXJzb3IrKzsKIAogICAgICAgIHByaW50ZigiQWN0aW9uIFtTaGlmdF06ICAiKTsKICAgICAgICBzaG93X3N0YWNrKCk7CiAKICAgICAgICAvLyAzLiBQZXJmb3JtIFJFRFVDRSBvcGVyYXRpb24gYXMgbG9uZyBhcyBydWxlcyBtYXRjaAogICAgICAgIHdoaWxlIChhdHRlbXB0X3JlZHVjdGlvbigpKSB7CiAgICAgICAgICAgIHByaW50ZigiQWN0aW9uIFtSZWR1Y2VdOiAiKTsKICAgICAgICAgICAgc2hvd19zdGFjaygpOwogICAgICAgIH0KICAgIH0KIAogICAgLy8gRmluYWwgdmFsaWRhdGlvbjogU3RhY2sgc2hvdWxkIGNvbnRhaW4gb25seSAnRScKICAgIGlmIChzcCA9PSAwICYmIHN0cmNtcChwX3N0YWNrWzBdLCAiRSIpID09IDApIHsKICAgICAgICBwcmludGYoIlJlc3VsdDogU3RyaW5nIEFjY2VwdGVkXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCJSZXN1bHQ6IFN0cmluZyBSZWplY3RlZFxuIik7CiAgICB9CiAKICAgIHJldHVybiAwOwp9Cg==