同じ開始を持つレクサールールを使用するにはどうすればよいですか?
私は2つの類似したレクサールール(同じ開始を持つ)を使用しようとしています:
TIMECONSTANT: ('0'..'9')+ ':' ('0'..'9')+;
INTEGER : ('0'..'9')+;
COLON : ':';
これが私のサンプル文法です:
grammar TestTime;
text : (timeexpr | caseblock)*;
timeexpr : TIME;
caseblock : INT COLON ID;
TIME : ('0'..'9')+ ':' ('0'..'9')+;
INT : ('0'..'9')+;
COLON : ':';
ID : ('a'..'z')+;
WS : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;};
テキストを解析しようとすると:
12:44
123 : abc
123: abc
最初の2行は正しく解析され、3行目はエラーを生成します。何らかの理由で、 '123:' ANTLRはTIMEとして解析します(そうではありません)。..
それで、そのような語彙素で文法を作ることは可能ですか?
私の言語では、大文字と小文字のブロックと日時定数の両方を使用するために、このようなルールを設定する必要があります。たとえば、私の言語では次のように書くことができます。
case MyInt of
1: a := 01.01.2012;
2: b := 12:44;
3: ....
end;