[Foo] - [Bar] - [Baz] [X] - [Y] [Z]的antlr语法

时间:2011-01-28 21:15:31

标签: antlr grammar antlr3

我正在尝试定义允许

的语法
[Foo]-[Bar]-[Baz][X]-[Y][Z]

我想将其解析为一组。

我目前有

语法示例;

items       :   (item association? item?)*;
item        :   LBRACK ID RBRACK;   
association     :   ASSOCIATION;

RBRACK      :   ']';
LBRACK      :   '[';
ASSOCIATION     :   '-';
ID      :   ('a'..'z' |  'A'..'Z' |  '_')*;

但这会产生错误

warning(200): Sample.g:3:30: Decision can match input such as 
"LBRACK ID RBRACK" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input

如图所示 enter image description here

我得到了这张铁路图

enter image description here

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

尝试类似

的内容
items : ( '-'? item )* ;
item  : '[' ID ']' ;
ID    : ('a'..'z'|'A'..'Z'|'_') ;

将允许前导' - '或空输入

items : item? ( '-'? item )* ;
item  : '[' ID ']' ;
ID    : ('a'..'z'|'A'..'Z'|'_') ;

不允许使用前导' - ',但也允许空输入

答案 1 :(得分:1)

根据输入[Foo]-[Bar]-[Baz][X]-[Y][Z],以下内容:

chunk : items+ EOF;
items : item (ASSOCIATION item)* ;
item  : '[' ID ']' ;

RBRACK      : ']';
LBRACK      : '[';
ASSOCIATION : '-';
ID          : ('a'..'z' |  'A'..'Z' | '_')*;
SPACE       : (' ' | '\t' | '\r' | '\n'){skip();};

生成以下解析树:

enter image description here

答案 2 :(得分:1)

您可以尝试这样的事情:

ID        : ('a'..'z'|'A'..'Z'|'_')* ;
item      : '[' ID ']' ;
dependency : item ( '-' item )+ ;
list      : ( item | dependency )+
          ;