ANTLR4 解析器规则与其他解析器规则作为参数(元规则)

ANTLR4 parser rules with other parser rules as arguments (meta-rules)

我希望能够在 ANTLR4 中编写一个 "meta-rule",它将规则作为输入参数并对该规则执行集合修改。这是一个示例语法:

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;

ptermpsum 的规则对 termsum 执行相同的操作,将它们括在可能嵌套的括号中。我希望能够用以下内容替换上面的最后三行:

enclose[rule]: '(' rule ')' | '(' enclose(rule) ')';
expr: term | sum | enclose(term) | enclose(sum);

有没有办法构建这样的元规则?

简短的回答是,不。

最好通过重构语法和识别结构上重要的术语来解决:

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规则会消耗所有terms,所以expr规则只需要处理sums。