在BISON中,对于带有模运算符的一元负号表达式,会出现语法错误。例如,以下代码:
%{
#include
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%right UMINUS
%left '%'
%%
expr: expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '-' expr %prec UMINUS
| expr '%' expr
| NUMBER
;
%%
int main()
{
yyparse();
return 0;
}
int yyerror(char* error)
{
printf("Error: %s\n", error);
return 0;
}
int yylex()
{
...
}
当输入类似于"-5 % 2"的表达式时,会提示以下错误:
Error: syntax error, unexpected %token, expecting UMINUS
为了解决这个问题,我们需要修改BISON规则。具体来说,需要使用一个额外的符号来表示一元负号和模运算符的结合。然后,在语法规则和代码中将其解析为相应的操作符。
修改后的代码如下所示:
%{
#include
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%right UMINUS
%left '%'
%token NEG_MOD
%%
expr: expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '-' expr %prec UMINUS
| expr NEG_MOD expr
| NUMBER
;
%%
int main()
{
yyparse();
return 0;
}
int yyerror(char* error)
{
printf("Error: %s\n", error);
return 0;
}
int yylex()
{
...
}
int yyparse()
{
...
{
case NEG_MOD:
printf(" % % ");
break;
...
}
}
现在,可以通过输入"-5 % 2"的表达式来解析一元负号
上一篇:Bison输出文件的含义是什么?