1

我正在尝试定义一个允许

[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

作为一个图表,我得到 在此处输入图像描述

我得到了这张铁路图

在此处输入图像描述

我怎样才能解决这个问题?

4

3 回答 3

1

尝试类似的东西

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

这将允许前导“-”或空输入

或者

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

不允许前导“-”,但也允许空输入

于 2011-01-28T21:29:37.227 回答
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();};

生成以下解析树:

在此处输入图像描述

于 2011-01-28T22:04:44.397 回答
1

你可以尝试这样的事情:

ID        : ('a'..'z'|'A'..'Z'|'_')* ;
item      : '[' ID ']' ;
dependency : item ( '-' item )+ ;
list      : ( item | dependency )+
          ;
于 2011-01-28T22:19:49.313 回答