1

1.全体的なタスク:

Java.stgをカスタマイズして、文法規則の代替として、コードブロックのコメントのトークン表示形式を変更したいと思います。

2.コンテキスト:

私の現在の文法の1つのルールは次のとおりです。

temporal returns [String ret]:

  NEXT disj
  {$ret= $ret= "X ".concat($disj.ret);}

  | EVENTUALLY disj

  {$ret= "F ".concat($disj.ret);}`

;

対応する生成されたコードブロック(パーサー内)は次のとおりです。

switch (alt2) {

            case 1 :
                // RERS.g:26:7: NEXT disj
                {
                match(input,NEXT,FOLLOW_NEXT_in_temporal204); 

                pushFollow(FOLLOW_disj_in_temporal206);
                disj2=disj();

                state._fsp--;


                ret = ret = "X ".concat(disj2);

                }
                break;
            case 2 :
                // RERS.g:28:7: EVENTUALLY disj
                {
                match(input,EVENTUALLY,FOLLOW_EVENTUALLY_in_temporal222); 

                pushFollow(FOLLOW_disj_in_temporal224);
                disj3=disj();

                state._fsp--;


                ret = "F ".concat(disj3);

                }
                break;

3.私の目標:

コメントを次のような形式に変更します// RERS.g:26:7: NEXT disjNEXT_disjつまり、<fileName>:<description>から<MyOwnAttribute>

4.これまでの試み:

テンプレート「alt(elements、altNum、description、autoAST、outerAlt、treeLevel、rew)」を次のように変更しようとしました。

alt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
/* <elements:ExtractToken()> */
{
<@declarations()>
<elements:element()>  // as I understand, it's just an template expansion to apply the sub templates in each elements
<rew>
<@cleanup()>
}
>>

このコンテキストでは、属性要素の値がのようなものであることを確認しました{el=/tokenRef(), line=26, pos=7}{el=/ruleRef(), line=26, pos=12}{el=/execAction(), line=27, pos=7}。「next_disj」のような形式のトークンを吐き出すには、「tokenRef」テンプレートを「オーバーロード」する必要があると思います。

5.質問:

  1. 既存のテンプレートを「オーバーロード」する方法は?そうしないと「要素」の値を変更する必要があるため、これを実行したいと思います。

  2. テンプレートをすべての要素に適用するのではなく、属性「elements」の特定の要素にのみ適用するにはどうすればよいですか(テンプレート「element()」のように)?

  3. 私の目標を達成するための便利な方法があるはずだと思います。なにか提案を?

前もって感謝します。

4

0 に答える 0