如何在ANTLR4中编写词法规则?语法报错求助
ANTLR4 Hello World语法报错解析
错误代码问题点
原始错误代码:
grammar Hello; r : 'hello' [a-z]+ EOF ; WS : [ \t]+ -> skip ;
报错核心原因:
- 第一个错误:ANTLR4的Parser规则(小写开头的
r)不允许直接使用[a-z]+这种字符类语法。字符类是Lexer规则(大写开头)的专属定义语法,Parser规则只能引用已定义的词法符号或字面量。 - 第二个错误:是第一个错误引发的连锁问题。ANTLR语法解析器因第一个错误逻辑混乱,误将后续内容判定为Lexer规则,而Lexer规则要求格式为
规则名 : 定义 ;,所以它期望看到冒号:,却遇到了分号;,从而触发报错。
修正后代码的合理性
修正后的可运行代码:
grammar Hello; r : 'hello' ID EOF ; ID : [a-z]+ ; WS : [ \t]+ -> skip ;
修正逻辑:
将原本写在Parser规则里的[a-z]+提取为独立的Lexer规则ID,Parser规则r通过引用ID来匹配小写字母序列,完全符合ANTLR4的职责划分:
- Lexer规则(
ID、WS)负责将输入文本拆分为词法单元,处理字符匹配和空白跳过。 - Parser规则(
r)基于词法单元构建合法的语法结构,实现hello后跟小写字母串的匹配逻辑。
关键规则说明
ANTLR4严格区分词法分析与语法分析的职责:
- Lexer规则必须以大写字母开头,支持字符类、量词等词法层面的匹配语法。
- Parser规则以小写字母开头,只能由词法单元、字面量和其他Parser规则组成,不能直接使用Lexer专属的字符类语法。
内容的提问来源于stack exchange,提问作者Farwell_Liu
相关产品推荐
相关产品推荐

