在较大的程序中,我给出了以下(flex / bison)
在flex中:
pn [\+|\-]
dig [0-9]+
exp [e|E]{dig}+
"+" {printf("+ detected\n");
return PLUS_SIGN;}
{pn}?{dig}+ { printf("digit detected - %s\n",yytext);
sscanf(yytext, "%d", (int*)&yylval);
return TYPE_INT;}
在野牛:
expr:
expr PLUS_SIGN expr
{
$$ = $1 + $3;
printf(" $$=%f\n",$$);
}
| TYPE_INT
{
$$ = (int)$1;
printf(" $$=%f\n",$$);
}
;
问题是:
当我给2 + 2时,它识别2和+2而不是2,+,2
我怎样才能让它进行添加?
答案 0 :(得分:5)
{pn}?{dig}+
不要在数字标记上加号或减号({pn?}
)。将它们视为两个单独的令牌+
和2
。然后flex不会有任何歧义解决。
{dig}+
相反,让野牛处理一元加减运算符。使它成为解析器的工作,而不是词法分析器。
| PLUS_SIGN expr
{
$$ = +$2;
printf(" $$=%f\n",$$);
}
| MINUS_SIGN expr
{
$$ = -$2;
printf(" $$=%f\n",$$);
}
答案 1 :(得分:1)
语法显示PLUS_SIGN的左侧部分和右侧部分在减少符号时具有相同的优先级.PLUS_SIGN是左组合,因此新语法如下:
expr: expr PLUS_SIGN expr2
{
$$ = $1 + $3;
printf("$$=%f\n", $$);
}
| expr2
{
$$ = $1;
}
;
expr2: TYPE_INT
{
$$ = (int)$1;
printf(" $$=%f\n",$$);
}
;