AST类型可以在ocaml中递归吗?

时间:2018-11-10 01:59:23

标签: parsing ocaml abstract-syntax-tree

我试图将我的语法转换为AST。

AST类型可以递归吗?例如,我有一个生产eprime -> PLUS t eprime | MINUS t eprime | epsilon。将其翻译为:

type eprime = 
| Add of t eprime 
| Minus of t eprime 
| Eempty

2 个答案:

答案 0 :(得分:1)

简短的回答是。这差不多就是您定义树形数据结构的方式。

语法上正确的定义看起来像这样:

type eprime = 
| Add of t * eprime 
| Minus of t * eprime 
| Empty

如果您假设tint(为简单起见),则可以创建这种类型的值,如下所示:

# Add (3, Add (4, Empty));;
- : eprime = Add (3, Add (4, Empty))

答案 1 :(得分:1)

是的,AST类型可以是递归的,并且经常是递归的。但是,正确的语法应为Add of t * eprime。如果没有*,则t会被视为eprime的类型参数,它不需要任何参数。

PS:您不必(也可能不应该)像语法那样对AST进行建模。即使已将其从语法中删除,也可以在AST中具有“左递归”功能。同样,您不必以与语法相同的方式在AST类型中对运算符优先级进行编码,例如,将AddMult设置为同一类型是没有问题的。考虑到这一点,通常对表达式的AST定义看起来像这样:

type exp =
  | Add of exp * exp
  | Sub of exp * exp
  | Mult of exp * exp
  | Div of exp * exp
  | FunctionCall of ident * exp list
  | Var of ident
  | Const of value