0

一般的な文法からパーサーを構築しようとしてい
ますが、最初に、これから文法を変更するように求められます (A は開始記号です)。

(A,[(A,[C;B;C]);
    (A,[C]);
    (B,[A]);
    (C,[B])])

このようなものに:

   (A,
   function
   | A -> [[C;B;C];[C]]
   | B -> [[C]]
   | C -> [[B]])


リスト内の情報からパターン マッチャーを生成するにはどうすればよいですか?
パターン マッチャー (関数 | パターン | ... | パターン) はプログラマによって定義され、この構造 (A,[[C;B;C];[C ]])::休み ?

より意味のあるより大きな文法を見たい場合は、この質問を見てください。

4

2 に答える 2

1

OK、私はあなたの質問を理解するかもしれないと思います。関数で始まるデータ構造は関数です!OCamlでは、関数はファーストクラスのオブジェクトであり、新しい関数を作成したり、データ構造に保持したりすることができます。物事を純粋に保つために、関数のテキスト表現にアクセスすることはできませんが(一部の言語ではアクセスできます)、関数を便利な方法で組み合わせることができます。

これが小さな例です。この関数maketestは値を取り、kをテストする関数を返しますk

# let maketest k = fun x -> x = k;;
val maketest : 'a -> 'a -> bool = <fun>
# let t8 = maketest 8;;
val t8 : int -> bool = <fun>
# t8 3;;
- : bool = false
# t8 8;;
- : bool = true

この関数unionは、2つのテスト関数(によって生成されたものなどmaketest)を受け取り、2つの値のセットの和集合をテストする関数を返します。

# let union f g = fun x -> f x || g x;;
val union : ('a -> bool) -> ('a -> bool) -> 'a -> bool = <fun>
# let t812 = union t8 (maketest 12);;
val t812 : int -> bool = <fun>
# t812 8;;
- : bool = true
# t812 12;;
- : bool = true
# t812 14;;
- : bool = false
# 

この関数sequenceは、2つのテスト関数(によって生成されたものなどmaketest)を受け取り、2つの関数に一致するintで始まるリストを順番にテストします。

# let sequence f g = function
  | []|[_] -> false
  | a :: b :: _ -> f a && g b;;
val sequence : ('a -> bool) -> ('a -> bool) -> 'a list -> bool = <fun>
# sequence (maketest 1) (maketest 4) [1;4;7];;
- : bool = true
# sequence (maketest 1) (maketest 4) [1;8;7];;
- : bool = false
# 

完全にはわかりませんが、文法の構成要素に対して、このような関数を作成するように求められていると思います。このような関数からパーサーを作成するには、入力ストリームの進行状況を追跡する必要があります。通常の方法は、解析関数が残りの(解析されていない)ストリームを返すようにすることです。

于 2013-01-26T16:26:44.700 に答える
1

lexing と parsing のために設計されたツールであるocamllexmenhirを見るべきです。

于 2013-01-26T10:38:36.850 に答える