为什么我的计算器总是报告“语法错误”?

时间:2011-07-28 08:34:44

标签: yacc lex

它基于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;
}
;

%%

2 个答案:

答案 0 :(得分:0)

这是因为:

[ \t\n]+    ; 

\n移至[-+*/()]

答案 1 :(得分:0)

首先取消测试0即

0   {
    yylval = atoi(yytext);
}

这对你没有帮助。现在应该可以了。