打击是ast.ml,在ast.mli中都是一样的
type ident = string
type beantype =
| Bool
| Int
| { fields : field list }
| TId of ident
and field =
(ident * beantype)
在parser.mly中,我使用字段作为列表
typespec :
| BOOL { Bool }
| INT { Int }
| LBRAK fields RBRAK { { fields = List.rev $2 } }
| IDENT { TId $1 }
fields :
| fields COMMA field { $3 :: $1 }
field :
| IDENT COLON typespec { ($1, $3) }
但是有这样的错误:
ocamlc -c bean_ast.mli
File "bean_ast.mli", line 6, characters 3-4:
Error: Syntax error
make: *** [bean_ast.cmi] Error 2
为什么会出错?
答案 0 :(得分:4)
此声明:
type beantype =
| Bool
| Int
| { fields : field list }
| TId of ident
在OCaml中无效。每个变体都需要标签,即变体的大写标识符。你的第三个变种没有。
目前还无法将新记录类型声明为变体类型的一部分。
以下内容可行:
type ident = string
type beantype =
| Bool
| Int
| Fields of fieldrec
| Tid of ident
and fieldrec = { fields: field list }
and field = ident * beantype
我个人可能会声明如下类型:
type ident = string
type beantype =
| Bool
| Int
| Fields of field list
| Tid of ident
and field = ident * beantype