def visitArithOp(self, ctx: DecafParser.ArithOpContext): op = ctx.op.getText() left_type = self.visit(ctx.left) right_type = self.visit(ctx.right) if right_type != type_enum.Integer or left_type != type_enum.Integer: error = expectedError(type_enum.Integer, '%s %s %s' % (left_type, op, right_type), ctx.start.line) self.errors.append(error) return type_enum.Error return type_enum.Integer
def visitConditionalOp(self, ctx: DecafParser.ConditionalOpContext): op = ctx.op.getText() left_type = self.visit(ctx.left) right_type = self.visit(ctx.right) if right_type != type_enum.Boolean or left_type != type_enum.Boolean: error = expectedError(type_enum.Boolean, '%s, %s' % (left_type, right_type), ctx.start.line) self.errors.append(error) return type_enum.Error return type_enum.Boolean
def visitMethodCall(self, ctx: DecafParser.MethodCallExprContext): method_name = str(ctx.ID()) scope = self.scopes.peek() method = scope.typeExists(method_name, 'method') if not method: error = notDefinedError('Method', method_name, ctx.start.line) self.errors.append(error) return type_enum.Error values = [] params = [param.stype for param in method.paramlist.values()] for argument in ctx.arg(): values.append(self.visitArg(argument)) if params != values: error = expectedError(params, values, ctx.start.line) self.errors.append(error) return type_enum.Error return method.ret