我正在尝试定义允许
的语法[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
如图所示
我得到了这张铁路图
我该如何解决这个问题?
答案 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();};
生成以下解析树:
答案 2 :(得分:1)
您可以尝试这样的事情:
ID : ('a'..'z'|'A'..'Z'|'_')* ;
item : '[' ID ']' ;
dependency : item ( '-' item )+ ;
list : ( item | dependency )+
;