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

时间:2018-02-07 05:53:37

标签: bison yacc

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

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

<a href = "/public/news.pdf" download> </a>

这不能直接给出编译错误和转移/减少错误警告。我也读过关于%prec但我不认为我可以用它来解决这个问题

1 个答案:

答案 0 :(得分:1)

执行此操作的简单方法是让词法分析器根据优先级返回适当的tokentype。这意味着它是词法分析器而不是使用优先级值配置的解析器。解析器只需要在其(固定)语法中有足够的级别。

这是一个非常简单的例子,仅用于说明基本概念。

扫描仪:

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