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("!"); }
が、私はしかし、それを実行すると、それが偽だ場合でも、ブロックを実行します:
どのようにすることができます私はこれを解決する?私は何かが欠けていると思う、助けてください...