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

ANTLR语法中parser规则与lexer规则的调用顺序是怎样的?

ANTLR词法规则与语法规则的执行顺序及问题解答

核心执行顺序

ANTLR的语法解析分为两个独立阶段,严格先执行词法分析,再执行语法分析:

  1. 词法分析(Lexer规则,全大写命名的规则)优先运行,把输入的字符流切分为独立的Token流,运行过程完全不参考后续语法分析(Parser规则,小写命名的规则)的定义
  2. 词法分析完成后,才会把生成的Token流交给Parser,匹配小写的Parser规则

识别错误原因

你遇到的223被识别为APLHANUMERIC而非digit的问题,核心是混淆了Lexer和Parser的作用边界,具体问题如下:

  • digit是Parser规则,完全不会影响Lexer的Token切分逻辑,Lexer切分时根本不会读取Parser规则的内容
  • F_DIGIT是fragment规则,只能被其他Lexer规则引用,不会作为独立Token输出给Parser使用,因此你写的digit : F_DIGIT+;本身就无法匹配任何有效Token
  • Lexer扫描223时,只有APLHANUMERIC这一个非fragment的Lexer规则能匹配输入,自然就会生成APLHANUMERIC类型的Token

修复方案

如果需要把纯数字序列识别为digit对应的Token,需要调整Lexer规则的定义和顺序,让纯数字的规则优先级高于通用的字母数字规则:

// Parser规则
digit  : DIGIT+;
alpha  : ALPHANUMERIC;

// Lexer规则(优先级按书写顺序从高到低)
DIGIT: [0-9]+;
ALPHANUMERIC   : ([a-z] | [A-Z] | [0-9] | '_')+ ;

调整后,纯数字输入匹配DIGIT和ALPHANUMERIC的长度相同,因为DIGIT写在前面优先级更高,Lexer会输出DIGIT类型的Token,Parser的digit规则就能正常匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:24:02