I have the following parser which should return a record with globalVars and globalFns, but it doesn't appear to.
%start program
%type <Ast.program> program
%%
program:
decls EOF { $1 }
decls:
/* nothing */ { { globalVars = []; globalFns = []; } }
| decls varDecl { { $1 with globalVars = $1::$2.globalVars } }
| decls fnDecl { { $1 with globalFns = $1::$2.globalFns } }
where ast.ml defines a program as:
type program = {
globalVars : bind list;
globalFns : func_decl list;
}
The error I'm receiving is: Error: Unbound record field globalVars when I try to do something like:
let translate program =
let global_vars =
let global_var m (t, n) =
let init = L.const_int (ltype_of_typ t) 0
in StringMap.add n (L.define_global n init the_module) m in
List.fold_left global_var StringMap.empty program.globalVars in
I simply cannot figure out why program.globalVars is unbound here. If someone could point me in the proper direction, that'd be very much appreciated.
It is the record field
globalVarsthat is unbound in the current scope not reallyprogram.globalVarsitself: field labels lives in the module that defines them. In order to access a record field for a type defined outside of the current module; one needs to either use a fully qualified field paths,program.Ast.globalVarswhereAst.globalVarsis the path to the fieldglobalVarsdefined in the moduleAstor bring the field in scope, by opening the module for instance or annotating the type of program:let translate (program:Ast.program)= ….