2017-02-28 63 views
0

我在Flex和Bison中創建了一個計算器。我需要能夠打印來自標準輸入的任何表達式的前綴表示法。我能夠輕鬆打印修補後記號,但是我在做前綴記號時遇到了困難。以下是我在野牛迄今完成:野牛 - 在簡單的計算器中打印前綴記法

%{ 
#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 

int yylex(void); 
void yyerror(char *); 
int sym[26]; 
%} 

%token INTEGER VARIABLE 

%left '+' '-' 
%left '*' '/' 
%left POWER 
%right '!' 



%% 
program: 
    program statement '\n' 
    | 
    ; 

statement: 
    expr    { printf("\n%d \n", $1); } 
    | 
    VARIABLE '=' expr { sym[$1] = $3;printf("\n"); } 
    ; 

expr: 
    INTEGER   { /*printf("%d",yylval);*/} 
    | VARIABLE  { $$ = sym[$1]; printf("%d",sym[$1]);} 
    | expr '+' expr { $$ = $1 + $3; printf("+");} 
    | expr '-' expr { $$ = $1 - $3; printf("-");} 
    | expr '*' expr { $$ = $1 * $3; printf("*");} 
    | expr '/' expr { $$ = $1/$3; printf("/");} 
    | expr POWER expr { $$ = pow($1, $3);printf("pow");} 
    | '(' expr ')' { $$ = $2;} 
    | '!' expr  { $$ = !$2; printf("!");} 

    ; 


%% 
void yyerror(char *s) { 
    fprintf(stderr, "%s\n", s); 
} 

int main(void) { 
    yyparse(); 
    return 0; 
} 
+0

這是您的前綴?它看起來像後綴。 – user3344003

回答

0

,你所面臨的明顯的問題是,運營商進行解析後,兩個操作數解析。所以你不能用printf來實現它。一種解決方案是創建一個巨大的char數組(可以使其成爲全局數組),而不是使用printf,可以繼續使用它。因此,例如當你遇到+時,(假設final是你的全局變量)。當你完成解析時,也就是當yyparse()返回時,你可以使用printf(「%s」,final);