在ANTLR中解析标识符

时间:2017-02-09 21:36:35

标签: antlr antlr4

我遇到了一个问题,我试图匹配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'

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

1 个答案:

答案 0 :(得分:1)

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