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