我有一个组合的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
?
答案 0 :(得分:1)
不要让'car'成为关键字。请改为使用句法操作:
line : car WS VALUE WS LF (subline LF)*;
car : id=VALUE {$id.text == "car"}? ();
请注意,您的VALUE定义似乎最后缺少+
。