You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:43:30