Ejemplo n.º 1
0
    def visitWhileStmt(self, ctx: DecafeParser.WhileStmtContext):
        scope = self.symTable.getCurrentScope()

        evaluator = MyEvaluator(self.symTable)
        evaluator.visit(ctx.expression())
        t = evaluator.typeVal

        if t != 'boolean':
            self.errorMsg.extend(
                RecordError("Expected a boolean expression", ctx))

        # make the new scope
        print(self.symTable.getCurrentScope().id)
        self.symTable.pushScope("while", scope.id, "while")
        self.symTable.nextScope()

        if ctx.block() != None:
            try:
                for b in ctx.block():
                    self.visit(b)
            except:
                self.visit(ctx.block())

        # exit scope
        self.symTable.prevScope()
        return
Ejemplo n.º 2
0
    def visitMethodDeclaration(self,
                               ctx: DecafeParser.MethodDeclarationContext):
        name = str(ctx.ID())
        scope = self.symTable.getCurrentScope()
        returnType = ctx.returnType.getText()

        # make the new scope
        self.symTable.pushScope(name, scope.id, "method", returnType)
        self.symTable.nextScope()
        # visit
        if ctx.parameter() != None:
            parameters = ctx.parameter()
            for param in parameters:
                id = param.lex.text
                typ = param.typevar.getText()
                type = self.symTable.types.getByName(typ)
                self.symTable.pushVar(id, type.id)
                self.symTable.pushParam(type.id)

        visit = self.visitChildren(ctx.block())
        # exit scope

        # check for right return type
        evaluator = MyEvaluator(self.symTable)
        evaluator.visit(ctx)

        if evaluator.typeVal == "error":
            self.errorMsg.extend(RecordError(evaluator.errorMsg, ctx))

        self.symTable.prevScope()
        return visit
Ejemplo n.º 3
0
 def visitCondOpExpr(self, ctx: DecafeParser.CondOpExprContext):
     evaluator = MyEvaluator(self.symTable)
     evaluator.visit(ctx)
     if evaluator.typeVal == 'error':
         self.errorMsg.extend(RecordError(evaluator.errorMsg, ctx))
     return
Ejemplo n.º 4
0
 def visitNegationExpr(self, ctx: DecafeParser.NegationExprContext):
     evaluator = MyEvaluator(self.symTable)
     evaluator.visit(ctx.expression())
     if evaluator.typeVal == 'error':
         self.errorMsg.extend(RecordError(evaluator.errorMsg, ctx))
     return