C Flex Bison未读取完整输入
我正在使用Flex和Bison编写nor计算器。这是我的.l文件: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
%{
#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
有一个规则,当它看到或“
”时返回或,我认为,在这种情况下,你的bisonexp
子句应该是exp或exp
。此外,在布尔值的情况下,您没有将关联的字符串转换为实际的布尔值,因此稍后当您尝试计算结果时,它没有执行您认为是的操作。可能还有更多…替换exp或exp允许我访问所有令牌,但现在我得到消息“conflications:1shift/reduce”。有什么线索导致这种情况吗?对不起,我的意思是我的错误-我的flex代码中的错误。我删除了flex标记(用于Adobe/Apache UI框架)并将其替换为用于词法分析器的gnu flex。因为flex
有一个规则,当它看到或时返回或,我认为,在这种情况下,你的bisonexp
子句应该是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…)的值,$$将得到整个结果