Flex和野牛计算器
问题描述:
我试图实现一个计算器或表达式,如使用Flex和Bison的true nor true nor (false nor false)
,但我不断收到我的错误消息。这里是我的.L文件:Flex和野牛计算器
%{
#include <stdlib.h>
#include "y.tab.h"
%}
%%
("true"|"false") {return BOOLEAN;}
.|\n {yyerror();}
%%
int main(void)
{
yyparse();
return 0;
}
int yywrap(void)
{
return 0;
}
int yyerror(void)
{
printf("Error\n");
}
这里是我的.Y文件:
/* Bison declarations. */
%token BOOLEAN
%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; }
;
%%
有谁看到这个问题?
答
简单的方法来处理所有的单字符标记,其作为@vitaut正确地说,你是不是在处理所有的呢,是返回yytext[0]
为圆点规则,让解析器理清哪些是合法的。
你也失去了值的布尔值“真”和“假”,应分别存入的yylval为1和0,那么将在$1,
$3
等转起来。如果你将有更长期的更多数据类型,您需要查看%union
指令。
答
你得到错误的原因是你的词法分析器只识别一种类型的令牌,即BOOLEAN
,但不包括换行符,括号或nor
(并且你为其他所有内容产生错误)。对于单个字母令牌像括号和换行符您可以返回字符本身作为一个记号类型:
\n { return '\n'; }
对于nor
以为像你这样为BOOLEAN
您应该引入一个令牌类型,并添加适当的规则词法分析器。