我已经在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;
}
最佳答案
您面临的明显问题是,在解析完两个操作数之后就解析了运算符。因此,仅凭printf就无法实现它。一种解决方案是创建一个巨大的char数组(可以将其设置为全局),而不是使用printf,您可以继续添加它。因此,例如,当您遇到+时(假设final是您的全局变量)。
char temp[100];
sprintf(temp, "%s%s", "+", final);
strcpy(final, temp);
解析完成后,即yyparse()返回时,可以进行printf(“%s”,final);