import Builtins, CEI, CPK::Earley::DSL, Sys parse := $<>: machine ::= instr ( "NEWLINE" instr )* instr ::= push | add push ::= "PUSH" "INT" add ::= "ADD" func sb(dsl_block, src_infos): pt := parse(dsl_block, src_infos) Sys::println(pt) instrs := [] for i := 0.iter_to(pt.len(), 2): instr := pt[i][0] instr_type := instr.name if instr_type == "push": instrs.append([| &stack.append(Builtins::Int.new(${CEI::lift(instr[1].value)})) |]) elif instr_type == "add": instrs.extend([| rhs := &stack.pop() lhs := &stack.pop() &stack.append(lhs + rhs) |]) ast := [| func (n): &stack := [n] $c{instrs} return &stack[-1] |] Sys::println(CEI::pp_itree(ast)) return ast f := $<>: PUSH 3 ADD func main(): Sys::println(f(666))