foo*_*oty 0 c parsing lex calculator bison
在较大的程序中,我给出了以下(flex/bison)
在flex中:
pn [\+|\-]
dig [0-9]+
exp [e|E]{dig}+
Run Code Online (Sandbox Code Playgroud)
.
.
.
"+" {printf("+ detected\n");
return PLUS_SIGN;}
{pn}?{dig}+ { printf("digit detected - %s\n",yytext);
sscanf(yytext, "%d", (int*)&yylval);
return TYPE_INT;}
Run Code Online (Sandbox Code Playgroud)
在野牛:
expr:
expr PLUS_SIGN expr
{
$$ = $1 + $3;
printf(" $$=%f\n",$$);
}
| TYPE_INT
{
$$ = (int)$1;
printf(" $$=%f\n",$$);
}
;
Run Code Online (Sandbox Code Playgroud)
问题是:
当我给2 + 2时,它识别2和+2而不是2,+,2
我怎么能让它做这个添加?
{pn}?{dig}+
Run Code Online (Sandbox Code Playgroud)
不要{pn?}使用数字标记的加号或减号()部分.将它们视为两个独立的标记,+并且2.然后flex不会有任何歧义解决.
{dig}+
Run Code Online (Sandbox Code Playgroud)
相反,让野牛处理一元加减运算符.使它成为解析器的工作,而不是词法分析器.
| PLUS_SIGN expr
{
$$ = +$2;
printf(" $$=%f\n",$$);
}
| MINUS_SIGN expr
{
$$ = -$2;
printf(" $$=%f\n",$$);
}
Run Code Online (Sandbox Code Playgroud)