2016-08-16 88 views
1

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

简短的回答是,没有。

更好地重构语法和识别结构显著方面来解决:

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秒。

+0

感谢您验证这是行不通的。我认为我在解析器中尝试做太多。我已经将(更复杂的)解析器重写为更一般化,并且将我正在尝试对解析器处理器进行的一些操作改为。 – user2487951