Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Question 1
- from antlr4 import *
- class ASTGeneration(MPVisitor):
- #program: vardecls EOF
- def visitProgram(self,ctx:MPParser.ProgramContext):
- return self.visit(ctx.vardecls()) + 1 #1 la EOF
- # vardecltail : vardecl vardecltail;
- def visitVardecls(self,ctx:MPParser.VardeclsContext):
- return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
- # vardecltail : vardecl vardecltail |
- def visitVardecltail(self,ctx:MPParser.VardecltailContext):
- if (ctx.vardecl()):
- return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
- return 0
- #vardecl: mptype ids ';'
- def visitVardecl(self,ctx:MPParser.VardeclContext):
- return self.visit(ctx.mptype()) + self.visit(ctx.ids()) + 1
- def visitMptype(self,ctx:MPParser.MptypeContext):
- return 1
- #ids: ID ',' ids | ID;
- def visitIds(self,ctx:MPParser.IdsContext):
- if ctx.getChildCount() == 1:
- return 1
- return self.visit(ctx.ids()) + 2
- #Question 2
- class ASTGeneration(MPVisitor):
- def visitProgram(self,ctx:MPParser.ProgramContext):
- return self.visit(ctx.vardecls())
- def visitVardecls(self,ctx:MPParser.VardeclsContext):
- return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail()) + 2
- #vardecl: mptype ids ';' ;
- def visitVardecltail(self,ctx:MPParser.VardecltailContext):
- if (ctx.vardecl()):
- return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
- return 0
- #vardecl: mptype ids ';' ;
- def visitVardecl(self,ctx:MPParser.VardeclContext):
- return self.visit(ctx.mptype()) + self.visit(ctx.ids()) + 2
- def visitMptype(self,ctx:MPParser.MptypeContext):
- return 1
- def visitIds(self,ctx:MPParser.IdsContext):
- if ctx.getChildCount() == 1:
- return 1
- return self.visit(ctx.ids()) + 1
- #Question 3
- class ASTGeneration(MPVisitor):
- def visitProgram(self,ctx:MPParser.ProgramContext):
- return Program(self.visit(ctx.vardecls()))
- def visitVardecls(self,ctx:MPParser.VardeclsContext):
- return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
- # vardecltail: vardecl vardecltail | ; Trả về list các vardecl
- def visitVardecltail(self,ctx:MPParser.VardecltailContext):
- if (ctx.getChildCount() == 0):
- return []
- return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
- # Trả về list các phần tử, cùng kiểu của nó.
- def visitVardecl(self,ctx:MPParser.VardeclContext):
- mptype = self.visit(ctx.mptype())
- idlist = self.visit(ctx.ids())
- return [VarDecl(x,mptype) for x in idlist]
- def visitMptype(self,ctx:MPParser.MptypeContext):
- return IntType() if ctx.INTTYPE() else FloatType()
- def visitIds(self,ctx:MPParser.IdsContext):
- if (ctx.getChildCount() == 1):
- return [Id(ctx.ID().getText())]
- return [Id(ctx.ID().getText())] + self.visit(ctx.ids())
- #Question 4
- from functools import reduce
- class ASTGeneration(MPVisitor):
- def visitProgram(self,ctx:MPParser.ProgramContext):
- return Program(reduce(lambda prev, curr: prev + self.visit(curr), ctx.vardecl(), []))
- #1 vardecl cua antlr khi visit, tra ve 1 list cac vardecl cua ast.
- #2 list long trong list -> flatten.
- def visitVardecl(self,ctx:MPParser.VardeclContext):
- mptype = self.visit(ctx.mptype())
- ids = self.visit(ctx.ids())
- return list(map(lambda x: VarDecl(x,mptype),ids))
- def visitMptype(self,ctx:MPParser.MptypeContext):
- return IntType() if ctx.INTTYPE() else FloatType()
- def visitIds(self,ctx:MPParser.IdsContext):
- return list(map(lambda x: Id(x.getText()), ctx.ID()))
- #Question 5
- class ASTGeneration(MPVisitor):
- def visitProgram(self,ctx:MPParser.ProgramContext):
- return self.visit(ctx.exp())
- def visitExp(self,ctx:MPParser.ExpContext):
- if ctx.ASSIGN():
- left = self.visit(ctx.term())
- right = self.visit(ctx.exp())
- return Binary(ctx.ASSIGN().getText(),left,right)
- return self.visit(ctx.term())
- def visitTerm(self,ctx:MPParser.TermContext):
- if ctx.COMPARE():
- left = self.visit(ctx.factor(0))
- right = self.visit(ctx.factor(1))
- return Binary(ctx.COMPARE().getText(),left,right)
- return self.visit(ctx.factor(0))
- def visitFactor(self,ctx:MPParser.FactorContext):
- if ctx.ANDOR():
- left = self.visit(ctx.factor())
- right = self.visit(ctx.operand())
- return Binary(ctx.ANDOR().getText(),left,right)
- return self.visit(ctx.operand())
- def visitOperand(self,ctx:MPParser.OperandContext):
- if ctx.ID():
- return Id(ctx.ID().getText())
- elif ctx.INTLIT():
- return IntLiteral(int(ctx.INTLIT().getText()))
- elif ctx.BOOLIT():
- return BooleanLiteral(ctx.BOOLIT().getText() == "True")
- else: return self.visit(ctx.exp())
- #Question 6
- class ASTGeneration(MPVisitor):
- def visitProgram(self,ctx:MPParser.ProgramContext):
- return self.visit(ctx.exp())
- def visitExp(self,ctx:MPParser.ExpContext):
- terms = [self.visit(x) for x in ctx.term()] #[operand(d), _operand(e), _operand(f)]
- assigns = [x.getText() for x in ctx.ASSIGN()]
- right = terms[-1]
- for i in range(len(assigns)):
- op = assigns[len(assigns) - i- 1] # left22222222222222222222222222222222222
- left = terms[len(assigns) - i- 1]
- right = Binary(op,left,right)
- return right
- def visitTerm(self,ctx:MPParser.TermContext):
- if ctx.COMPARE():
- left = self.visit(ctx.factor(0))
- right = self.visit(ctx.factor(1))
- return Binary(ctx.COMPARE().getText(),left,right)
- return self.visit(ctx.factor(0))
- def visitFactor(self,ctx:MPParser.FactorContext):
- operands = [self.visit(x) for x in ctx.operand()] #[operand(d), _operand(e), _operand(f)]
- addors = [x.getText() for x in ctx.ANDOR()] # [_or, _or, _and, _or]
- left = operands[0]
- if ctx.ANDOR():
- for i in range(len(addors)):
- op = addors[i] # left
- right = operands[i+1]
- left = Binary(op,left,right)
- return left
- def visitOperand(self,ctx:MPParser.OperandContext):
- if ctx.ID():
- return Id(ctx.ID().getText())
- elif ctx.INTLIT():
- return IntLiteral(int(ctx.INTLIT().getText()))
- elif ctx.BOOLIT():
- return BooleanLiteral(ctx.BOOLIT().getText() == "True")
- else: return self.visit(ctx.exp())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement