在 ANTLR 中解析标识符

Parsing identifiers in ANTLR

我在尝试匹配 ANTLR4 中的标识符时遇到问题,但似乎在一段时间后将其切断。这是我语法的相关部分:

prog: (EOL)* statements;
statements: statement (EOL)+ (statement (EOL)+)* ;
statement : declaration ;
declaration : mutability ' '+ ident ' '* assign_operator ' '* expression ;
block : '{' statements '}';
expression : ident
           | number ;
EOL : '\n' ;
mutability : ('let'|'var') ;
assign_operator : '=' ;
number : ('-'?(DIGIT|'_')+('.')?(DIGIT|'_')*('e''-'?)?(DIGIT|'_')*) ;
ident : ('_'|LETTER) ('_'|LETTER|DIGIT)* ;
DIGIT : '0'..'9' ;
LETTER : ('a'..'z'|'A'..'Z') ;

这是我的测试用例:

let _1 = 5
let _12 = 5
let _123 = 5
let _1234 = 5
let _12345 = 5
let _123456 = 5
let _1234567 = 5
let _12345678 = 5
let _123456789 = 5
let _1234567890 = 5

let a = 5
let ab = 5
let abc = 5
let abcd = 5
let abcde = 5
let abcdef = 5

它适用于除最后两个语句之外的所有内容。它给我

line 33:8 no viable alternative at input 'let abcde'
line 34:8 no viable alternative at input 'let abcde'

他们无法解析他们。我不明白为什么如果我以 _ 开头并使用一堆数字它会起作用,但它每次都在相同数量的字母后失败。

检查令牌流输出。通常这类问题是由词法分析器生成的错误标记引起的。