Ocaml 在camlp4中定义语法规则时_loc变量的用途是什么?

Ocaml 在camlp4中定义语法规则时_loc变量的用途是什么?,ocaml,camlp4,Ocaml,Camlp4,\u loc变量出现在匹配的语法规则中。。。将表达式作为参数传递给mk_序列函数 |“匹配”;e=序列;“与”;a=匹配\案例-> |>作为e->> |e->e] ; \u loc变量也出现在语法规则中 在camlp4代码生成中,它表示\u loc代表位置。但我不太明白那里的解释。有人能给我解释一下传递未使用的\u loc变量的目的吗?粗略地说,\u loc是“当前位置”。通常,它被绑定到解析规则中匹配的AST的位置 \u loc是一个普通的OCaml变量,实际上在CamlP4代码中无处不在,

\u loc
变量出现在
匹配的语法规则中。。。将
表达式作为参数传递给
mk_序列
函数

|“匹配”;e=序列;“与”;a=匹配\案例->
|>作为e->>
|e->e]
;
\u loc
变量也出现在语法规则中


在camlp4代码生成中,它表示
\u loc
代表位置。但我不太明白那里的解释。有人能给我解释一下传递未使用的
\u loc
变量的目的吗?

粗略地说,
\u loc
是“当前位置”。通常,它被绑定到解析规则中匹配的AST的位置

\u loc
是一个普通的OCaml变量,实际上在CamlP4代码中无处不在,但P4的语法很好地隐藏了它们的大部分存在。通过对P4模块进行预处理,您可以了解如何在P4中引入和使用“_loc”。比如说,

EXTEND Gram
  my_syntax:
    [ [ "match"; e = sequence; "with"; a = match_case ->
          <:expr< match $mksequence' _loc e$ with [ $a$ ] >>
    ] ];
END;
这有点困难,但您可以找到
Gram.Action.mk
接受一个引入参数的函数
\u loc
。它绑定到与规范匹配的AST的位置,该AST以
[Gram.Skeyword“match”…
开头。然后
\u loc
用于
,该代码扩展为
AST.ExMat(_loc,…)
,除了它在
mksequence'\u loc e
的第二次使用之外,该代码是手工编写的

p4中的
和其他
构造使用此
\u loc
变量,这样您就可以创建AST,而无需考虑它的位置。它会自动使用
\u loc
,“当前解析的位置”。如果您不想对
使用
\u loc
,可以使用
明确指定AST的位置


有时您希望在解析规则之外使用
,在这种情况下,
\u loc
是未绑定的。您必须使用
,或者使用
谢谢!“有时通过P4扩展P4代码有助于理解其工作原理。”如何使用P4扩展我的camlp4代码?正如我在回答中所写的那样。camlp4rf,如果您使用修订后的语法(并且您在问题中使用了修订后的语法)。camlp4of用于原始语法。
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)))) ]) ]))
     ())