2017-04-04 4 views
0

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: enter image description here

Wie kann Ich löse das auf? Ich glaube, ich bin etwas fehlt, bitte helfen ...

Antwort

3

Das wesentliche Problem ist, dass Sie Ihren Code unbedingt ausgeführt werden, wie Sie es analysieren. So wird alles im Programm genau einmal ausgeführt, unabhängig vom Kontext. Die allgemeine Lösung für Ihr Problem besteht darin, die Ausführung vom Parsing zu trennen. Anstatt bei der Analyse zu analysieren, parsen Sie in eine Art Datenstruktur, die später ausgeführt werden kann. Wenn Sie dann Code ausführen möchten, führen Sie nur diesen Code aus. Dies kann Bedingungen, Schleifen, Funktionen und alles, was Sie in Zukunft tun möchten, berücksichtigen.