2017-04-04 5 views
0

を実行する場合:左の式が非ゼロの場合バイソンYaccのステートメントは、常に私は、次の形式でのFlexとバイソンであれば、簡単な文を実装しようとしています

(式)(式)

?右の式が実行されます。

Bisonの文法規則を使用して、どのように私がそれを行うことができるかの例を誰にでも教えてください。ここで

は、これまでのところ、私が持っているものを示して私のバイソンコードのPIECです:

%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("!"); } 

が、私はしかし、それを実行すると、それが偽だ場合でも、ブロックを実行します: enter image description here

どのようにすることができます私はこれを解決する?私は何かが欠けていると思う、助けてください...

答えて

3

本質的な問題は、あなたがそれを解析する際にあなたのコードを無条件で実行しているということです。コンテキストに関係なく、プログラム内のすべてが正確に1回実行されます。問題の一般的な解決方法は、解析を実行から分離することです。解析する際に実行するのではなく、後で実行できる何らかのデータ構造を解析します。次に、コードを実行したいときは、そのコードだけを実行します。これは、条件、ループ、関数、および将来あなたが望むかもしれない何かを処理できます。

関連する問題