2017-02-09 3 views
1

ANTLR4で識別子を照合しようとしているところに問題があり、しばらくしてから切断しているようです。ここに私の文法の関連する部分である:ANTLRでの識別子の解析

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

OOOHHHH!私はこの行を持っています:私はどのように科学記法を許可したいのために '' e '= 45'!正しい方向に私を指摘していただきありがとうございます! – CaseyB

+0

私は答えとしてこれを投稿できると思います:-) –

答えて

1

トークンストリーム出力を確認します。通常、この種の問題は、レクサーによって生成された間違ったトークンから発生します。

関連する問題