コード例 #1
0
ファイル: evaluador.py プロジェクト: alv16106/DecafCompiler
    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
コード例 #2
0
ファイル: evaluador.py プロジェクト: alv16106/DecafCompiler
    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
コード例 #3
0
ファイル: evaluador.py プロジェクト: alv16106/DecafCompiler
    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