我试图将我的语法转换为AST。
AST类型可以递归吗?例如,我有一个生产eprime -> PLUS t eprime | MINUS t eprime | epsilon
。将其翻译为:
type eprime =
| Add of t eprime
| Minus of t eprime
| Eempty
答案 0 :(得分:1)
简短的回答是。这差不多就是您定义树形数据结构的方式。
语法上正确的定义看起来像这样:
type eprime =
| Add of t * eprime
| Minus of t * eprime
| Empty
如果您假设t
是int
(为简单起见),则可以创建这种类型的值,如下所示:
# Add (3, Add (4, Empty));;
- : eprime = Add (3, Add (4, Empty))
答案 1 :(得分:1)
是的,AST类型可以是递归的,并且经常是递归的。但是,正确的语法应为Add of t * eprime
。如果没有*
,则t
会被视为eprime
的类型参数,它不需要任何参数。
PS:您不必(也可能不应该)像语法那样对AST进行建模。即使已将其从语法中删除,也可以在AST中具有“左递归”功能。同样,您不必以与语法相同的方式在AST类型中对运算符优先级进行编码,例如,将Add
和Mult
设置为同一类型是没有问题的。考虑到这一点,通常对表达式的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