Flex Bison没有阅读全部输入

时间:2013-02-28 15:05:49

标签: c bison yacc lex flex-lexer

我正在使用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代码中)。有谁看到了什么问题?

2 个答案:

答案 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)

你的词法分析者还需要识别空格。制定另一条规则“”。你不需要动作