我希望能够在ANTLR4中编写一个“元规则”,它将规则作为输入参数并对该规则执行集修改。这是一个示例语法:
grammar G;
WS: [ \t\n\r] + -> skip;
CHAR: [a-z];
term: (CHAR)+;
sum: term ('+' term)+;
pterm: '(' term ')' | '(' pterm ')';
psum: '(' sum ')' | '(' psum ')';
expr: term | sum | pterm | psum;
pterm
和psum
的规则对term
和sum
执行相同的操作,将它们括在可能嵌套的括号中。我希望能够用以下内容替换上面的最后三行:
enclose[rule]: '(' rule ')' | '(' enclose(rule) ')';
expr: term | sum | enclose(term) | enclose(sum);
有没有办法构建这样的元规则?
答案 0 :(得分:1)
简短的回答是,不。
最好通过重构语法并确定结构上重要的术语来解决:
expr: LPAREN sum RPAREN | LPAREN expr RPAREN ;
sum : term ('+' term)* ; // changed to Kleene star
term: CHAR+ ;
LPAREN : '(' ;
RPAREN : ')' ;
CHAR : [a-z] ;
WS : [ \t\n\r]+ -> skip ;
sum
规则将使用所有term
s,因此expr
规则只需处理sum
s。