# HG changeset patch # User Michael Pavone # Date 1406533341 25200 # Node ID a2a5d80abaa01c889478db2c9dd84c7def95f1cc # Parent 920f02a880fca8b4d9a516079c3593a39438b291 Add and as a function to gqc to work around parser limitations diff -r 920f02a880fc -r a2a5d80abaa0 code/gqc.tp --- a/code/gqc.tp Mon Jul 28 00:41:59 2014 -0700 +++ b/code/gqc.tp Mon Jul 28 00:42:21 2014 -0700 @@ -275,6 +275,26 @@ prog add: (inst: "INT" #[7]) reg: 0 } + //new Quiche parser doesn't support and/or/xor operators yet :( + _funHandlers set: "and" :args syms { + l <- 0 + r <- preserveTemps: { + l <- compileExpr: (args value) syms: syms + compileExpr: ((args tail) value) syms: syms + } + dest <- getTemp: + if: dest != l { + prog add: (inst: "MOV" #[ + dest + l + ]) + } + prog add: (inst: "AND" #[ + dest + r + ]) + dest + } //allow access to raw instructions foreach: #["MOV" "INC" "DEC" "ADD" "SUB" "MUL" "DIV" "AND" "OR" "XOR" "JLT" "JEQ" "JGT" "HLT"] :idx instName { @@ -780,7 +800,14 @@ functions set: sym def syms define: sym sym } else: { - compileExpr: msg syms: syms + if: (def nodeType) != (ast intlit) || (def val) != 0{ + preserveTemps: { + compileExpr: msg syms: syms + } + } else: { + syms define: sym (mem: _nextVar) + _nextVar <- _nextVar + 1 + } } } else: { error: "Only assignments are allowed at the top level"