Flex和Bison计算器

时间:2013-02-28 05:32:16

标签: c bison yacc lex flex-lexer

我尝试使用Flex和Bison来实现计算器的表达式,例如true nor true nor (false nor false),但我不断收到错误消息。这是我的.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;           }
 ;
 %%

有没有人看到这个问题?

2 个答案:

答案 0 :(得分:1)

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

\n { return '\n'; }

对于nor,您应该像为BOOLEAN一样引入令牌类型,并为词法分析器添加适当的规则。

答案 1 :(得分:1)

处理所有单字符令牌的简单方法,正如@vitaut正确地说你还没有完全处理的那样,是返回yytext[0]点规则,并让解析器整理出来这些是合法的。

你也失去了BOOLEAN'true'和'false'的值,它们应该分别存储在yylval中为1和0,然后在$1, $3等中出现。如果您将在更长的时间内拥有更多数据类型,则需要查看%union指令。