0

私は、複数行の情報を解析するために使用される、組み合わされた ANTLR 文法を持っています。文法を書いている時点で、すべての行が完全に既知であり、文法内で定義されているわけではない可能性があります。これは認識されなければならない。次の例は単純化されたものです。

rule:    (line)+ EOF;
LF:      ('\n'|'\r\n');
WS:      ' ';

INTEGER: ('0'..'9');
VALUE:   ('a'..'z'|'A'..'Z'|'0'..'9');

line:    'car' WS VALUE WS LF (subline LF)*;
subline: '>' (description | id | type | unknownsubline);

description: ('description' WS VALUE);
id:          ('id' WS INTEGER);
type:        ('type' WS VALUE);

unknownsubline:          (VALUE | WS | INTEGER)*;   /*don't known yet -> shall be logged...*/

次の入力を入れます。

car car1
>description redPorsche
>id 123
>type pkw
>tires 4
>specifica fast,car
car car2
>description blueTruck

>tires 4は、Eclipse 内の ANTLR インタープリター内で正常に認識されます。しかし、次の行では、単語が既に定義されたトークンであり、ここでは不明なコンテキスト内で使用されている>specifica fast,carため、NoViableAltException が発生します。car

この動作を回避する可能性はありますか? VALUE定義済みのトークンが含まれていることを認識できますか?

4

1 に答える 1

1

「車」をキーワードにしないでください。代わりに構文アクションを使用してください。

line : car WS VALUE WS LF (subline LF)*;

car : id=VALUE {$id.text == "car"}? ();

VALUEの定義の+最後にaがないように見えることに注意してください。

于 2013-03-16T15:55:34.773 に答える