From: David Hashe Date: Mon, 20 Jul 2015 14:15:18 +0000 (-0500) Subject: slicc: improve support for prefix operations X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=93fff6f636b94524fd8c4d1f9d0e01cfcd695c50;p=gem5.git slicc: improve support for prefix operations 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. --- diff --git a/src/mem/slicc/ast/OperatorExprAST.py b/src/mem/slicc/ast/OperatorExprAST.py index f449a358a..b1614b6a0 100644 --- a/src/mem/slicc/ast/OperatorExprAST.py +++ b/src/mem/slicc/ast/OperatorExprAST.py @@ -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)