我有这样的语法:
start : topDef* EOF ;
topDef : topId '(' scopeDef* ')' ;
topId : UPPER_ID ;
scopeDef : scopeId '(' scopeDef* ')' ;
scopeId : LOWER_ID NUMBER? ;
UPPER_ID : [A-Z] [A-Za-z0-9_]* ;
LOWER_ID : [a-z] [A-Za-z0-9_]* ;
NUMBER : [0-9]+ ;
WS : [ \t\r\n]+ -> skip ;
可以看出,topDef
和scopeDef
除了id子规则之外都是相同的。有什么办法可以将它们包装成一个定义吗?也许是一种模板规则的方法,例如
start : def<topId>* EOF ;
def<id> : id '(' def<scopeId>* ')' ;
topId : UPPER_ID ;
scopeId : LOWER_ID NUMBER? ;
或者类似的东西
scopeDef : topDef except(topId : LOWER_ID NUMBER?) ;
答案 0 :(得分:0)
并非没有谓词(包含特定于目标的代码,在下面的示例中为Java):
start : def[true]* EOF ;
def[boolean isTopDef]
: ( {$isTopDef}? topId | scopeId ) '(' def[false]* ')'
;
topId : UPPER_ID ;
scopeId : LOWER_ID NUMBER? ;
所以答案是肯定的,你可以做到,但是如果我是你,我不会。