2017-12-01 9 views
0

私はglobalVarsglobalFnsを持つレコードを返す必要があり、次のパーサを持っていますが、それが表示されません。 ast.mlのようにプログラムを定義しOcamlyaccは、一見、完全なレコードを返さない

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

type program = { 
    globalVars : bind list; 
    globalFns : func_decl list; 
} 

エラー私が受けてるです:

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 

私は単純に把握することはできません。Error: Unbound record field globalVars私のような何かをしようとすると、なぜprogram.globalVarsはここに結合していないです。誰かが正しい方向に私を指すことができれば、それは非常に高く評価されると思い。

答えて

1

実際のprogram.globalVarsではなく現在のスコープでバインドされていないレコードフィールドglobalVarsです。フィールドラベルは、それを定義するモジュール内に存在します。現在のモジュールの外部で定義されたタイプのレコードのフィールドにアクセスするために。 program.Ast.globalVarsを使用する必要があります。Ast.globalVarsは、モジュールAstに定義されているフィールドglobalVarsへのパスであるか、スコープ内にフィールドを持っている必要があります。たとえば、モジュールを開くか、プログラムのタイプを注釈する:let translate (program:Ast.program)= …

+0

OMGが、私はあなたを愛して@octachron – Nathan

関連する問題