# HG changeset patch # User Michael Pavone # Date 1406304789 25200 # Node ID 68d1447bfdbea07391650faed2527b0054b65dd4 # Parent 360862a3f3e3bf63ea3188cc4232bec90633d735 Support for compiling lists, tuples and integer literals in lmc. Added small test lm program for exercising compiler. diff -r 360862a3f3e3 -r 68d1447bfdbe code/lmc.tp --- a/code/lmc.tp Fri Jul 25 08:03:08 2014 -0700 +++ b/code/lmc.tp Fri Jul 25 09:13:09 2014 -0700 @@ -0,0 +1,73 @@ +{ + _exprHandlers <- dict hash + + compileExpr <- :expr { + _exprHandlers ifget: (expr nodeType) :handler { + handler: expr + } else: { + print: "Unhandled node type " . (expr nodeType) . "\n" + } + } + + _exprHandlers set: (ast intlit) :expr { + print: " LDC " . (expr val) . "\n" + } + + _exprHandlers set: (ast sequence) :expr { + count <- 0 + foreach: (expr els) :idx el { + compileExpr: el + count <- count + 1 + } + if: (expr array?) { + count <- count - 1 + } else: { + print: " LDC 0\n" + } + while: { count > 0} do: { + print: " CONS\n" + count <- count - 1 + } + } + #{ + compile <- :code { + res <- parser top: code + if: res { + outer <- res yield + main_fun <- false + others <- dict hash + foreach: (outer messages) :idx msg { + if: ((msg to) name) = "main" { + main_fun <- msg assign + } else: { + others set: ((msg to) name) (msg assign) + } + } + foreach: (main_fun expressions) :idx expr { + compileExpr: expr + } + foreach: others :name fun { + print: ";" . name . "\n" + foreach: (fun expressions) :idx expr { + compileExpr: expr + } + } + } else: { + print: "Parse failed!\n" + } + } + + compileFile <- :filename { + f <- file open: filename + compile: (f readAll) + } + + main <- :args { + if: (args length) > 1 { + compileFile: (args get: 1) + } else: { + print: "Usage lmc FILE\n" + } + } + } +} \ No newline at end of file diff -r 360862a3f3e3 -r 68d1447bfdbe code/test.lm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code/test.lm Fri Jul 25 09:13:09 2014 -0700 @@ -0,0 +1,9 @@ +#{ + init <- { + #[1 2 3 4] + } + + main <- { + [1 2 3 4] + } +}