# HG changeset patch # User Michael Pavone # Date 1406305932 25200 # Node ID 71e8d638da5c0964da95b82fd45e054b7a8bd64a # Parent 68d1447bfdbea07391650faed2527b0054b65dd4 Add operator support to lmc diff -r 68d1447bfdbe -r 71e8d638da5c code/lmc.tp --- 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!" } } diff -r 68d1447bfdbe -r 71e8d638da5c code/test.lm --- a/code/test.lm Fri Jul 25 09:13:09 2014 -0700 +++ b/code/test.lm Fri Jul 25 09:32:12 2014 -0700 @@ -4,6 +4,6 @@ } main <- { - [1 2 3 4] + 1 | [(2 + 32 * 8) 3 4] } }