def visitFactor(self, ctx: MPParser.FactorContext): if ctx.expression(): return self.visit(ctx.expression()) elif ctx.invocation_expression(): return CallExpr(Id(ctx.IDENT().getText()), self.visit(ctx.invocation_expression())) elif ctx.literal(): return self.visit(ctx.literal()) elif ctx.IDENT(): return Id(ctx.IDENT().getText()) elif ctx.STRING_LITERAL(): return StringLiteral(ctx.STRING_LITERAL().getText()) return
def visitProgram(self, ast, c): ''' ast: Program c: Unknown => c ''' self.emit.printout( self.emit.emitPROLOG(self.className, "java.lang.Object")) e = SubBody(None, self.env) # generate global declare list for x in ast.decl: # returns Symbol on no Gen self.env += [self.visit(x, e)] e.gen = True for x in ast.decl: # recall that e = SubBody(None, self.env) # and e.sym = self.env as reference self.visit(x, e) # generate default constructor self.genMETHOD(FuncDecl(Id("<init>"), list(), list(), list(), None), c, Frame("<init>", VoidType)) self.emit.emitEPILOG() return c
def visitLhs(self, ctx: MPParser.LhsContext): """ return IDENT or index_pression """ if ctx.IDENT(): return Id(ctx.IDENT().getText()) else: return self.visit(ctx.index_expression())
def visitFunc_decl(self, ctx: MPParser.Func_declContext): ident = Id(ctx.IDENT().getText()) param_list = self.visit(ctx.param_list()) if ctx.param_list() else [] mptype = self.visit(ctx.mptype()) var_decl = flatten(list(map(self.visit, ctx.var_decl()))) compound_statement = self.visit(ctx.compound_statement()) return FuncDecl(ident, param_list, var_decl, compound_statement, mptype)
def visitIdenlist(self, ctx: MPParser.IdenlistContext): """ return list of iden """ ident = Id(ctx.IDENT().getText()) if ctx.idenlist(): return [ident] + self.visit(ctx.idenlist()) else: return [ident]
def visitCall_statement(self, ctx: MPParser.Call_statementContext): param = self.visit(ctx.call_param()) if ctx.call_param() else [] return CallStmt(Id(ctx.IDENT().getText()), param)
def visitFor_statement(self, ctx: MPParser.For_statementContext): up = True if ctx.TO() else False return For(Id(ctx.IDENT().getText()), self.visit(ctx.expression(0)), self.visit(ctx.expression(1)), up, self.visit(ctx.statement()))