comparison code/lmc.tp @ 2:71e8d638da5c

Add operator support to lmc
author Michael Pavone <pavone@retrodev.com>
date Fri, 25 Jul 2014 09:32:12 -0700
parents 68d1447bfdbe
children a9a2ad99adfb
comparison
equal deleted inserted replaced
1:68d1447bfdbe 2:71e8d638da5c
1 { 1 {
2 error <- :msg {
3 (file stderr) write: "Error - " . msg . "\n"
4 }
5
2 _exprHandlers <- dict hash 6 _exprHandlers <- dict hash
3 7
4 compileExpr <- :expr { 8 compileExpr <- :expr {
5 _exprHandlers ifget: (expr nodeType) :handler { 9 _exprHandlers ifget: (expr nodeType) :handler {
6 handler: expr 10 handler: expr
7 } else: { 11 } else: {
8 print: "Unhandled node type " . (expr nodeType) . "\n" 12 error: "Unhandled node type " . (expr nodeType)
9 } 13 }
10 } 14 }
11 15
12 _exprHandlers set: (ast intlit) :expr { 16 _exprHandlers set: (ast intlit) :expr {
13 print: " LDC " . (expr val) . "\n" 17 print: " LDC " . (expr val) . "\n"
25 print: " LDC 0\n" 29 print: " LDC 0\n"
26 } 30 }
27 while: { count > 0} do: { 31 while: { count > 0} do: {
28 print: " CONS\n" 32 print: " CONS\n"
29 count <- count - 1 33 count <- count - 1
34 }
35 }
36
37 _opNames <- dict hash
38 _opNames set: "+" "ADD"
39 _opNames set: "-" "SUB"
40 _opNames set: "*" "MUL"
41 _opNames set: "/" "DIV"
42 _opNames set: "|" "CONS"
43 _opNames set: "=" "CEQ"
44 _opNames set: ">" "CGT"
45 _opNames set: ">=" "CGTE"
46
47 _exprHandlers set: (ast binary) :expr {
48 if: (expr op) = "|" {
49 compileExpr: (expr left)
50 compileExpr: (expr right)
51 } else: {
52 compileExpr: (expr right)
53 compileExpr: (expr left)
54 }
55 _opNames ifget: (expr op) :inst {
56 print: " " . inst . "\n"
57 } else: {
58 error: "operator " . (expr op) . " is not supported"
30 } 59 }
31 } 60 }
32 #{ 61 #{
33 compile <- :code { 62 compile <- :code {
34 res <- parser top: code 63 res <- parser top: code
51 foreach: (fun expressions) :idx expr { 80 foreach: (fun expressions) :idx expr {
52 compileExpr: expr 81 compileExpr: expr
53 } 82 }
54 } 83 }
55 } else: { 84 } else: {
56 print: "Parse failed!\n" 85 error: "Parse failed!"
57 } 86 }
58 } 87 }
59 88
60 compileFile <- :filename { 89 compileFile <- :filename {
61 f <- file open: filename 90 f <- file open: filename