我正在使用Flex和Bison编写一个计算器。这是我的.l文件:
%{
#include <stdlib.h>
#include "y.tab.h"
%}
%%
("true"|"false") {return BOOLEAN;}
"nor" {return NOR;}
. {return yytext[0];}
%%
int main(void)
{
yyparse();
return 0;
}
int yywrap(void)
{
return 0;
}
int yyerror(void)
{
getchar();
printf("Error\n");
}
这是我的.y文件:
/* Bison declarations. */
%token BOOLEAN
%token NOR
%left 'nor'
%% /* The grammar follows. */
input:
/* empty */
| input line
;
line:
'\n'
| exp '\n' { printf ("%s",$1); }
;
exp:
BOOLEAN { $$ = $1; }
| exp 'nor' exp { $$ = !($1 || $3); }
| '(' exp ')' { $$ = $2; }
;
%%
问题在于,如果我输入诸如“true或false”之类的输入,则词法分析器只会到return BOOLEAN
,然后到return yytext[0]
,然后抛出我的错误(在flex代码中)。有谁看到了什么问题?
答案 0 :(得分:1)
问题在于:
%left 'nor'
和
exp:
BOOLEAN { $$ = $1; }
| exp 'nor' exp { $$ = !($1 || $3); }
| '(' exp ')' { $$ = $2; }
;
你将'nor'
写成终端令牌,你的解析器无法将'nor'识别为令牌,所以你应该用NOR
替换它,因为词法分析器返回:
"nor" {return NOR;}
溶液
%left NOR
and
exp:
BOOLEAN { $$ = $1; }
| exp NOR exp { $$ = !($1 || $3); }
| '(' exp ')' { $$ = $2; }
;
答案 1 :(得分:0)
你的词法分析者还需要识别空格。制定另一条规则“”。你不需要动作