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

Compiler construction 此YACC规范用于识别中缀表达式是否正确?,compiler-construction,yacc,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 ;

再次修改。删除递归并为中缀表达式编写代码后: 它还包含优先级检查、无递归语法、无起始非终止以及错误消息

%{
#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");
}
%{
#包括
%}
%令牌ALPHA数加上减去MUL DIV LPAR RPAR
%%
expr:expr加上术语{printf(“它是一个中缀表达式”);}
|表达式负项
|术语
; 
术语:术语多因子
|术语分割因子
|因素
;
因子:LPAR expr RPAR
|数
|阿尔法
;
%%
main()
{
yyparse();
}
int yyerror(字符*s)
{
printf(“非中缀表达式”);
}

现在可以了吗?

不行。除了所有冲突之外,它没有定义任何运算符优先级。互联网上有很多LR表达式语法的正确示例

编辑:一元负号进入缺少的
规则。从
因子
中,通常是这样的:

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
    ;

start->expr->start
是一个问题为什么要添加运算符优先级?我只需要检查它是否是中缀表达式,而不计算表达式。@Anubha如果不想支持运算符优先级,则不支持,好的。但这不是唯一的问题。您的基本问题是,您的产品都是左递归和右递归。看一看一些LR示例将向您展示如何做到这一点。但请注意,它们也将显示运算符优先级:-现在非常接近。没有一元负号?“开始”这个名称不好:这实际上是“目标符号”,而不是开始状态:代码块只有在“expr”被完全解析后才会执行,因此它应该被称为类似“program”或“infix”的名称,或者甚至可以去掉它,只使用“expr”作为目标符号。如果要重写yyerror(),则需要编写一些有用的内容,否则也可以根本不重写它。您当然不想仅仅抑制这样的解析错误。非常感谢您的支持。我试着用一元负数作为负数表达式,但它引起了移位减少冲突。我认为代码现在还可以通过。。