我遇到了一个问题,我试图匹配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'
他们并没有解析他们。如果我以_开头并且使用一堆数字但我每次都使用相同数量的字母后失败,我就不明白它为什么会起作用。
答案 0 :(得分:1)
检查令牌流输出。通常这些问题是由词法分析器产生的错误令牌引起的。