使用Lex编译时出现规则无法匹配警告的问题求助
问题原因
你的operand规则永远不会被匹配,核心原因是Lex的规则匹配逻辑:
- 优先匹配最长的输入串
- 长度相同时,先定义的规则优先触发
你定义的operand是entier、id、reel的合集,但任何符合operand的输入,都会被前面的id、entier或reel规则先捕获,operand规则完全没有触发的机会,所以Lex会抛出“规则无法匹配”的警告。
另外注意你定义的let [a-z|A-Z]有个小错误:字符集里的|会被当成普通字符,导致|会被识别为合法的标识符开头,正确写法应该是[a-zA-Z]。
解决方案
根据你的需求选择对应的方案:
方案1:统一返回OPR token
如果不需要区分IDENT、INT、REEL,只想把这三类都作为OPR返回,直接删掉前面三个具体规则,只保留operand规则:
%option noyywrap %{ #include<stdlib.h> #include<stdio.h> #include "y.tab.h" %} chif [0-9] let [a-zA-Z] entier {chif}+ id {let}(_?({let}|{chif})+)* reel {chif}+,{chif}+ operand ({entier}|{id}|{reel}) %% {operand} {return(OPR);} . {yyerror();} %%
方案2:保留区分的token,删除无用的operand规则
如果需要分别返回IDENT、INT、REEL,那operand规则完全没有存在的意义,直接删掉它即可:
%option noyywrap %{ #include<stdlib.h> #include<stdio.h> #include "y.tab.h" %} chif [0-9] let [a-zA-Z] entier {chif}+ id {let}(_?({let}|{chif})+)* reel {chif}+,{chif}+ %% {id} {return(IDENT);} {entier} {return(INT);} {reel} {return(REEL);} . {yyerror();} %%
内容的提问来源于stack exchange,提问作者IMENE BELGHEIR
相关产品推荐
相关产品推荐

