lex和yacc:一个语法错误的简单计算器

时间:2014-01-20 04:05:33

标签: yacc lex

一个简单的计算器仅支持+ - * /和整数。我使用GNU / Linux。

hoc1.l:

%{
#include "y.tab.h"
extern int yylval;
%}

%%
[ \t] { ; }
[0-9]+ { sscanf(yytext, "%d", &yylval); printf("\nget %d\n", yylval); return NUMBER; }
\n  {return 0;}
%%

int yywrap(void) {
    return 1;
}

hoc1.y

%{
#include<stdio.h>
#define YYSTYPE int
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%%
list:   
    | list '\n'
    | list expr '\n'  {printf("\t%d\n",$2);}
    ;
expr:   NUMBER        { $$ = $1; }
    |   expr '+' expr {$$ = $1+$3;}
    |   expr '-' expr {$$ = $1-$3;}
    |   expr '*' expr {$$ = $1*$3;}
    |   expr '/' expr {$$ = $1/$3;}
    ;
%%

int main(void)
{
    yyparse();
    return 0;
}

int yyerror(char *s) {
    fprintf(stderr, "*%s*\n", s);
    return 0;
}

运行时间错误:

% ./hoc
8+9

get 8
+
get 9
*syntax error*

为什么以及如何解决它,thx!

1 个答案:

答案 0 :(得分:3)

您忘记将您的运算符包含在您的lex文件中,并且您应该在成功读取令牌时返回非零值:直观地返回0表示yylex没有匹配。删除处理换行符的lex文件中的行,并将其替换为以下内容:

[-+*/\n] { return *yytext; }
. { yyerror("unrecognized character"); return 0; }

现在它应该工作了。返回*yytext允许您的yacc语法成功解析表达式,例如如果你得到'+',则返回它以允许语法正确解析。