Mercurial > repos > icfp2014
annotate code/lmc.tp @ 2:71e8d638da5c
Add operator support to lmc
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 25 Jul 2014 09:32:12 -0700 |
parents | 68d1447bfdbe |
children | a9a2ad99adfb |
rev | line source |
---|---|
1
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
1 { |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
2 error <- :msg { |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
3 (file stderr) write: "Error - " . msg . "\n" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
4 } |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
5 |
1
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
6 _exprHandlers <- dict hash |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
7 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
8 compileExpr <- :expr { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
9 _exprHandlers ifget: (expr nodeType) :handler { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
10 handler: expr |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
11 } else: { |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
12 error: "Unhandled node type " . (expr nodeType) |
1
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
13 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
14 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
15 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
16 _exprHandlers set: (ast intlit) :expr { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
17 print: " LDC " . (expr val) . "\n" |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
18 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
19 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
20 _exprHandlers set: (ast sequence) :expr { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
21 count <- 0 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
22 foreach: (expr els) :idx el { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
23 compileExpr: el |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
24 count <- count + 1 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
25 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
26 if: (expr array?) { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
27 count <- count - 1 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
28 } else: { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
29 print: " LDC 0\n" |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
30 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
31 while: { count > 0} do: { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
32 print: " CONS\n" |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
33 count <- count - 1 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
34 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
35 } |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
36 |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
37 _opNames <- dict hash |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
38 _opNames set: "+" "ADD" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
39 _opNames set: "-" "SUB" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
40 _opNames set: "*" "MUL" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
41 _opNames set: "/" "DIV" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
42 _opNames set: "|" "CONS" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
43 _opNames set: "=" "CEQ" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
44 _opNames set: ">" "CGT" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
45 _opNames set: ">=" "CGTE" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
46 |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
47 _exprHandlers set: (ast binary) :expr { |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
48 if: (expr op) = "|" { |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
49 compileExpr: (expr left) |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
50 compileExpr: (expr right) |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
51 } else: { |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
52 compileExpr: (expr right) |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
53 compileExpr: (expr left) |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
54 } |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
55 _opNames ifget: (expr op) :inst { |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
56 print: " " . inst . "\n" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
57 } else: { |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
58 error: "operator " . (expr op) . " is not supported" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
59 } |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
60 } |
1
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
61 #{ |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
62 compile <- :code { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
63 res <- parser top: code |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
64 if: res { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
65 outer <- res yield |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
66 main_fun <- false |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
67 others <- dict hash |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
68 foreach: (outer messages) :idx msg { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
69 if: ((msg to) name) = "main" { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
70 main_fun <- msg assign |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
71 } else: { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
72 others set: ((msg to) name) (msg assign) |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
73 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
74 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
75 foreach: (main_fun expressions) :idx expr { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
76 compileExpr: expr |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
77 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
78 foreach: others :name fun { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
79 print: ";" . name . "\n" |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
80 foreach: (fun expressions) :idx expr { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
81 compileExpr: expr |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
82 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
83 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
84 } else: { |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
85 error: "Parse failed!" |
1
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
86 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
87 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
88 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
89 compileFile <- :filename { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
90 f <- file open: filename |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
91 compile: (f readAll) |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
92 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
93 |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
94 main <- :args { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
95 if: (args length) > 1 { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
96 compileFile: (args get: 1) |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
97 } else: { |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
98 print: "Usage lmc FILE\n" |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
99 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
100 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
101 } |
68d1447bfdbe
Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler.
Michael Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
102 } |