在OCaml中构建AST

时间:2012-11-30 19:34:49

标签: parsing ocaml grammar

我正在使用OCaml为Scheme的子集构建递归下降解析器。这是语法:

    S -> a|b|c|(T)
    T -> ST | Epsilon

所以说我有:

   type expr = 
       Num of int | String of string | Tuple of expr * expr

伪代码

这些函数必须返回expr类型才能构建AST

parseS  lr =
   if head matches '(' then
     parseL lr
   else
     match tokens a, b, or c

使用第一组S作为标记和'(':

parseL lr = 
   if head matches '(' or the tokens then
       Tuple (parseS lr, parseL lr)
  else
       match Epsilon

我的问题是“我怎么回复Epsilon部分,因为我无法返回()?”。 OCaml函数需要相同的返回类型,即使我为Epsilon部分留空,OCaml仍然采用单位类型。

2 个答案:

答案 0 :(得分:6)

据我所知,您的AST与您的语法不符。

您可以通过在AST类型中使用特定空节点来表示语法中的Epsilon来解决问题。

或者,你可以改变你的语法来分解Epsilon。

这是一个没有Epsilon的等效语法:

S -> a|b|c|()|(T)
T -> S | S T

答案 1 :(得分:4)

也许不是手动创建解析器函数而是使用现有方法更好:例如,LALR(1)ocamlyacc或基于camlp4的LL(k)parsers