Как сделать правило "шаблоны" - PullRequest
0 голосов
/ 19 октября 2018

У меня есть грамматика примерно такая:

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?) ;

1 Ответ

0 голосов
/ 19 октября 2018

Не без предиката (который содержит целевой код, Java в приведенном ниже примере):

start : def[true]* EOF ;

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

topId : UPPER_ID ;
scopeId : LOWER_ID NUMBER? ;

Так что ответ да, вы можете это сделать, но я бы не стал на вашем месте.

...