Bison yacc中的用户定义运算符优先级

Bison yacc中的用户定义运算符优先级,bison,yacc,Bison,Yacc,我正在尝试编写一个yacc程序,它从用户那里获取其运算符的优先级,然后使用这些优先级规则来计算中缀表达式 我尝试通过使用%left旁边的字符变量来定义优先级,然后在调用yyparse函数之前将这些字符变量分配给我想要的运算符。比如: %left op1 %left op2 %left op3 %left op4 如果直接给出编译错误和shift/reduce错误警告,则无法工作。我也读过关于%prec的文章,但我认为我不能用它来解决这个问题。简单的方法是让lexer根据优先级返回一个合适的to

我正在尝试编写一个yacc程序,它从用户那里获取其运算符的优先级,然后使用这些优先级规则来计算中缀表达式

我尝试通过使用%left旁边的字符变量来定义优先级,然后在调用yyparse函数之前将这些字符变量分配给我想要的运算符。比如:

%left op1
%left op2
%left op3
%left op4

如果直接给出编译错误和shift/reduce错误警告,则无法工作。我也读过关于%prec的文章,但我认为我不能用它来解决这个问题。简单的方法是让lexer根据优先级返回一个合适的tokentype。这意味着是lexer而不是解析器配置了优先级值。解析器必须在其固定语法中有足够的级别

这里有一个非常简单的示例,仅用于说明基本思想

扫描仪:

%{
  #include "parser.tab.h"
  extern int precs[256];
%}

%option noinput nounput noyywrap nodefault
%%
[[:space:]]+    ;
[[:digit:]]+    { yylval = atoi(yytext); return INT; }
.    {  yylval = (unsigned char)*yytext ;
        return precs[yylval] ? precs[yylval] : yylval;
     }
解析器:

/* Probably you will need more of these */
%token INT
%left OP1
%left OP2
%left OP3
%left OP4

%%
expr: expr OP1 expr
    | expr OP2 expr
    | expr OP3 expr
    | expr OP4 expr
    | INT
司机

#include "parser.tab.h"
int precs[0] = { 0 };

int main(void) {
     precs['+'] = precs['-'] = OP1;
     precs['*'] = precs['/'] = OP2;
     return yyparse();
}
yacc不能这样做。它的运算符prefore me是静态定义的。