У меня есть грамматика примерно такая:
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?) ;