2016-08-16 73 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