我正在尝试编写一个yacc程序,该程序从用户那里获取其运算符的优先级,然后使用这些优先级规则来计算中缀表达式。
我尝试使用%left旁边的字符变量来定义优先级,然后在调用yyparse()函数之前将这些字符变量分配给我想要的运算符。类似的东西:
<a href = "/public/news.pdf" download> </a>
这不能直接给出编译错误和转移/减少错误警告。我也读过关于%prec但我不认为我可以用它来解决这个问题
答案 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();
}