comparison code/lmc.tp @ 1:68d1447bfdbe

Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
author Michael Pavone <pavone@retrodev.com>
date Fri, 25 Jul 2014 09:13:09 -0700
parents 360862a3f3e3
children 71e8d638da5c
comparison
equal deleted inserted replaced
0:360862a3f3e3 1:68d1447bfdbe
1 {
2 _exprHandlers <- dict hash
3
4 compileExpr <- :expr {
5 _exprHandlers ifget: (expr nodeType) :handler {
6 handler: expr
7 } else: {
8 print: "Unhandled node type " . (expr nodeType) . "\n"
9 }
10 }
11
12 _exprHandlers set: (ast intlit) :expr {
13 print: " LDC " . (expr val) . "\n"
14 }
15
16 _exprHandlers set: (ast sequence) :expr {
17 count <- 0
18 foreach: (expr els) :idx el {
19 compileExpr: el
20 count <- count + 1
21 }
22 if: (expr array?) {
23 count <- count - 1
24 } else: {
25 print: " LDC 0\n"
26 }
27 while: { count > 0} do: {
28 print: " CONS\n"
29 count <- count - 1
30 }
31 }
32 #{
33 compile <- :code {
34 res <- parser top: code
35 if: res {
36 outer <- res yield
37 main_fun <- false
38 others <- dict hash
39 foreach: (outer messages) :idx msg {
40 if: ((msg to) name) = "main" {
41 main_fun <- msg assign
42 } else: {
43 others set: ((msg to) name) (msg assign)
44 }
45 }
46 foreach: (main_fun expressions) :idx expr {
47 compileExpr: expr
48 }
49 foreach: others :name fun {
50 print: ";" . name . "\n"
51 foreach: (fun expressions) :idx expr {
52 compileExpr: expr
53 }
54 }
55 } else: {
56 print: "Parse failed!\n"
57 }
58 }
59
60 compileFile <- :filename {
61 f <- file open: filename
62 compile: (f readAll)
63 }
64
65 main <- :args {
66 if: (args length) > 1 {
67 compileFile: (args get: 1)
68 } else: {
69 print: "Usage lmc FILE\n"
70 }
71 }
72 }
73 }