PL/I语言带嵌入单引号的字符串ANTLR4词法规则构建求助
PL/I字符串ANTLR4词法规则栈溢出问题解决
针对你遇到的PL/I字符串解析问题,直接给出可行方案和原因说明:
问题根源
你之前使用的规则STR_CONSTANT : '\'' ( '\'\'' | ~['\\] )* '\'' ;会触发栈溢出,核心原因是ANTLR4词法分析器处理这种交替闭包时,遇到大量嵌入单引号的长字符串会产生过多状态回溯,导致栈资源耗尽。另外你尝试的递归解析器规则无效,因为词法分析阶段已经把字符串拆成了多个独立的STR_CONSTANT符号,解析器无法事后合并。
可行的词法规则
如果PL/I字符串仅通过双单引号嵌入单引号(无需反斜杠转义),使用以下规则即可:
STR_CONSTANT : '\'' ( ~'\'' | '\'' '\'' )* '\'';
若PL/I支持反斜杠转义(比如用\'表示单引号,做兼容处理),则调整为:
STR_CONSTANT : '\'' ( ~['\\] | '\'' '\'' | '\\' . )* '\'';
规则说明
这个规则的逻辑清晰无歧义:
- 以单引号
'开头 - 重复匹配两种内容:要么是非单引号字符,要么是两个连续的单引号(表示嵌入一个单引号)
- 最后以单引号
'结尾
这种写法让词法分析器的状态机完全确定,每一步都有明确的匹配分支,不会产生不必要的回溯,彻底避免栈溢出问题。
测试验证
- 普通字符串
'This is a normal string'会被完整匹配为一个STR_CONSTANT - 带嵌入单引号的字符串
'This contains '' embedded quotes '''会被正确解析,最终内容为This contains ' embedded quotes'
内容的提问来源于stack exchange,提问作者Andrew Clark
相关产品推荐
相关产品推荐

