ANTLR语法:在已知表达式中使用的已知令牌

时间:2013-03-15 22:19:14

标签: token grammar antlr3

我有一个组合的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

在Eclipse中的ANTLR解释器中成功识别行>tires 4。但是下一行>specifica fast,car会导致NoViableAltException,因为单词car是一个已定义的标记,此处在未知的上下文中使用。

有没有可能避免这种行为?是否可以识别包含已定义标记的VALUE

1 个答案:

答案 0 :(得分:1)

不要让'car'成为关键字。请改为使用句法操作:

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

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

请注意,您的VALUE定义似乎最后缺少+