再次修改。删除递归后,编写中缀表达式的代码: 它还包含优先级检查,没有递归语法,也没有启动非终端和错误消息。
%{
#include<stdio.h>
%}
%token ALPHA NUMBER PLUS MINUS MUL DIV LPAR RPAR
%%
expr : expr PLUS term { printf("its an infix expression"); }
| expr MINUS term
| term
;
term : term MUL factor
| term DIV factor
| factor
;
factor : LPAR expr RPAR
| NUMBER
| ALPHA
;
%%
main()
{
yyparse();
}
int yyerror (char *s)
{
printf("Not an infix expression");
}
现在可以吗?
答案 0 :(得分:1)
不,不是。除了所有冲突之外,它没有定义任何运算符优先级。互联网上有很多正确的LR表达式语法例子。
编辑:一元减号进入缺失的primary
规则。从factor
起,它通常是这样的:
factor: primary
| primary '^' factor // exponentiation, note right-recursion for right-associativitity, or use %prec
;
primary: '(' expr ')'
| '-' primary // unary minus; note recursion, to allow any number of them
| NUMBER
| IDENTIFIER
;