C Flex Bison未读取完整输入

C Flex Bison未读取完整输入,c,bison,yacc,lex,flex-lexer,C,Bison,Yacc,Lex,Flex Lexer,我正在使用Flex和Bison编写nor计算器。这是我的.l文件: %{ #include <stdlib.h> #include "y.tab.h" %} %% ("true"|"false") {return BOOLEAN;} "nor" {return NOR;} . {return yytext[0];} %% int main(void) { yyparse(); return

我正在使用Flex和Bison编写nor计算器。这是我的.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");
}

问题是,如果我键入“true或false”之类的输入,lexer只会进入
返回布尔值
,然后
返回yytext[0]
,然后抛出我的错误(在flex代码中)。有人看到哪里不对劲了吗?

你的lexer还需要识别空白。制定另一条规则。您不需要动作

您的lexer还需要识别空白。制定另一条规则。您不需要操作

问题在于:

%left 'nor'

您将
'nor'
写为终端令牌,解析器无法将'nor'识别为令牌,因此当lexer返回时,您应该将其替换为

"nor"               {return NOR;}
解决方案

    %left NOR

and 

    exp:
       BOOLEAN            { $$ = $1;           }
     | exp NOR exp      { $$ = !($1 || $3);  }
     | '(' exp ')'        { $$ = $2;           }
     ;
问题在于:

%left 'nor'

您将
'nor'
写为终端令牌,解析器无法将'nor'识别为令牌,因此当lexer返回时,您应该将其替换为

"nor"               {return NOR;}
解决方案

    %left NOR

and 

    exp:
       BOOLEAN            { $$ = $1;           }
     | exp NOR exp      { $$ = !($1 || $3);  }
     | '(' exp ')'        { $$ = $2;           }
     ;

对不起,我的意思是我的错误-我的flex代码中的错误。我删除了flex标记(用于Adobe/Apache UI框架)并将其替换为用于词法分析器的gnu flex。因为
flex
有一个规则,当它看到
或“
”时返回
,我认为,在这种情况下,你的bison
exp
子句应该是
exp或exp
。此外,在布尔值的情况下,您没有将关联的字符串转换为实际的布尔值,因此稍后当您尝试计算结果时,它没有执行您认为是的操作。可能还有更多…替换exp或exp允许我访问所有令牌,但现在我得到消息“conflications:1shift/reduce”。有什么线索导致这种情况吗?对不起,我的意思是我的错误-我的flex代码中的错误。我删除了flex标记(用于Adobe/Apache UI框架)并将其替换为用于词法分析器的gnu flex。因为
flex
有一个规则,当它看到
时返回
,我认为,在这种情况下,你的bison
exp
子句应该是
exp或exp
。此外,在布尔值的情况下,您没有将关联的字符串转换为实际的布尔值,因此稍后当您尝试计算结果时,它没有执行您认为是的操作。可能还有更多…替换exp或exp允许我访问所有令牌,但现在我得到消息“conflications:1shift/reduce”。有什么线索导致这一点吗?这使我能够进入语句的“nor”部分,但我仍然无法进入“false”部分。这使我能够进入语句的“nor”部分,但仍然无法进入“false”部分。谢谢,这帮助我解析了整个输入字符串。然而,我似乎没有产生任何结果输出。你知道为什么会这样吗?你有没有定义过你的YYSTYPE,YYSTYPE的默认类型是int,所以如果你想写你的结果,你应该首先将YYSTYPE重新定义为char*,而不是在你的lexer中,你评估你的yylval(为了能够存储$1,$2…)的值,$$将得到整个结果,这帮助我解析整个输入字符串。然而,我似乎没有产生任何结果输出。你知道为什么会这样吗?你有没有定义过你的YYSTYPE,YYSTYPE的默认类型是int,所以如果你想写你的结果,你应该首先将YYSTYPE重新定义为char*,而不是在你的lexer中,你评估你的yylval(为了能够存储$1,$2…)的值,$$将得到整个结果