4

型の定義を可能にする構文拡張を作成しました

type.yjson type_name {
  /* type_declaration */
}

json ファイルから直接レコード値を作成できるようにします。構文拡張は、モジュールとそのために必要な関数を挿入します。ここまでは問題ありません。構文拡張機能は、私が望んでいたことを正確に実行します。

コード内の他の場所 (つまり、関数パラメーター) で「yjson」を使用したい場合、問題が発生し始めます。

ここで私が試したこと:

EXTEND Gram
str_item:
    [
      [ KEYWORD "type"; KEYWORD "."; "yjson"; tdl_raw = type_declaration ->

ここで、「yjson」を関数パラメーターとして使用すると発生するエラー

[fun_binding] expected after [ipatt] (in [let_binding])

ここで何が起こっているのかよくわかりません。ルールが一致していないように見えるのに、解析エラーが発生するのはなぜですか?

4

2 に答える 2

5

このあたりの P4 の仕組みはよくわかりません[ [ "blahblah" -> ...が、言語の新しいキーワードとして make を使用しているため、関数の引数としてblahblah使用できなくなりました。blahblah

これを確認するには、pa_*.ml を camlp4of で前処理して、 がどのよう"blahblah"に展開されるかを確認してくださいGram.Skeyword "blahblah"。これがP4のviaにSkeyword _渡されて文字列が新しいキーワードとして登録されているようです。Structure.usingInsert.insert

通常の変数として引き続きyjson使用できるようにするには、ルールでid = LIDENT代わりに使用してから、のコンテンツがアクションに含まれているかどうかを確認してください。"yjson"id"yjson"

于 2013-05-30T07:13:55.907 に答える