野牛,简单的计算器程序

时间:2013-05-08 18:45:40

标签: bison flex-lexer

我想为简单的计算器制作解析器,但我不能理解我为简单输入而出错。 Flex文件看起来像这样

%{
#include "exp.tab.h"
#include <string.h>
%}

blanks          [ \t\n]+


%%

{blanks}        { /* ignore */ }
[0-9]+           {yylval= strtol(yytext, NULL, 10);
return(NUMB);}

%%

Bison文件如下所示:

%{
#include <stdio.h>
%}


%token NUMB


%left '+'


%%

exp:
NUMB                { $$ = $1;           }
| exp '+' exp        { $$ = $1 + $3;      }

%%
int yyerror(char *s) {
printf("yyerror : %s\n",s);
}

int main(void) {
yyparse();
}

输入

123 + 12

我收到错误消息。为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

您的词法分析器缺少匹配/返回'+'令牌的规则。尝试在最后添加:

.    { return *yytext; }  /* any other single character returns as itself */

如果文本与任何规则不匹配,则默认词法分析器操作是打印并跳过它。因此,从解析器获得的错误是因为它将123 12作为输入,这会导致语法错误。