ANTLR语法中parser规则与lexer规则的调用顺序是怎样的?
ANTLR词法规则与语法规则的执行顺序及问题解答
核心执行顺序
ANTLR的语法解析分为两个独立阶段,严格先执行词法分析,再执行语法分析:
- 词法分析(Lexer规则,全大写命名的规则)优先运行,把输入的字符流切分为独立的Token流,运行过程完全不参考后续语法分析(Parser规则,小写命名的规则)的定义
- 词法分析完成后,才会把生成的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
相关产品推荐
相关产品推荐

