diff --git a/ExprPrimaryNodes.py b/ExprPrimaryNodes.py index 92eb8fddbea225aabdd7a87c56a9bfd44a4f34d7..1d948a4b60aef56693a681b698fc91204ae5d62d 100644 --- a/ExprPrimaryNodes.py +++ b/ExprPrimaryNodes.py @@ -194,7 +194,7 @@ class AssignNode(ASTNode): self.env = None self.children = [] self.typeName = typeName # the type (class/interface) this node belongs under - + if parseTree.children[0].children[0].name == 'fieldAccess': self.left = FieldAccessNode(parseTree.children[0].children[0], typeName) elif parseTree.children[0].children[0].name == 'arrayAccess': @@ -210,16 +210,16 @@ class AssignNode(ASTNode): self.right.disambigName() # helperDisambigName(self.right) # helperDisambigName(self.left) - + def checkType(self): self.left.checkType() self.right.checkType() - + if self.left.myType.assignable(self.right.myType): self.myType = self.left.myType return - raise Exception("ERROR: assignment operation failed. Cannot assign type {0} to type {1} at class {2}".format(self.left.myType.name, self.right.myType.name, self.typeName)) + raise Exception("ERROR: assignment operation failed. Cannot assign type {0} to type {1} at class {2}".format(self.left.myType.name, self.right.myType.name, self.typeName)) ################################################################################## @@ -361,7 +361,7 @@ class ExprNode(ASTNode): return # Numeric types - elif self.left.myType.isNum() and self.right.myType.isNum(): + if self.left.myType.isNum() and self.right.myType.isNum(): # Comparisons: if self.op in ['==', '!=', '<=', '>=', '>', '<']: self.myType = TypeStruct("boolean", None) @@ -371,18 +371,22 @@ class ExprNode(ASTNode): self.myType = TypeStruct("int", None) return # Boolean operations: - elif self.left.myType.name == 'boolean' and self.right.myType.name == 'boolean': + if self.left.myType.name == 'boolean' and self.right.myType.name == 'boolean': if self.op in ['&&', '&', '|', '||', '!=', '==']: self.myType = TypeStruct("boolean", None) return # Other Comparisons: - elif self.left.myType.assignable(self.right.myType) or self.right.myType.assignable(self.left.myType): - if self.op == '==' or self.op == '!=' or self.op == 'instanceof': + if self.op == 'instanceof': + self.myType = TypeStruct("boolean", None) + return + + if self.left.myType.assignable(self.right.myType) or self.right.myType.assignable(self.left.myType): + if self.op == '==' or self.op == '!=': self.myType = TypeStruct("boolean", None) return # String concat: - elif (self.left.myType.name =='java.lang.String' and self.right.myType.name not in ['null', 'void']) \ + if (self.left.myType.name =='java.lang.String' and self.right.myType.name not in ['null', 'void']) \ or (self.right.myType.name =='java.lang.String' and self.left.myType.name not in ['null', 'void']): self.myType = TypeStruct('java.lang.String', self.env.getNode('java.lang.String', 'type')) self.myType.link(self.env)