【发布时间】:2015-04-16 11:33:50
【问题描述】:
我是 lex 和 yacc 程序的新手。我一直在尝试编写一个 yacc 程序,该程序将算术表达式作为输入,并将后缀符号作为输出。 我使用的语法是: exp : exp + 期限 | exp - 期限 |学期 术语:术语*因子 |术语/因素 |因素 因素:数量
这是我的 lex 代码:
%{
extern int yylval;
#include "y.tab.h"
%}
%%
[0-9]+ {yylval = atoi(yytext);return INTEGER;}
[ \t\n] /* skip whitespace */
. {return *yytext;}
%%
int yywrap(void) {
return 1;
}
这是我的 yacc 程序:
%{
#include<stdio.h>
%}
%token INTEGER
%left '+' '-'
%left '*' '/'
%%
E: E '+' T {printf("+");}
| E '-' T {printf("-");}
| T
;
T: T '*' F {printf("*");}
| T '/' F {printf("/");}
| F
;
F: '(' E ')'
| INTEGER {printf("%d",yylval);}
;
%%
int main(){
yyparse();
}
int yyerror (char *msg) {
return printf ("error YACC: %s\n", msg);
}
但是这段代码编译正确。但是如果表达式中使用了“+”或“-”,则输出不正确 例如输入:2+3 输出:23(而不是 23+) 请帮助我找出代码中的错误。 谢谢。
【问题讨论】:
-
您的语法只接受一个表达式。如果在表达式之后关闭输入,它将正确打印。
-
另请注意,您不需要 T 非终结符,因为您使用运算符优先级指定相同。
标签: compiler-construction yacc lex bnf postfix-notation