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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:52:33