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;
pterm
和 psum
的规则对 term
和 sum
执行相同的操作,将它们括在可能嵌套的括号中。我希望能够用以下内容替换上面的最后三行:
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
规则会消耗所有term
s,所以expr
规则只需要处理sum
s。
我希望能够在 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;
pterm
和 psum
的规则对 term
和 sum
执行相同的操作,将它们括在可能嵌套的括号中。我希望能够用以下内容替换上面的最后三行:
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
规则会消耗所有term
s,所以expr
规则只需要处理sum
s。