2016-04-10 2 views
0

удар является ast.ml, все же в ast.mliОшибка в OCaml типа структуры данных

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 

Почему есть ошибки?

ответ

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 
Смежные вопросы