annotate code/lmc.tp @ 64:8f6ade456edf

bugfixes to runtime errors of gameState.lm
author William Morgan <billjunk@mrgn.org>
date Mon, 28 Jul 2014 03:14:50 -0700
parents 0e1fc2b2832f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
113 if: (expr op) = "<" {
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
114 prog add: (inst: "CGTE" #[])
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
115 prog add: (inst: "LDC" #[0])
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
116 prog add: (inst: "CEQ" #[])
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
117 } else: {
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
118 if: (expr op) = "<=" {
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
119 prog add: (inst: "CGT" #[])
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
120 prog add: (inst: "LDC" #[0])
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
121 prog add: (inst: "CEQ" #[])
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
122 } else: {
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
123 error: "operator " . (expr op) . " is not supported"
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
124 }
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
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
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
199 prog add: (inst: "LDC" #[0])
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
200 prog add: (inst: "CEQ" #[])
0ab6eb5f0190 Implement not, < and <=
Michael Pavone <pavone@retrodev.com>
parents: 5
diff changeset
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 }