Mercurial > repos > icfp2014
changeset 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 |
files | code/lmc.tp code/test.lm |
diffstat | 2 files changed, 32 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/code/lmc.tp Fri Jul 25 09:13:09 2014 -0700 +++ b/code/lmc.tp Fri Jul 25 09:32:12 2014 -0700 @@ -1,11 +1,15 @@ { + error <- :msg { + (file stderr) write: "Error - " . msg . "\n" + } + _exprHandlers <- dict hash compileExpr <- :expr { _exprHandlers ifget: (expr nodeType) :handler { handler: expr } else: { - print: "Unhandled node type " . (expr nodeType) . "\n" + error: "Unhandled node type " . (expr nodeType) } } @@ -29,6 +33,31 @@ count <- count - 1 } } + + _opNames <- dict hash + _opNames set: "+" "ADD" + _opNames set: "-" "SUB" + _opNames set: "*" "MUL" + _opNames set: "/" "DIV" + _opNames set: "|" "CONS" + _opNames set: "=" "CEQ" + _opNames set: ">" "CGT" + _opNames set: ">=" "CGTE" + + _exprHandlers set: (ast binary) :expr { + if: (expr op) = "|" { + compileExpr: (expr left) + compileExpr: (expr right) + } else: { + compileExpr: (expr right) + compileExpr: (expr left) + } + _opNames ifget: (expr op) :inst { + print: " " . inst . "\n" + } else: { + error: "operator " . (expr op) . " is not supported" + } + } #{ compile <- :code { res <- parser top: code @@ -53,7 +82,7 @@ } } } else: { - print: "Parse failed!\n" + error: "Parse failed!" } }