# HG changeset patch # User Michael Pavone # Date 1406413541 25200 # Node ID 0e1fc2b2832f153e36b56414fcc8ee8a24139459 # Parent 6b9b21456cf4a4d9cd6fd8c345d4279b69373ebf Add support for import:from to lmc diff -r 6b9b21456cf4 -r 0e1fc2b2832f code/lmc.tp --- a/code/lmc.tp Sat Jul 26 13:44:45 2014 -0700 +++ b/code/lmc.tp Sat Jul 26 15:25:41 2014 -0700 @@ -310,32 +310,74 @@ outer <- res yield functions <- dict hash - num <- (outer messages) length + num <- 0 syms <- symbols table - prog add: (inst: "DUM" #[num]) + dumaddr <- prog pc + prog add: (inst: "DUM" #[0]) + slot <- 0 mainArgs <- 0 - foreach: (outer messages) :idx msg { - if: (msg nodeType) = (ast assignment) { - def <- msg assign - sym <- (msg to) name - - if: (def nodeType) = (ast lambda) { - prog add: (inst: "LDF" #[sym]) - functions set: sym def - if: sym = "main" { - mainArgs <- (def args) length + messageGroups <- [(outer messages)] + while: { not: (messageGroups empty?) } do: { + curMessages <- messageGroups value + messageGroups <- messageGroups tail + foreach: curMessages :idx msg { + if: (msg nodeType) = (ast assignment) { + num <- num + 1 + def <- msg assign + sym <- (msg to) name + + if: (def nodeType) = (ast lambda) { + prog add: (inst: "LDF" #[sym]) + functions set: sym def + if: sym = "main" { + mainArgs <- (def args) length + } + } else: { + compileExpr: def syms: syms } + syms define: sym slot + slot <- slot + 1 } else: { - compileExpr: def syms: syms + if: (msg nodeType) = (ast call) && ((msg tocall) nodeType) = (ast sym) && ( + ((msg tocall) name) = "import:from" + ) { + importSyms <- (((msg args) value) els) fold: (dict hash) with: :acc sym { + acc set: (sym name) true + } + moduleName <- ((((msg args) tail) value) args) value + moduleFile <- if: (moduleName nodeType) = (ast sym) { + (moduleName name) . ".lm" + } else: { + if: ((moduleName val) endsWith?: ".lm") { + moduleName val + } else: { + (moduleName val) . ".lm" + } + } + f <- file open: moduleFile + moduleRes <- parser top: (f readAll) + if: moduleRes { + newGroup <- [] + foreach: ((moduleRes yield) messages) :idx msg { + if: (msg nodeType) = (ast assignment) { + importSyms ifget: ((msg to) name) :jnk { + newGroup <- msg | newGroup + } else: {} + } + } + messageGroups <- newGroup | messageGroups + } else: { + error: "Failed to parse module " . moduleFile . "!\n" + } + } else: { + error: "Only assignments and import:from are allowed at the top level" + } } - syms define: sym slot - slot <- slot + 1 - } else: { - error: "Only assignments are allowed at the top level" } } + (((prog instructions) get: dumaddr) args) set: 0 num after_env <- prog makeLabel: "after_env" prog add: (inst: "LDF" #[after_env]) prog add: (inst: "TRAP" #[num])