Advertisement
minh_tran_782

ASTGeneration_MT.py

Mar 14th, 2023 (edited)
605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.72 KB | None | 0 0
  1. #Question 1
  2. from antlr4 import *
  3. class ASTGeneration(MPVisitor):
  4.     #program: vardecls EOF
  5.     def visitProgram(self,ctx:MPParser.ProgramContext):
  6.         return self.visit(ctx.vardecls()) + 1 #1 la EOF
  7.     # vardecltail : vardecl vardecltail;
  8.     def visitVardecls(self,ctx:MPParser.VardeclsContext):
  9.         return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
  10.     # vardecltail : vardecl vardecltail |
  11.     def visitVardecltail(self,ctx:MPParser.VardecltailContext):
  12.         if (ctx.vardecl()):
  13.             return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
  14.         return 0
  15.     #vardecl: mptype ids ';'
  16.     def visitVardecl(self,ctx:MPParser.VardeclContext):
  17.         return self.visit(ctx.mptype()) + self.visit(ctx.ids()) + 1
  18.    
  19.     def visitMptype(self,ctx:MPParser.MptypeContext):
  20.         return 1
  21.     #ids: ID ',' ids | ID;
  22.     def visitIds(self,ctx:MPParser.IdsContext):
  23.         if ctx.getChildCount() == 1:
  24.             return 1
  25.         return self.visit(ctx.ids()) + 2
  26. #Question 2
  27. class ASTGeneration(MPVisitor):
  28.  
  29.     def visitProgram(self,ctx:MPParser.ProgramContext):
  30.         return self.visit(ctx.vardecls())
  31.     def visitVardecls(self,ctx:MPParser.VardeclsContext):
  32.         return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail()) + 2
  33. #vardecl: mptype ids ';' ;
  34.  
  35.     def visitVardecltail(self,ctx:MPParser.VardecltailContext):
  36.         if (ctx.vardecl()):
  37.             return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
  38.         return 0
  39. #vardecl: mptype ids ';' ;
  40.     def visitVardecl(self,ctx:MPParser.VardeclContext):
  41.         return self.visit(ctx.mptype()) + self.visit(ctx.ids()) + 2
  42.  
  43.     def visitMptype(self,ctx:MPParser.MptypeContext):
  44.         return 1
  45.     def visitIds(self,ctx:MPParser.IdsContext):
  46.         if ctx.getChildCount() == 1:
  47.             return 1
  48.         return self.visit(ctx.ids()) + 1
  49. #Question 3
  50. class ASTGeneration(MPVisitor):
  51.  
  52.     def visitProgram(self,ctx:MPParser.ProgramContext):
  53.         return Program(self.visit(ctx.vardecls()))
  54.     def visitVardecls(self,ctx:MPParser.VardeclsContext):
  55.         return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
  56. # vardecltail: vardecl vardecltail | ; Trả về list các vardecl
  57.     def visitVardecltail(self,ctx:MPParser.VardecltailContext):
  58.         if (ctx.getChildCount() == 0):
  59.             return []
  60.         return self.visit(ctx.vardecl()) + self.visit(ctx.vardecltail())
  61. # Trả về list các phần tử, cùng kiểu của nó.
  62.     def visitVardecl(self,ctx:MPParser.VardeclContext):
  63.         mptype = self.visit(ctx.mptype())
  64.         idlist = self.visit(ctx.ids())
  65.         return [VarDecl(x,mptype) for x in idlist]
  66.     def visitMptype(self,ctx:MPParser.MptypeContext):
  67.         return IntType() if ctx.INTTYPE() else FloatType()
  68.  
  69.     def visitIds(self,ctx:MPParser.IdsContext):
  70.         if (ctx.getChildCount() == 1):
  71.             return [Id(ctx.ID().getText())]
  72.         return [Id(ctx.ID().getText())] + self.visit(ctx.ids())
  73. #Question 4
  74. from functools import reduce
  75. class ASTGeneration(MPVisitor):
  76.     def visitProgram(self,ctx:MPParser.ProgramContext):
  77.         return Program(reduce(lambda prev, curr: prev + self.visit(curr), ctx.vardecl(), []))
  78. #1 vardecl cua antlr khi visit, tra ve 1 list cac vardecl cua ast.
  79. #2 list long trong list -> flatten.
  80.     def visitVardecl(self,ctx:MPParser.VardeclContext):
  81.         mptype = self.visit(ctx.mptype())
  82.         ids = self.visit(ctx.ids())
  83.         return list(map(lambda x: VarDecl(x,mptype),ids))
  84.  
  85.     def visitMptype(self,ctx:MPParser.MptypeContext):
  86.  
  87.         return IntType() if ctx.INTTYPE() else FloatType()
  88.  
  89.     def visitIds(self,ctx:MPParser.IdsContext):
  90.  
  91.         return list(map(lambda x: Id(x.getText()), ctx.ID()))
  92. #Question 5
  93. class ASTGeneration(MPVisitor):
  94.  
  95.     def visitProgram(self,ctx:MPParser.ProgramContext):
  96.         return self.visit(ctx.exp())
  97.  
  98.     def visitExp(self,ctx:MPParser.ExpContext):
  99.         if ctx.ASSIGN():
  100.             left = self.visit(ctx.term())
  101.             right = self.visit(ctx.exp())
  102.             return Binary(ctx.ASSIGN().getText(),left,right)
  103.         return self.visit(ctx.term())
  104.        
  105.     def visitTerm(self,ctx:MPParser.TermContext):
  106.         if ctx.COMPARE():
  107.             left = self.visit(ctx.factor(0))
  108.             right = self.visit(ctx.factor(1))
  109.             return Binary(ctx.COMPARE().getText(),left,right)
  110.         return self.visit(ctx.factor(0))
  111.        
  112.     def visitFactor(self,ctx:MPParser.FactorContext):
  113.         if ctx.ANDOR():
  114.             left = self.visit(ctx.factor())
  115.             right = self.visit(ctx.operand())
  116.             return Binary(ctx.ANDOR().getText(),left,right)
  117.         return self.visit(ctx.operand())  
  118.  
  119.     def visitOperand(self,ctx:MPParser.OperandContext):
  120.         if ctx.ID():
  121.             return Id(ctx.ID().getText())
  122.         elif ctx.INTLIT():
  123.             return IntLiteral(int(ctx.INTLIT().getText()))
  124.         elif ctx.BOOLIT():
  125.             return BooleanLiteral(ctx.BOOLIT().getText() == "True")
  126.         else: return self.visit(ctx.exp())
  127. #Question 6
  128. class ASTGeneration(MPVisitor):
  129.  
  130.     def visitProgram(self,ctx:MPParser.ProgramContext):
  131.  
  132.         return self.visit(ctx.exp())
  133.  
  134.     def visitExp(self,ctx:MPParser.ExpContext):
  135.         terms = [self.visit(x) for x in ctx.term()] #[operand(d), _operand(e), _operand(f)]
  136.         assigns = [x.getText() for x in ctx.ASSIGN()]
  137.         right = terms[-1]
  138.         for i in range(len(assigns)):
  139.             op = assigns[len(assigns) - i- 1] # left22222222222222222222222222222222222      
  140.             left = terms[len(assigns) - i- 1]
  141.             right = Binary(op,left,right)
  142.         return right
  143.     def visitTerm(self,ctx:MPParser.TermContext):
  144.         if ctx.COMPARE():
  145.             left = self.visit(ctx.factor(0))
  146.             right = self.visit(ctx.factor(1))
  147.             return Binary(ctx.COMPARE().getText(),left,right)
  148.         return self.visit(ctx.factor(0))
  149.     def visitFactor(self,ctx:MPParser.FactorContext):
  150.         operands = [self.visit(x) for x in ctx.operand()] #[operand(d), _operand(e), _operand(f)]
  151.         addors = [x.getText() for x in ctx.ANDOR()] # [_or, _or, _and, _or]
  152.         left = operands[0]
  153.         if ctx.ANDOR():
  154.             for i in range(len(addors)):
  155.                 op = addors[i] # left
  156.                 right = operands[i+1]
  157.                 left = Binary(op,left,right)
  158.         return left
  159.     def visitOperand(self,ctx:MPParser.OperandContext):
  160.         if ctx.ID():
  161.             return Id(ctx.ID().getText())
  162.         elif ctx.INTLIT():
  163.             return IntLiteral(int(ctx.INTLIT().getText()))
  164.         elif ctx.BOOLIT():
  165.             return BooleanLiteral(ctx.BOOLIT().getText() == "True")
  166.         else: return self.visit(ctx.exp())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement