ANTLR4解析器规则与其他解析器规则作为参数(元规则)
问题描述:
我希望能够在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;
为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
秒。
感谢您验证这是行不通的。我认为我在解析器中尝试做太多。我已经将(更复杂的)解析器重写为更一般化,并且将我正在尝试对解析器处理器进行的一些操作改为。 – user2487951