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): parse_tree := parse(dsl_block, src_infos) instrs := [] // A sequence of Converge instructions for i := 0.iter_to(parse_tree.len(), 2): instr := parse_tree[i][0] instr_type := instr.name if instr_type == "push": ast_int := CEI::iint(Builtins::Int.new(instr[1].value)) instrs.append([| &stack.append(${ast_int}) |]) elif instr_type == "add": instrs.extend([| rhs := &stack.pop() lhs := &stack.pop() &stack.append(lhs + rhs) |]) ast := [| func (): &stack := [] $c{instrs} return &stack[-1] |] Sys::println(CEI::pp_itree(ast)) return ast f := $<>: PUSH 2 PUSH ADD func main(): Sys::println(f())