CAMLP4の文法規則を定義するときの_LOC変数の目的は何ですか? -- ocaml フィールド と camlp4 フィールド 関連 問題

What is the purpose of the _loc variable when defining grammar rules in camlp4?












1
vote

問題

日本語

_loc 変数は match ... with 式として、 mk_sequence 関数として<コード> match ... with 式の文法ルールの。

 <コード>     | "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 変数を渡すための目的を私に説明できますか?

英語

The _loc variable appears in here in the grammar rule for the match ... with expression as an argument passed to the mk_sequence function.

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

But it is not used in the mksequence's function body.

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

The _loc variable also appears in other places in the grammar rules.

In the camlp4 code generation tutorial, it says that _loc stands for location. But I don't quite understand the explanation there. Can someone explain to me the purpose for passing an unused _loc variable around?

</div
     

回答リスト

3
 
vote
vote
ベストアンサー
 

大まかに言えば、<コード> _loc は「現在位置」です。通常、それは解析規則において整合されたASTの場所にはあります。

_loc は通常のOCAML変数であり、実際にはCAMLP4コードではomnipresentですが、P4の構文砂糖は存在の大部分を隠します。 P4によってP4モジュールの前処理によって「_loc」がどのように導入され、P4で使用されているかを学ぶことができます。たとえば、

です <事前> <コード> 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)))) ]) ])) ())

ビットhardですが、 Gram.Action.mk は引数 _loc を紹介する関数を取ります。仕様と一致するASTの位置にバインドされます。 [ Gram.Skeyword "match"... で始まります。その後、 _loc は、 _loc0 に展開されています。 _loc0 には、 _loc1 で使用されます。手で書かれています。

_loc2 と他方の _loc3 コンストラクションは、この<コード> _loc4 変数を使用して、の場所を考慮せずにASTを作成できるようにします。それ。 _loc5 、「現在の解析場所」を自動的に使用します。 _loc7 <コード> 998877617 _loc16 を使用したくない場合は、 _loc8 を使用して、ASTの場所を明示的に指定できます。

_loc9 を解析ルールの外側に使用したい場合があり、その場合 EXTEND Gram my_syntax: [ [ "match"; e = sequence; "with"; a = match_case -> <:expr< match $mksequence' _loc e$ with [ $a$ ] >> ] ]; END; 0 はバインドされていません。 EXTEND Gram my_syntax: [ [ "match"; e = sequence; "with"; a = match_case -> <:expr< match $mksequence' _loc e$ with [ $a$ ] >> ] ]; END; 1 を使用するか、 EXTEND Gram my_syntax: [ [ "match"; e = sequence; "with"; a = match_case -> <:expr< match $mksequence' _loc e$ with [ $a$ ] >> ] ]; END; 3 EXTEND Gram my_syntax: [ [ "match"; e = sequence; "with"; a = match_case -> <:expr< match $mksequence' _loc e$ with [ $a$ ] >> ] ]; END; 2 を他のもので使用する必要があります。通常、<コード> EXTEND Gram my_syntax: [ [ "match"; e = sequence; "with"; a = match_case -> <:expr< match $mksequence' _loc e$ with [ $a$ ] >> ] ]; END; 4 は「どこで」を意味します。

P4は非常に複雑で、ネットで利用可能なドキュメントはあまりありません。 P4によってP4コードを拡大することがある場合があります。

 

Roughly speaking, _loc is "the current position". Normally it is bould to the location of the matched AST in parsing rules.

_loc is an ordinary OCaml variable, and actually omnipresent in CamlP4 code, but P4's syntax sugar nicely hide most of their existence. You can learn how '_loc' is introduced and used in P4 by preprocess your P4 module by P4. For example,

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

If you preprocess the above by camlp4rf, you got what it really means:

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)))) ]) ]))      ()) 

