Mercurial > repos > icfp2014
annotate code/lmc.tp @ 66:9cc019c98335
Added chaser ghost AI
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 27 Jul 2014 22:18:12 -0700 |
parents | 0e1fc2b2832f |
children |
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 { |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
2 inst <- :_name _args { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
3 #{ |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
4 name <- _name |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
5 args <- _args |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
6 translateLabels <- :labelDict { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
7 missing <- #[] |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
8 foreach: args :idx arg { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
9 if: (object does: arg understand?: "isString?") && (arg isString?) { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
10 labelDict ifget: arg :translated { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
11 args set: idx translated |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
12 } else: { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
13 missing append: arg |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
14 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
15 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
16 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
17 missing |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
18 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
19 label <- "" |
13
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
20 comment <- "" |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
21 string <- { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
22 (if: label != "" { ";" . label . "\n " } else: { " " } |
13
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
23 ) . name . " " . (args join: " ") . ( |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
24 if: comment = "" { "" } else: { " ;" . comment}) |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
25 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
26 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
27 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
28 _nextLabel <- 0 |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
29 _setLabel <- :inst { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
30 inst |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
31 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
32 prog <- #{ |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
33 instructions <- #[] |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
34 add <- :inst { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
35 instructions append: (_setLabel: inst) |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
36 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
37 makeLabel <- :suffix { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
38 num <- _nextLabel |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
39 _nextLabel <- _nextLabel + 1 |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
40 "" . num . "_" . suffix |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
41 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
42 labels <- dict hash |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
43 setLabel <- :name { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
44 labels set: name pc |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
45 _setLabel <- :inst { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
46 _setLabel <- :i { i } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
47 inst label!: name |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
48 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
49 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
50 pc <- { instructions length } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
51 print <- { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
52 foreach: instructions :idx i { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
53 missing <- i translateLabels: labels |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
54 if: (missing length) > 0 { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
55 error: "Undefined labels " . (missing join: ", ") . " at address " . idx |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
56 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
57 print: (string: i) . "\n" |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
58 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
59 |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
60 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
61 } |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
62 error <- :msg { |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
63 (file stderr) write: "Error - " . msg . "\n" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
64 } |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
65 |
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
|
66 _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
|
67 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
68 compileExpr:syms <- :expr :syms { |
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
|
69 _exprHandlers ifget: (expr nodeType) :handler { |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
70 handler: expr syms |
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
|
71 } else: { |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
72 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
|
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 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
76 _exprHandlers set: (ast intlit) :expr syms { |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
77 prog add: (inst: "LDC" #[(expr val)]) |
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
|
78 } |
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 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
80 _exprHandlers set: (ast sequence) :expr syms { |
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
|
81 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
|
82 foreach: (expr els) :idx el { |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
83 compileExpr: el syms: syms |
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
|
84 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
|
85 } |
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 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
|
87 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
|
88 } else: { |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
89 prog add: (inst: "LDC" #[0]) |
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
|
90 } |
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 while: { count > 0} do: { |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
92 prog add: (inst: "CONS" #[]) |
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
|
93 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
|
94 } |
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 } |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
96 |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
97 _opNames <- dict hash |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
98 _opNames set: "+" "ADD" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
99 _opNames set: "-" "SUB" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
100 _opNames set: "*" "MUL" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
101 _opNames set: "/" "DIV" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
102 _opNames set: "|" "CONS" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
103 _opNames set: "=" "CEQ" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
104 _opNames set: ">" "CGT" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
105 _opNames set: ">=" "CGTE" |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
106 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
107 _exprHandlers set: (ast binary) :expr syms { |
10
66d0858692a9
Fix operator argument order and add print primitive for the DBUG instruction
Michael Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
108 compileExpr: (expr left) syms: syms |
66d0858692a9
Fix operator argument order and add print primitive for the DBUG instruction
Michael Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
109 compileExpr: (expr right) syms: syms |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
110 _opNames ifget: (expr op) :i { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
111 prog add: (inst: i #[]) |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
112 } else: { |
6 | 113 if: (expr op) = "<" { |
114 prog add: (inst: "CGTE" #[]) | |
115 prog add: (inst: "LDC" #[0]) | |
116 prog add: (inst: "CEQ" #[]) | |
117 } else: { | |
118 if: (expr op) = "<=" { | |
119 prog add: (inst: "CGT" #[]) | |
120 prog add: (inst: "LDC" #[0]) | |
121 prog add: (inst: "CEQ" #[]) | |
122 } else: { | |
123 error: "operator " . (expr op) . " is not supported" | |
124 } | |
125 } | |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
126 } |
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
127 } |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
128 |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
129 _funHandlers <- dict hash |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
130 _funHandlers set: "if:else" :args syms { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
131 compileExpr: (args value) syms: syms |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
132 args <- args tail |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
133 tlabel <- prog makeLabel: "true" |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
134 flabel <- prog makeLabel: "false" |
5
80e224fff567
Fix handling of true case in if:else
Michael Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
135 elabel <- prog makeLabel: "end" |
4
eaf0a014d18b
Use TSEL instead of SEL for if:else
Michael Pavone <pavone@retrodev.com>
parents:
3
diff
changeset
|
136 prog add: (inst: "TSEL" #[ |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
137 tlabel |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
138 flabel |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
139 ]) |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
140 prog setLabel: tlabel |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
141 foreach: ((args value) expressions) :idx expr { |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
142 compileExpr: expr syms: syms |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
143 } |
5
80e224fff567
Fix handling of true case in if:else
Michael Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
144 prog add: (inst: "LDC" #[1]) |
80e224fff567
Fix handling of true case in if:else
Michael Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
145 prog add: (inst: "TSEL" #[ |
80e224fff567
Fix handling of true case in if:else
Michael Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
146 elabel |
80e224fff567
Fix handling of true case in if:else
Michael Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
147 elabel |
80e224fff567
Fix handling of true case in if:else
Michael Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
148 ]) |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
149 args <- args tail |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
150 prog setLabel: flabel |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
151 foreach: ((args value) expressions) :idx expr { |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
152 compileExpr: expr syms: syms |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
153 } |
5
80e224fff567
Fix handling of true case in if:else
Michael Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
154 prog setLabel: elabel |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
155 } |
13
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
156 _funHandlers set: "while:do" :args syms { |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
157 top <- prog makeLabel: "loop_top" |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
158 body <- prog makeLabel: "loop_body" |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
159 end <- prog makeLabel: "loop_end" |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
160 cond <- args value |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
161 prog setLabel: top |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
162 foreach: (cond expressions) :idx expr { |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
163 compileExpr: expr syms: syms |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
164 } |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
165 prog add: (inst: "TSEL" #[ |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
166 body |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
167 end |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
168 ]) |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
169 prog setLabel: body |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
170 blambda <- (args tail) value |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
171 foreach: (blambda expressions) :idx expr { |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
172 compileExpr: expr syms: syms |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
173 } |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
174 prog add: (inst: "LDC" #[1]) |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
175 prog add: (inst: "TSEL" #[ |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
176 top |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
177 top |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
178 ]) |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
179 prog setLabel: end |
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
180 } |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
181 _funHandlers set: "isInteger?" :args syms { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
182 compileExpr: (args value) syms: syms |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
183 prog add: (inst: "ATOM" #[]) |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
184 } |
38
6b9b21456cf4
Make empty? also map to ATOM so that LM-Quiche is closer to being a proper subset of regular Quiche
Michael Pavone <pavone@retrodev.com>
parents:
15
diff
changeset
|
185 _funHandlers set: "empty?" :args syms { |
6b9b21456cf4
Make empty? also map to ATOM so that LM-Quiche is closer to being a proper subset of regular Quiche
Michael Pavone <pavone@retrodev.com>
parents:
15
diff
changeset
|
186 compileExpr: (args value) syms: syms |
6b9b21456cf4
Make empty? also map to ATOM so that LM-Quiche is closer to being a proper subset of regular Quiche
Michael Pavone <pavone@retrodev.com>
parents:
15
diff
changeset
|
187 prog add: (inst: "ATOM" #[]) |
6b9b21456cf4
Make empty? also map to ATOM so that LM-Quiche is closer to being a proper subset of regular Quiche
Michael Pavone <pavone@retrodev.com>
parents:
15
diff
changeset
|
188 } |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
189 _funHandlers set: "value" :args syms { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
190 compileExpr: (args value) syms: syms |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
191 prog add: (inst: "CAR" #[]) |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
192 } |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
193 _funHandlers set: "tail" :args syms { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
194 compileExpr: (args value) syms: syms |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
195 prog add: (inst: "CDR" #[]) |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
196 } |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
197 _funHandlers set: "not" :args syms { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
198 compileExpr: (args value) syms: syms |
6 | 199 prog add: (inst: "LDC" #[0]) |
200 prog add: (inst: "CEQ" #[]) | |
201 } | |
10
66d0858692a9
Fix operator argument order and add print primitive for the DBUG instruction
Michael Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
202 _funHandlers set: "print" :args syms { |
66d0858692a9
Fix operator argument order and add print primitive for the DBUG instruction
Michael Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
203 compileExpr: (args value) syms: syms |
66d0858692a9
Fix operator argument order and add print primitive for the DBUG instruction
Michael Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
204 prog add: (inst: "DBUG" #[]) |
66d0858692a9
Fix operator argument order and add print primitive for the DBUG instruction
Michael Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
205 } |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
206 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
207 _exprHandlers set: (ast call) :expr syms { |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
208 tc <- (expr tocall) |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
209 normal <- true |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
210 if: (tc nodeType) = (ast sym) { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
211 _funHandlers ifget: (tc name) :handler { |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
212 handler: (expr args) syms |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
213 normal <- false |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
214 } else: { |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
215 } |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
216 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
217 if: normal { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
218 num <- 0 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
219 foreach: (expr args) :idx arg { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
220 compileExpr: arg syms: syms |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
221 num <- num + 1 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
222 } |
13
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
223 compileExpr: tc syms: syms |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
224 prog add: (inst: "AP" #[num]) |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
225 } |
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
226 } |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
227 |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
228 _exprHandlers set: (ast sym) :expr syms { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
229 syms ifDefined: (expr name) :info { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
230 frame <- if: (info isLocal?) { 0 } else: { info depth } |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
231 prog add: (inst: "LD" #[ |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
232 frame |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
233 (info def) |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
234 ]) |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
235 } else: { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
236 error: "symbol " . (expr name) . " is not defined" |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
237 } |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
238 } |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
239 |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
240 _exprHandlers set: (ast assignment) :expr syms { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
241 sym <- expr to |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
242 syms ifDefined: (sym name) :info { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
243 frame <- if: (info isLocal?) { 0 } else: { info depth } |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
244 compileExpr: (expr assign) syms: syms |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
245 prog add: (inst: "ST" #[ |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
246 frame |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
247 (info def) |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
248 ]) |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
249 } else: { |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
250 error: "symbol " . (sym name) . " is not defined" |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
251 } |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
252 } |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
253 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
254 compileLambda:syms <- :fname fun :syms { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
255 prog setLabel: fname |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
256 argsyms <- symbols tableWithParent: syms |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
257 foreach: (fun args) :idx el { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
258 argsyms define: (if: (el startsWith?: ":") { el from: 1 } else: { el }) idx |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
259 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
260 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
261 slot <- 0 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
262 locsyms <- symbols tableWithParent: argsyms |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
263 foreach: (fun expressions) :idx expr { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
264 if: (expr nodeType) = (ast assignment) { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
265 locsyms ifDefined: ((expr to) name) :sym { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
266 //already defined, nothing to do here |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
267 } else: { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
268 locsyms define: ((expr to) name) slot |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
269 slot <- slot + 1 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
270 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
271 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
272 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
273 fsyms <- if: slot > 0 { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
274 //allocate frame for locals |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
275 prog add: (inst: "DUM" #[slot]) |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
276 i <- 0 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
277 while: { i < slot } do: { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
278 prog add: (inst: "LDC" #[0]) |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
279 i <- i + 1 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
280 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
281 prologue_end <- prog makeLabel: fname . "_real" |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
282 prog add: (inst: "LDF" #[prologue_end]) |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
283 prog add: (inst: "TRAP" #[slot]) |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
284 prog setLabel: prologue_end |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
285 locsyms |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
286 } else: { argsyms } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
287 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
288 foreach: (fun expressions) :idx expr { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
289 compileExpr: expr syms: fsyms |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
290 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
291 prog add: (inst: "RTN" #[]) |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
292 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
293 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
294 _exprHandlers set: (ast lambda) :expr syms { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
295 fname <- prog makeLabel: "lambda" |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
296 end <- prog makeLabel: "lambda_end" |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
297 prog add: (inst: "LDC" #[1]) |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
298 prog add: (inst: "TSEL" #[ |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
299 end |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
300 end |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
301 ]) |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
302 compileLambda: fname expr syms: syms |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
303 prog setLabel: end |
13
451043a65ff7
Add support for while:do. Fix lambda expressions. Fix function call expressions
Michael Pavone <pavone@retrodev.com>
parents:
10
diff
changeset
|
304 prog add: (inst: "LDF" #[fname]) |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
305 } |
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
|
306 #{ |
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
|
307 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
|
308 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
|
309 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
|
310 outer <- res yield |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
311 functions <- dict hash |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
312 |
39
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
313 num <- 0 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
314 syms <- symbols table |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
315 |
39
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
316 dumaddr <- prog pc |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
317 prog add: (inst: "DUM" #[0]) |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
318 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
319 slot <- 0 |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
320 mainArgs <- 0 |
39
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
321 messageGroups <- [(outer messages)] |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
322 while: { not: (messageGroups empty?) } do: { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
323 curMessages <- messageGroups value |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
324 messageGroups <- messageGroups tail |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
325 foreach: curMessages :idx msg { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
326 if: (msg nodeType) = (ast assignment) { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
327 num <- num + 1 |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
328 def <- msg assign |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
329 sym <- (msg to) name |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
330 |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
331 if: (def nodeType) = (ast lambda) { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
332 prog add: (inst: "LDF" #[sym]) |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
333 functions set: sym def |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
334 if: sym = "main" { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
335 mainArgs <- (def args) length |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
336 } |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
337 } else: { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
338 compileExpr: def syms: syms |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
339 } |
39
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
340 syms define: sym slot |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
341 slot <- slot + 1 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
342 } else: { |
39
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
343 if: (msg nodeType) = (ast call) && ((msg tocall) nodeType) = (ast sym) && ( |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
344 ((msg tocall) name) = "import:from" |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
345 ) { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
346 importSyms <- (((msg args) value) els) fold: (dict hash) with: :acc sym { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
347 acc set: (sym name) true |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
348 } |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
349 moduleName <- ((((msg args) tail) value) args) value |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
350 moduleFile <- if: (moduleName nodeType) = (ast sym) { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
351 (moduleName name) . ".lm" |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
352 } else: { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
353 if: ((moduleName val) endsWith?: ".lm") { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
354 moduleName val |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
355 } else: { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
356 (moduleName val) . ".lm" |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
357 } |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
358 } |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
359 f <- file open: moduleFile |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
360 moduleRes <- parser top: (f readAll) |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
361 if: moduleRes { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
362 newGroup <- [] |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
363 foreach: ((moduleRes yield) messages) :idx msg { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
364 if: (msg nodeType) = (ast assignment) { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
365 importSyms ifget: ((msg to) name) :jnk { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
366 newGroup <- msg | newGroup |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
367 } else: {} |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
368 } |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
369 } |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
370 messageGroups <- newGroup | messageGroups |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
371 } else: { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
372 error: "Failed to parse module " . moduleFile . "!\n" |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
373 } |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
374 } else: { |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
375 error: "Only assignments and import:from are allowed at the top level" |
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
376 } |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
377 } |
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
|
378 } |
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
|
379 } |
39
0e1fc2b2832f
Add support for import:from to lmc
Michael Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
380 (((prog instructions) get: dumaddr) args) set: 0 num |
8
494ef2e3a756
Properly pass initial arguments to main
Michael Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
381 after_env <- prog makeLabel: "after_env" |
494ef2e3a756
Properly pass initial arguments to main
Michael Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
382 prog add: (inst: "LDF" #[after_env]) |
494ef2e3a756
Properly pass initial arguments to main
Michael Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
383 prog add: (inst: "TRAP" #[num]) |
494ef2e3a756
Properly pass initial arguments to main
Michael Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
384 prog setLabel: after_env |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
385 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
386 i <- 0 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
387 while: { i < mainArgs } do: { |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
388 prog add: (inst: "LD" #[ |
15
4bc308c03952
Fix argument passing to main
Michael Pavone <pavone@retrodev.com>
parents:
13
diff
changeset
|
389 1 |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
390 i |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
391 ]) |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
392 i <- i + 1 |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
393 } |
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
394 |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
395 prog add: (inst: "LDF" #["main"]) |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
396 prog add: (inst: "TAP" #[mainArgs]) |
7
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
397 |
afd55b32549b
Implement support for local variables and top level functions
Michael Pavone <pavone@retrodev.com>
parents:
6
diff
changeset
|
398 foreach: functions :fname fun { |
9
526bec3b2090
Function call and lambda expression support. Fix ABI for main function. Use main definition for number of args rather than assuming 2 of them.
Michael Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
399 compileLambda: fname fun syms: syms |
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
|
400 } |
3
a9a2ad99adfb
Rework lmc a bit to support labels in generated code. Add support for certain special funcall expressions, namely: if:else, isInteger? value and tail which translate to SEL ATOM CAR and CDR respectively
Michael Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
401 print: prog |
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
|
402 } else: { |
2
71e8d638da5c
Add operator support to lmc
Michael Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
403 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
|
404 } |
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
|
405 } |
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
|
406 |
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
|
407 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
|
408 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
|
409 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
|
410 } |
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
|
411 |
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
|
412 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
|
413 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
|
414 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
|
415 } 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
|
416 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
|
417 } |
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
|
418 } |
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
|
419 } |
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
|
420 } |