为何我的Flex词法分析程序出现‘rule cannot be matched’警告?
解决Flex+Bison的"rule cannot be matched"警告
你的Flex(.l)代码:
"if" {return IF;} "else" {return ELSE;} "For" {return FOR;} . {printf("SYNTAX ERROR .. EXIT ..");exit(0);}
Bison(.y)里的token定义:
%token IF ELSE FOR
出现三条"warning, rule cannot be matched"警告的核心原因:
- Bison在生成语法分析器时,会校验所有定义的token是否在语法产生式规则中被实际使用。你仅在.y文件里声明了IF、ELSE、FOR这三个token,但没有编写任何用到这些token的语法规则(比如
stmt : IF '(' expr ')' stmt这类语句规则),Bison判定这些token永远不会被语法分析器匹配到,因此抛出警告。
额外提个细节:Flex里匹配的是大写开头的"For",如果输入小写的for会触发错误退出,若需要匹配小写或大小写不敏感的for,需调整Flex规则,但这不是当前警告的诱因。
要消除警告,只需在Bison的.y文件中添加使用这些token的语法产生式即可,比如定义条件语句、循环语句的对应规则。
内容的提问来源于stack exchange,提问作者Acno_Sama
相关产品推荐
相关产品推荐

