它基于this article,但使用lex
而不是自己实现。
但我尝试了各种表达方式,例如2+3
,都失败了......
法:
0 {
yylval = atoi(yytext);
}
[1-9][0-9]* {
yylval = atoi(yytext);
return NUM;
}
[-+*/()] {
return *yytext;
}
[ \t\n]+ ;
. yyerror("Unknown character");
YACC:
%start prob
%token NUM
%%
prob : expr '\n'
{
printf("\t=%X\n", $1);
return 0;
}
;
expr : expr '+' term
{
$$ = $1 + $3;
}
| expr '-' term
{
$$ = $1 - $3;
}
| term
{
$$ = $1;
}
;
term : term '*' NUM
{
$$ = $1 * $3;
}
| term '/' NUM
{
$$ = $1/$3;
}
| '(' expr ')'
{
$$ = $2;
}
| NUM
{
$$ = $1;
}
;
%%
答案 0 :(得分:0)
这是因为:
[ \t\n]+ ;
将\n
移至[-+*/()]
。
答案 1 :(得分:0)
首先取消测试0即
0 {
yylval = atoi(yytext);
}
这对你没有帮助。现在应该可以了。