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 4Eclipse 的 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 回答