open Genlex

let lexer = make_lexer [ "i"; "n"; "["; "]" ]

let add_inst s = function
  | [] -> print_string s; print_char ' '; []
  | crt::t -> (s::crt)::t

let end_comp = function
  | _::(s::r)::t -> ((s^" ]")::r)::t
  | _ -> print_string "] "; []

let print_revlvl =
  let reviter f l = List.iter f (List.rev l)  
  in reviter (reviter (fun s -> print_string s; print_char ' '))

let rec do_compound s lvl = parser
  | [< nlvl = do_ilist ([]::(add_inst (s^" [") lvl)); 'Kwd "]" >] -> end_comp nlvl
and do_ilist lvl =
  let do_instr lvl = parser
      | [< 'Kwd "i" ; p = parser
        | [< 'Kwd "["; pc = do_compound "i" lvl >] -> pc
        | [< >] -> print_revlvl lvl; print_string "i "; [] >] -> p
      | [< 'Kwd "n" ; p = parser
        | [< 'Kwd "["; pc = do_compound "n" lvl >] -> pc
        | [< >] -> add_inst "n" lvl >] -> p
      | [< 'Ident s; 'Kwd "["; p = do_compound s lvl >] -> p
  in parser
    | [< lvl1 = do_instr lvl; lvl2 = do_ilist lvl1 >] -> lvl2
    | [< >] -> lvl

let () = ignore (do_ilist [] (lexer (Stream.of_channel stdin)))


This document was generated using caml2html