slicc: improve support for prefix operations
authorDavid Hashe <david.hashe@amd.com>
Mon, 20 Jul 2015 14:15:18 +0000 (09:15 -0500)
committerDavid Hashe <david.hashe@amd.com>
Mon, 20 Jul 2015 14:15:18 +0000 (09:15 -0500)
This patch fixes the type handling when prefix operations are used.  Previously
prefix operators would assume a void return type, which made it impossible to
combine prefix operations with other expressions.  This patch allows SLICC
programmers to use prefix operations more naturally.

src/mem/slicc/ast/OperatorExprAST.py

index f449a358a6b525cb8c160c781df1c0099e4a54f4..b1614b6a00c65daf02e5a69bc3cacb82277ff5fb 100644 (file)
@@ -107,8 +107,22 @@ class PrefixOperatorExprAST(ExprAST):
         opcode = self.slicc.codeFormatter()
         optype = self.operand.generate(opcode)
 
+        # Figure out what the input and output types should be
+        opmap = {"!": "bool", "-": "int", "++": "Scalar"}
+        if self.op in opmap:
+            output = opmap[self.op]
+            type_in_symtab = self.symtab.find(opmap[self.op], Type)
+            if (optype != type_in_symtab):
+                self.error("Type mismatch: right operand of " +
+                           "unary operator '%s' must be of type '%s'. ",
+                           self.op, type_in_symtab)
+        else:
+            self.error("Invalid prefix operator '%s'",
+                       self.op)
+
+        # All is well
         fix = code.nofix()
         code("(${{self.op}} $opcode)")
         code.fix(fix)
 
-        return self.symtab.find("void", Type)
+        return self.symtab.find(output, Type)