Hata

2016-04-10 6 views
0

darbe bütünHata

type ident = string 

type beantype = 
    | Bool 
    | Int 
    | { fields : field list } 
    | TId of ident 
and field = 
    (ident * beantype) 

parser.mly içinde, ben

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) } 

Ancak orada liste olarak alan kullanmak ast.mli aynıdır, ast.ml olduğunu gibi bir hata:

ocamlc -c bean_ast.mli 
File "bean_ast.mli", line 6, characters 3-4: 
Error: Syntax error 
make: *** [bean_ast.cmi] Error 2 

neden bir hata var?

cevap

4

Bu bildirim:

type beantype = 
    | Bool 
    | Int 
    | { fields : field list } 
    | TId of ident 

OCaml içinde geçerli değil. Varyantların her biri bir etikete, yani varyantın büyük harfli bir tanımlayıcısına ihtiyaç duyar. Üçüncü varyantın bir tane yok.

Ayrıca, bir türün parçası olarak yeni bir kayıt türü bildirmek şu anda mümkün değildir.

şu çalışacaktır şu şekildedir:

type ident = string 
type beantype = 
    | Bool 
    | Int 
    | Fields of fieldrec 
    | Tid of ident 
and fieldrec = { fields: field list } 
and field = ident * beantype 

Şahsen türünü ilan etme:

type ident = string 
type beantype = 
    | Bool 
    | Int 
    | Fields of field list 
    | Tid of ident 
and field = ident * beantype