1

_loc変数は、関数に渡される引数として、式の文法規則のここに表示れます。match ... withmk_sequence

    | "match"; e = sequence; "with"; a = match_case ->
        <:expr< match $mksequence' _loc e$ with [ $a$ ] >>

ただし、mksequence関数本体では使用されません。

  value mksequence _loc =
    fun
    [ <:expr< $_$; $_$ >> | <:expr< $anti:_$ >> as e -> <:expr< do { $e$ } >>
    | e -> e ]
  ;

この_loc変数は、文法規則の他の 場所にも表示されます。

camlp4コード生成チュートリアルでは、それは_loc場所を表すと書かれています。でも、その説明がよくわかりません。_loc誰かが未使用の変数を渡す目的を私に説明できますか?

4

1 に答える 1

3

大まかに言えば、_loc「現在の位置」です。通常、解析ルールで一致したASTの場所にボールドされます。

_locは通常のOCaml変数であり、実際にはCamlP4コードに遍在していますが、P4のシンタックスシュガーはそれらの存在のほとんどをうまく隠しています。P4モジュールをP4で前処理することにより、P4で「_loc」がどのように導入および使用されるかを学ぶことができます。例えば、

EXTEND Gram
  my_syntax:
    [ [ "match"; e = sequence; "with"; a = match_case ->
          <:expr< match $mksequence' _loc e$ with [ $a$ ] >>
    ] ];
END;

上記をcamlp4rfで前処理すると、実際の意味がわかります。

Gram.extend (my_syntax : 'my_syntax Gram.Entry.t)
  ((fun () ->
      (None,
       [ (None, None,
          [ ([ Gram.Skeyword "match";
               Gram.Snterm
                 (Gram.Entry.obj (sequence : 'sequence Gram.Entry.t));
               Gram.Skeyword "with";
               Gram.Snterm
                 (Gram.Entry.obj (match_case : 'match_case Gram.Entry.t)) ],
             (Gram.Action.mk
                (fun (a : 'match_case) _ (e : 'sequence) _
                   (_loc : Gram.Loc.t) ->
                   (Ast.ExMat (_loc, (mksequence' _loc e), a) : 'my_syntax)))) ]) ]))
     ())

少し難しいですがGram.Action.mk、引数を導入する関数が必要です_loc。で始まる仕様に一致するASTの場所にバインドされ[ Gram.Skeyword "match"...ます。次に、手で書かれたでの2番目の使用に加えて、に展開されたで_loc使用されます。<:expr< match ... >>Ast.ExMat (_loc, ...)mksequence' _loc e

<:expr<...>><:XXX<...>>また、 p4の他の構成ではこの_loc変数を使用するため、ASTの場所をあまり考慮せずにASTを作成できます。自動的_locに「現在の解析位置」を使用します。_locを使用したくない場合は、を使用してASTの場所を明示的に指定<:expr<...>>できます。<:expr@myloc<...>>

<:expr<...>>解析ルールの外で使用したい場合があり、その場合_locはバインドされていません。を使用するか、他の何かによってバインドした後に<:expr@myloc<...>>使用する必要があります。通常、これは「どこにもない」という意味です。<:expr<...>_loclet _loc = Loc.ghost

P4は非常に複雑であり、ネットで入手できるドキュメントはあまりありません。P4コードをP4で拡張すると、その動作を理解するのに役立つ場合があります。

于 2013-03-19T04:08:12.093 に答える