ルールに一致するたびに初期化コードを実行する必要があるとしましょう。冗長性を減らすにはどうすればよいでしょうか?
rule : TOKEN1 { init(); token1Code(); }
| TOKEN2 { init(); token2Code(); }
;
また、次のようなことは可能ですか
rule : TOKEN1
| TOKEN2
{ codeForToken1OrToken2(); }
;
次のようなものを使用できます。
rule : { init(); } real_rule { codeForToken1or2(); } ;
real_rule : TOKEN1 { token1Code(); }
| TOKEN2 { token2Code(); }
;
ただし、「ルール」の使用方法によっては、競合が発生する可能性があります。
これは実際に機能するので:
rule : TOKEN1 { getToken(); init(); token1Code(); }
| TOKEN2 { getToken(); init(); token2Code(); }
;
ここでgetToken(); 入力内の次のトークンに一致する関数の名前です(関数の名前は覚えていません)。init()を呼び出すことができます。その中。