ich eine einfach zu implementieren versuchen if-Anweisung in Flex und Bison in der folgenden Form:Bison Yacc Wenn Statement immer Ausführung
(Ausdruck) (Ausdruck)
Wenn der linke Ausdruck ein nicht Null ist? Wert, dann wird der richtige Ausdruck ausgeführt.
Mit Bison Grammatikregeln, kann mir jemand ein Beispiel dafür, wie ich es tun kann? Hier
ist ein piec meines Bison-Code, das zeigt, was ich habe bisher:
%union{
int d;
char *s;
}
%token <d>INTEGER
%token <s>VARIABLE
%nonassoc IF
%type <d>expr
%type <s> statement
%error-verbose
%left '+' '-'
%left '*' '/'
%left POWER
%right '!'
%%
program:
program statement {printf("Prefix notation of given expression: %s \n", stack[head]); /*Print final expression*/ }
|
;
statement:
expr '\n' { /* printf(" = %d \n", $1); */}
| VARIABLE '=' expr { sym[get_var_index($1)] = $3; printf(" = %d \n", $3); printf("Assigning var %s = %d index %d \n", $1, sym[get_var_index($1)],get_var_index($1)); }
| '(' expr ')' IF '('statement')' '\n' {printf("Bison found if statement: if(stmnt) then stmnt \n"); ($2)?$6: printf("False \n");}
|'\n'
;
expr:
INTEGER { $$ = $1; pushInt($1); printf("Got an Integer %d \n", $1);}
| VARIABLE { $$= sym[get_var_index($1)]; pushChars($1); printf("Printing %s = %d \n", $1, sym[get_var_index($1)]); }
| expr '+' expr { $$ = $1 + $3; popAndCalc("+"); }
| expr '-' expr { $$ = $1 - $3; popAndCalc("-"); }
| expr '*' expr { $$ = $1 * $3; popAndCalc("*"); }
| expr '/' expr { $$ = $1/$3; popAndCalc("/"); }
| expr POWER expr { $$ = pow($1, $3); popAndCalc("**"); }
| '(' expr ')' { $$ = $2;}
| '!' expr { $$ = !$2; popAndCalc("!"); }
Wenn ich es jedoch laufen, es den Block läuft auch wenn es falsch:
Wie kann Ich löse das auf? Ich glaube, ich bin etwas fehlt, bitte helfen ...