1

我正在尝试为 nor 表达式实现计算器,例如true nor true nor (false nor false)使用 Flex 和 Bison,但我不断收到错误消息。这是我的 .l 文件:

%{
#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;           }
 ;
 %%

有没有人看到问题?

4

2 回答 2

1

出现错误的原因是您的词法分析器仅识别一种类型的标记,即BOOLEAN,但不能识别换行符、括号或nor(并且您会为其他所有内容产生错误)。对于像括号和换行符这样的单字母标记,您可以将字符本身作为标记类型返回:

\n { return '\n'; }

考虑一下,nor您应该像之前那样引入一个标记类型BOOLEAN,并向词法分析器添加一个适当的规则。

于 2013-02-28T05:52:45.163 回答
1

处理所有单字符标记的简单方法(正如@vitaut 正确地表示您根本还没有处理)是返回yytext[0]点规则,并让解析器找出哪些是合法的。

您还丢失了布尔值“true”和“false”的值,它们应该分别作为 1 和 0 存储到 yylval 中,然后它们会出现在$1, $3等等。如果你要在长期内拥有更多的数据类型,您需要查看%union指令。

于 2013-02-28T06:13:09.403 回答