如何制作规则“模板”

时间:2018-10-19 00:26:56

标签: antlr4

我有这样的语法:

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 ;

可以看出,topDefscopeDef除了id子规则之外都是相同的。有什么办法可以将它们包装成一个定义吗?也许是一种模板规则的方法,例如

start : def<topId>* EOF ;
def<id> : id '(' def<scopeId>* ')' ;
topId : UPPER_ID ;
scopeId : LOWER_ID NUMBER? ;

或者类似的东西

scopeDef : topDef except(topId : LOWER_ID NUMBER?) ;

1 个答案:

答案 0 :(得分:0)

并非没有谓词(包含特定于目标的代码,在下面的示例中为Java):

start : def[true]* EOF ;

def[boolean isTopDef]
 : ( {$isTopDef}? topId | scopeId ) '(' def[false]* ')'
 ;

topId : UPPER_ID ;
scopeId : LOWER_ID NUMBER? ;

所以答案是肯定的,你可以做到,但是如果我是你,我不会。