2016-08-16 9 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で同じアクションを実行します。私は次のようなもので上記の最後の3行を交換できるようにしたいと思います:

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

このようなメタルールを構築する方法はありますか?

答えて

1

短い答えは、いいえです。

文法をリファクタリングし、構造的に重要な用語を識別することによって解決することがベター:exprルールのみsum Sを処理する必要があるので、

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秒を消費します。

+0

これは実行できないことを確認していただきありがとうございます。私はパーサであまりにも多くをやろうとしていたと思う。私は(より複雑な)パーサーをより一般的なものに書き直し、私がしようとしていることをパーサハンドラに移しました。 – user2487951

関連する問題