ANTLR4解析器将其他解析器规则作为参数进行规则(元规则)

时间:2016-08-16 21:12:52

标签: parsing antlr4

我希望能够在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;

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

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

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

1 个答案:

答案 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。