从语法OCaml构建函数

从语法OCaml构建函数,ocaml,context-free-grammar,Ocaml,Context Free Grammar,我正在尝试从泛型语法构建解析器 但首先我被要求更改语法(A是开始符号): 对于看起来像这样的东西: (A, function | A -> [[C;B;C];[C]] | B -> [[C]] | C -> [[B]]) 如何从列表中的信息生成模式匹配器 模式匹配器(函数|模式|…|模式)由程序员定义,如何使用具有此结构(A,[[C;B;C];[C]])的列表中的信息动态创建一个:rest? 如果你想看一个更大、更有意义的语法,请看。你应该看

我正在尝试从泛型语法构建解析器
但首先我被要求更改语法(A是开始符号):

对于看起来像这样的东西:

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

如何从列表中的信息生成模式匹配器
模式匹配器(函数|模式|…|模式)由程序员定义,如何使用具有此结构(A,[[C;B;C];[C]])的列表中的信息动态创建一个:rest?


如果你想看一个更大、更有意义的语法,请看。

你应该看看哪些是专门用于词法分析和语法分析的工具。

好的,我想我可能理解你的问题。以函数开头的数据结构就是函数!在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
函数
序列
接受两个测试函数(如
maketest
生成的函数)并测试以int开头的列表,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
# 
#让序列f g=函数
|[]错误
|a::b::->f a&&g b;;
val序列:('a->bool)->('a->bool)->'a列表->bool=
#序列(maketest1)(maketest4)[1;4;7];;
-:bool=true
#序列(maketest1)(maketest4)[1;8;7];;
-:bool=false
# 

我不完全确定,但我想你被要求为语法的组成部分创建类似的函数。要从这样的函数生成解析器,您需要通过输入流跟踪进度。通常的方法是让解析函数返回剩余的(未解析的)流。

(我在这里找不到问题。)我想知道如何生成这样一个列表的数据结构(a,[[C;B;C];[C]]::rest谢谢,我知道这些工具,但它们不是我想要的我明白你的意思。我需要更多的帮助。我重新措辞了问题。假设你读了新问题。。。我有点明白如何通过(funx->fx | | | | | |……)获得我想要的东西,但它需要与(函数|……)相比较。我认为你不能把它与你的方法相比。
# 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
# 
# 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
#