在更大的程序中,我给出了以下内容(flex/bison)
In 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
我怎样才能让它做加法?
{pn}?{dig}+
不要使用加号或减号 ({pn?}
) 数字标记的一部分。将它们视为两个单独的令牌,+
and 2
。那么flex就不会有任何需要解决的歧义了。
{dig}+
相反,让 bison 处理一元加号和减号运算符。让它成为解析器的工作,而不是词法分析器的工作。
| PLUS_SIGN expr
{
$$ = +$2;
printf(" $$=%f\n",$$);
}
| MINUS_SIGN expr
{
$$ = -$2;
printf(" $$=%f\n",$$);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)