在较大的程序中,我给出了以下内容(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;}在Bison中:
expr:
expr PLUS_SIGN expr
{
$$ = $1 + $3;
printf(" $$=%f\n",$$);
}
| TYPE_INT
{
$$ = (int)$1;
printf(" $$=%f\n",$$);
}
;问题是:
当我给2+2时,它识别2和+2,而不是2,+,2
我怎样才能让它做加法呢?
发布于 2012-09-22 12:47:50
{pn}?{dig}+不要将加号或减号({pn?})作为数字标记的一部分。将它们视为两个独立的令牌,+和2。那么flex就不会有任何歧义需要解决了。
{dig}+相反,让bison处理一元加号和减号运算符。让它成为解析器的工作,而不是词法分析器的工作。
| PLUS_SIGN expr
{
$$ = +$2;
printf(" $$=%f\n",$$);
}
| MINUS_SIGN expr
{
$$ = -$2;
printf(" $$=%f\n",$$);
}发布于 2012-09-22 16:45:54
当reducing symbol.The PLUS_SIGN是左组合时,语法显示PLUS_SIGN的左部分和右部分具有相同的优先级,因此新的语法如下:
expr: expr PLUS_SIGN expr2
{
$$ = $1 + $3;
printf("$$=%f\n", $$);
}
| expr2
{
$$ = $1;
}
;
expr2: TYPE_INT
{
$$ = (int)$1;
printf(" $$=%f\n",$$);
}
;https://stackoverflow.com/questions/12540757
复制相似问题