使用Lex编写词法分析器时正则用|出现unrecognized rule错误如何解决
错误原因
你遇到的报错由核心语法错误触发,同时现有规则还存在多处逻辑问题:
- 直接触发报错的是运算符规则的正则语法问题:
+、*在正则中属于元字符,分别代表「匹配前一个表达式1次及以上」「匹配前一个表达式0次及以上」,直接写在规则中会被Lex识别为正则语法关键字,而非你想要匹配的字面量运算符,语法不合法触发规则识别失败。 - 额外逻辑问题:
- 标识符规则放在关键词规则之前,Lex会优先匹配更靠前的规则,导致所有关键词都会被识别为标识符
- 整数、浮点数规则前加了行首匹配符
^,导致不在行首的数字无法被识别 - 整数规则用
[0-9]*会匹配到空串、仅正负号的非法内容 - 整数规则放在浮点数规则之前,会导致带小数点的浮点数被拆分为整数+剩余字符,无法正常识别浮点数
解决方法
按照如下要求修改d.l文件即可:
- 调整规则优先级顺序:关键词 > 浮点数 > 整数 > 标识符 > 运算符
- 转义运算符正则中的元字符,或者将运算符放在字符集
[]中简化写法(字符集中的+、*无需转义) - 移除数字规则前的行首匹配符
^,修正整数匹配的量词避免非法匹配 - 补充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
相关产品推荐
相关产品推荐

