2017-04-04 35 views
0

我想实现一个简单的if语句在Flex和野牛以下形式:野牛Yacc的声明如果总是执行

(表情)(表情)

如果左边表达式是非零?值,那么正确的表达式将被执行。

使用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

基本问题是您在解析它时无条件地执行代码。因此,无论上下文如何,程序中的所有内容都只执行一次。解决问题的通用解决方案是将执行与解析分开 - 而不是在解析时执行,而是解析某种可以稍后执行的数据结构。然后,当你想执行一些代码时,你只执行该代码。这可以处理条件,循环,功能以及将来可能想要做的任何其他事情。