It is bit hard but you can find Gram.Action.mk takes a function introducing an argument _loc. It is bound to the location of an AST which matches with the specification starts with [ Gram.Skeyword "match".... Then _loc is used at <:expr< match ... >> which is expanded into Ast.ExMat (_loc, ...), in addition to its second use at mksequence' _loc e, which is written by hand.

<:expr<...>> and the other <:XXX<...>> constructs in p4 uses this _loc variable so that you can create your AST without considering much about the location of it. It automatically uses _loc, "the current parsed location". If you do not want to use _loc for <:expr<...>> you can use <:expr@myloc<...>> to explicitly specify the location of your AST.

Sometimes you want to use <:expr<...>> outside of parsing rules, and in that case _loc is unbound. You must use <:expr@myloc<...>>, or use <:expr<...> after binding _loc by something else. Typically, let _loc = Loc.ghost which means "no where".

P4 is very complex, and there are not much documentations available in the net. Sometimes expanding your P4 code by P4 helps understanding how it works.

</div
 
 
   
   

関連する質問

5  SEXP RETURNでタイプに注釈を付けるのはなぜ原因アンバインド値INT_OF_SEXPですか?  ( Why does annotating a type with sexp return cause unbound value int of sexp ) 
SEXPLIB構文拡張機能を使用して、多くの簡単な例で示すように、タイプのシリアル化コードを自動的に生成します。 <事前> <コード> var next = jQuery('.my_music').find('.accordion-toggle'); ...

0  CAMLP4パーサー機能:式はint型にありますが、式はfloat型に予想されました  ( Camlp4 parser function expression has type int but an expression was expected o ) 
私はストリーム内のアイテムを期待してintを返す単純なパーサ機能を書いていましたが、何らかの理由でコンパイラが理由が理解できない理由でフロートを期待し続けます。特にコードが LLVM OCAMLチュートリアル私はタイプをintsにintsに挿入しようとしました...

1  CAMLP4の文法規則を定義するときの_LOC変数の目的は何ですか?  ( What is the purpose of the loc variable when defining grammar rules in camlp4 ) 
_loc 変数は match ... with 式として、 mk_sequence 関数として<コード> match ... with 式の文法ルールの。 <コード> | "match"; e = sequence; "with"; a = ...

3  CAMLP4とCAMLP5を-PP文字列に組み合わせることはOCAMLOPTに?  ( Combining camlp4 and camlp5 in pp string for ocamlopt ) 
大規模プロジェクトのためのボルト、SEXP、OCAMLVIZを組み合わせたい。問題は、SEXPとBOLTがCAMLP4を使用しており、OCAMLVIZはCAMLP5を使用しています。しかし、ocamlc / ocamloptの-pp引数のための1つのチェーンへ...

1  OCAML:関数識別子のみから関数を返す  ( Ocaml returning a function from the function identifier only ) 
私はいくつかの行われた言語で書かれたスクリプトを解析するプログラムを書いていて、そのスクリプトを使っていくつかの計算を行います。この言語は、<コード> 'a -> bool の型の外部OCAML関数を呼び出すために使用される特定の構成要素を持っています。だから...

4  CAMLP4:利用可能な見積エキスパンダーはありません  ( Camlp4 there is no quotation expander available ) 
ファイル 99887776611 には1行のみが含まれています。 <事前> <コード> .......... 2 このコマンドラインでCAMLP4をそのファイルに適用します。 <事前> <コード> .......... 3 出力は次のとおりです。 <事前>...

5  OCAMLプログラムのASTを入手することは可能ですか?  ( Is it possible the get the ast for an ocaml program ) 
与えられたOCAMLプログラムのためにASTを得ることができるようにしたい(たとえば、ASTを歩き、計装されたバージョンのコードを生成したいのですが、たとえば、ある種の変換を行いたい)。この機能をサポートするOCAMLツールのいずれかを実行しますか? ...

0  OCAML / CAMLP4 - 多形変異体の名前を変更します  ( Ocaml camlp4 renaming polymorphic variants ) 
前処理時間でそれぞれ最大2文字のオカムプログラムにすべての多型変異体を持つ方法はありますか、もちろん独自性を保存しますか?名前変更はすべてのプログラムモジュールにも一貫しているはずです。 誰かがCAMLP4 +ハッシュテーブルまたは類似のものを使用して解決策を...

1  MLIファイルのASTを参照してください  ( See ast of an mli file ) 
特定のモジュールのASTがどのようなものになるのかを確認できるようにしたいのですが、それに対して適切なフィルタを書くことができます。 私は今やフィルターで「ログ」できる方法を実際には見てください。たとえば、MOCTが照合したときに、MOCHが故障したときに、...

0  未結合モジュールCAMLP4  ( Unbound module camlp4 ) 
このサイトについての同様の質問を知っていますが、それらのどれも私の問題を解決するのを助けていませんでした。 OCAMLでは、Camlp4の使用に関する次のチュートリアルを使用しています。<a href="https://github.com/ocaml/ca...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有