此YACC规范是否正确识别中缀表达式?

时间:2012-10-18 05:27:25

标签: compiler-construction yacc

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

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

现在可以吗?

1 个答案:

答案 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
    ;