0

再次修改。删除递归后,为中缀表达式编写代码:它还包含优先级检查,没有递归语法,没有开始非终端,还有一个错误消息。

%{
#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");
}

现在可以了吗?

4

1 回答 1

1

不,不是。除了所有冲突之外,它没有定义任何运算符优先级。Internet 上有大量正确的 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
    ;
于 2012-10-18T07:31:55.603 回答