Front end (finale) Here is the code to build the Pcaml.implem AST node. This part is very boring. It is about 20 more lines, and is very technical. You aren't expected to read this now, just see that it is rather short. Pcaml.implem: [ [ res = makefile -> ([(res, loc)], False) ] ]; makefile: [ [ maybe_items = LIST0 makefile_item; EOF -> let items = some maybe_items in let rule_p (_, _, x) = match x with RULE -> true | ASSIGN -> false in let (rules, assigns) = partition rule_p items in let dead_rule = (<:patt< x >>, None, <:expr< Mk.Rule (x, [], []) >>) in let live_rules = map (fun (n,_,_) -> let n1 = tidy n in (<:patt< $str:n$ >> , None, <:expr< $lid:n1$ () >>)) rules in let resz = live_rules @ [dead_rule] in let resolver = (<:patt< resolve >>, <:expr< fun [ $list:resz$ ] >>) in let bind (n, e, _) = let pwel = [<:patt< _ >>, None, e] in let n1 = tidy n in <:patt< $lid:n1$ >> , <:expr< fun [$list:pwel$] >> in let (r_binds, a_binds) = (map bind rules, map bind assigns) in let funs = resolver :: (a_binds @ r_binds) in let (top,_,_) = hd rules in let tree = <:expr< let rec $list:funs$ in $lid:top$ () >> in let entry = [( <:patt< _ >>, <:expr< Be.trans $tree$ >> )] in let recur = false in let items = [ <:str_item< value $rec:recur$ $list:entry$ >> ] in <:str_item< declare $list:items$ end >> ] ];