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

使用Lex编写词法分析器时正则用|出现unrecognized rule错误如何解决

错误原因

你遇到的报错由核心语法错误触发,同时现有规则还存在多处逻辑问题:

  1. 直接触发报错的是运算符规则的正则语法问题:+、*在正则中属于元字符,分别代表「匹配前一个表达式1次及以上」「匹配前一个表达式0次及以上」,直接写在规则中会被Lex识别为正则语法关键字,而非你想要匹配的字面量运算符,语法不合法触发规则识别失败。
  2. 额外逻辑问题:
    • 标识符规则放在关键词规则之前,Lex会优先匹配更靠前的规则,导致所有关键词都会被识别为标识符
    • 整数、浮点数规则前加了行首匹配符^,导致不在行首的数字无法被识别
    • 整数规则用[0-9]*会匹配到空串、仅正负号的非法内容
    • 整数规则放在浮点数规则之前,会导致带小数点的浮点数被拆分为整数+剩余字符,无法正常识别浮点数

解决方法

按照如下要求修改d.l文件即可:

  1. 调整规则优先级顺序:关键词 > 浮点数 > 整数 > 标识符 > 运算符
  2. 转义运算符正则中的元字符,或者将运算符放在字符集[]中简化写法(字符集中的+、*无需转义)
  3. 移除数字规则前的行首匹配符^,修正整数匹配的量词避免非法匹配
  4. 补充Lex必备的yywrap函数,避免后续编译报错

修改后的完整代码参考:

%%
(if|then|else|end|repeat|read|until|write)  printf("keyword\n");
[-+]?[0-9]*\.[0-9]+   printf("float\n");
[-+]?[0-9]+    printf("integer\n");
[_a-zA-Z][_a-zA-Z0-9]{0,30} printf("identifier\n");
[-+*/] printf("operator\n");
%%

int yywrap() {
    return 1;
}

修改后执行lex d.l即可正常生成词法分析器代码。

内容的提问来源于stack exchange,提问作者user9178840

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:48:02