Mercurial > repos > icfp2014
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 } |