Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.12 KB | None | 0 0
  1. package br.ufpe.cin.if688.minijava.visitor;
  2.  
  3. import br.ufpe.cin.if688.minijava.ast.And;
  4. import br.ufpe.cin.if688.minijava.ast.ArrayAssign;
  5. import br.ufpe.cin.if688.minijava.ast.ArrayLength;
  6. import br.ufpe.cin.if688.minijava.ast.ArrayLookup;
  7. import br.ufpe.cin.if688.minijava.ast.Assign;
  8. import br.ufpe.cin.if688.minijava.ast.Block;
  9. import br.ufpe.cin.if688.minijava.ast.BooleanType;
  10. import br.ufpe.cin.if688.minijava.ast.Call;
  11. import br.ufpe.cin.if688.minijava.ast.ClassDeclExtends;
  12. import br.ufpe.cin.if688.minijava.ast.ClassDeclSimple;
  13. import br.ufpe.cin.if688.minijava.ast.False;
  14. import br.ufpe.cin.if688.minijava.ast.Formal;
  15. import br.ufpe.cin.if688.minijava.ast.Identifier;
  16. import br.ufpe.cin.if688.minijava.ast.IdentifierExp;
  17. import br.ufpe.cin.if688.minijava.ast.IdentifierType;
  18. import br.ufpe.cin.if688.minijava.ast.If;
  19. import br.ufpe.cin.if688.minijava.ast.IntArrayType;
  20. import br.ufpe.cin.if688.minijava.ast.IntegerLiteral;
  21. import br.ufpe.cin.if688.minijava.ast.IntegerType;
  22. import br.ufpe.cin.if688.minijava.ast.LessThan;
  23. import br.ufpe.cin.if688.minijava.ast.MainClass;
  24. import br.ufpe.cin.if688.minijava.ast.MethodDecl;
  25. import br.ufpe.cin.if688.minijava.ast.Minus;
  26. import br.ufpe.cin.if688.minijava.ast.NewArray;
  27. import br.ufpe.cin.if688.minijava.ast.NewObject;
  28. import br.ufpe.cin.if688.minijava.ast.Not;
  29. import br.ufpe.cin.if688.minijava.ast.Plus;
  30. import br.ufpe.cin.if688.minijava.ast.Print;
  31. import br.ufpe.cin.if688.minijava.ast.Program;
  32. import br.ufpe.cin.if688.minijava.ast.This;
  33. import br.ufpe.cin.if688.minijava.ast.Times;
  34. import br.ufpe.cin.if688.minijava.ast.True;
  35. import br.ufpe.cin.if688.minijava.ast.VarDecl;
  36. import br.ufpe.cin.if688.minijava.ast.While;
  37. import br.ufpe.cin.if688.minijava.symboltable.Class;
  38. import br.ufpe.cin.if688.minijava.symboltable.Method;
  39. import br.ufpe.cin.if688.minijava.symboltable.SymbolTable;
  40.  
  41. public class BuildSymbolTableVisitor implements IVisitor<Void> {
  42.  
  43.     SymbolTable symbolTable;
  44.  
  45.     public BuildSymbolTableVisitor() {
  46.         symbolTable = new SymbolTable();
  47.     }
  48.  
  49.     public SymbolTable getSymbolTable() {
  50.         return symbolTable;
  51.     }
  52.  
  53.     private Class currClass;
  54.     private Method currMethod;
  55.  
  56.     // MainClass m;
  57.     // ClassDeclList cl;
  58.     public Void visit(Program n) {
  59.         n.m.accept(this);
  60.         for (int i = 0; i < n.cl.size(); i++) {
  61.             n.cl.elementAt(i).accept(this);
  62.         }
  63.         return null;
  64.     }
  65.  
  66.     // Identifier i1,i2;
  67.     // Statement s;
  68.     public Void visit(MainClass n) {
  69.         symbolTable.addClass(n.i1.toString(), null);
  70.         currClass = this.symbolTable.getClass(n.i1.toString());
  71.         currClass.addMethod("main", null);
  72.         currMethod = this.currClass.getMethod("main");
  73.         currMethod.addParam(n.i2.toString(), new IntArrayType());
  74.         n.i1.accept(this);
  75.         n.i2.accept(this);
  76.         n.s.accept(this);
  77.         currMethod = null;
  78.         currClass = null;
  79.         return null;
  80.     }
  81.  
  82.     // Identifier i;
  83.     // VarDeclList vl;
  84.     // MethodDeclList ml;
  85.     public Void visit(ClassDeclSimple n) {
  86.         if(symbolTable.addClass(n.i.toString(), null)) {
  87.             currClass = this.symbolTable.getClass(n.i.toString());
  88.             n.i.accept(this);
  89.             for (int i = 0; i < n.vl.size(); i++) {
  90.                 n.vl.elementAt(i).accept(this);
  91.             }
  92.             for (int i = 0; i < n.ml.size(); i++) {
  93.                 n.ml.elementAt(i).accept(this);
  94.             }
  95.         }else {
  96.             System.out.println("Class " + n.i.toString() + " is already defined in program.");
  97.         }
  98.         currClass = null;
  99.         return null;
  100.     }
  101.  
  102.     // Identifier i;
  103.     // Identifier j;
  104.     // VarDeclList vl;
  105.     // MethodDeclList ml;
  106.     public Void visit(ClassDeclExtends n) {
  107.         if(symbolTable.addClass(n.i.toString(), n.j.toString())) {
  108.             currClass = this.symbolTable.getClass(n.i.toString());
  109.             n.i.accept(this);
  110.             n.j.accept(this);
  111.             for (int i = 0; i < n.vl.size(); i++) {
  112.                 n.vl.elementAt(i).accept(this);
  113.             }
  114.             for (int i = 0; i < n.ml.size(); i++) {
  115.                 n.ml.elementAt(i).accept(this);
  116.             }
  117.         }else{
  118.             System.out.println("Class " + n.i.toString() + " is already defined in program.");
  119.         }
  120.         currClass = null;
  121.         return null;
  122.     }
  123.  
  124.     // Type t;
  125.     // Identifier i;
  126.     public Void visit(VarDecl n) {
  127.         if(currMethod==null && !currClass.addVar(n.i.toString(), n.t)){
  128.             System.out.println("Variable " + n.i.toString() + " is already defined in class " + this.currClass.getId()+".");
  129.             System.exit(0);
  130.         }else if(currMethod!=null && !currMethod.addVar(n.i.toString(), n.t)){
  131.             System.out.println("Variable " + n.i.toString() + " is already defined in method " + this.currMethod.getId()+".");
  132.         }
  133.         n.t.accept(this);
  134.         n.i.accept(this);
  135.         return null;
  136.     }
  137.  
  138.     // Type t;
  139.     // Identifier i;
  140.     // FormalList fl;
  141.     // VarDeclList vl;
  142.     // StatementList sl;
  143.     // Exp e;
  144.     public Void visit(MethodDecl n) {
  145.         if(currClass.addMethod(n.i.toString(), n.t)){
  146.             currMethod = this.currClass.getMethod(n.i.toString());
  147.             n.t.accept(this);
  148.             n.i.accept(this);
  149.             for (int i = 0; i < n.fl.size(); i++) {
  150.                 n.fl.elementAt(i).accept(this);
  151.             }
  152.             for (int i = 0; i < n.vl.size(); i++) {
  153.                 n.vl.elementAt(i).accept(this);
  154.             }
  155.             for (int i = 0; i < n.sl.size(); i++) {
  156.                 n.sl.elementAt(i).accept(this);
  157.             }
  158.             n.e.accept(this);
  159.         }else{
  160.             System.out.println("Method " + n.i.toString() + " is already defined in class " + this.currClass.getId() + ".");
  161.         }
  162.         currMethod = null;
  163.         return null;
  164.     }
  165.  
  166.     // Type t;
  167.     // Identifier i;
  168.     public Void visit(Formal n) {
  169.         if(this.currMethod.addParam(n.i.toString(), n.t)) {
  170.             n.t.accept(this);
  171.             n.i.accept(this);
  172.         }else{
  173.             System.out.println("Variable " + n.i.toString() + " is already defined in method " + this.currMethod.getId()+".");
  174.         }
  175.         return null;
  176.     }
  177.  
  178.     public Void visit(IntArrayType n) {
  179.         return null;
  180.     }
  181.  
  182.     public Void visit(BooleanType n) {
  183.         return null;
  184.     }
  185.  
  186.     public Void visit(IntegerType n) {
  187.         return null;
  188.     }
  189.  
  190.     // String s;
  191.     public Void visit(IdentifierType n) {
  192.         return null;
  193.     }
  194.  
  195.     // StatementList sl;
  196.     public Void visit(Block n) {
  197.         for (int i = 0; i < n.sl.size(); i++) {
  198.             n.sl.elementAt(i).accept(this);
  199.         }
  200.         return null;
  201.     }
  202.  
  203.     // Exp e;
  204.     // Statement s1,s2;
  205.     public Void visit(If n) {
  206.         n.e.accept(this);
  207.         n.s1.accept(this);
  208.         n.s2.accept(this);
  209.         return null;
  210.     }
  211.  
  212.     // Exp e;
  213.     // Statement s;
  214.     public Void visit(While n) {
  215.         n.e.accept(this);
  216.         n.s.accept(this);
  217.         return null;
  218.     }
  219.  
  220.     // Exp e;
  221.     public Void visit(Print n) {
  222.         n.e.accept(this);
  223.         return null;
  224.     }
  225.  
  226.     // Identifier i;
  227.     // Exp e;
  228.     public Void visit(Assign n) {
  229.         n.i.accept(this);
  230.         n.e.accept(this);
  231.         return null;
  232.     }
  233.  
  234.     // Identifier i;
  235.     // Exp e1,e2;
  236.     public Void visit(ArrayAssign n) {
  237.         n.i.accept(this);
  238.         n.e1.accept(this);
  239.         n.e2.accept(this);
  240.         return null;
  241.     }
  242.  
  243.     // Exp e1,e2;
  244.     public Void visit(And n) {
  245.         n.e1.accept(this);
  246.         n.e2.accept(this);
  247.         return null;
  248.     }
  249.  
  250.     // Exp e1,e2;
  251.     public Void visit(LessThan n) {
  252.         n.e1.accept(this);
  253.         n.e2.accept(this);
  254.         return null;
  255.     }
  256.  
  257.     // Exp e1,e2;
  258.     public Void visit(Plus n) {
  259.         n.e1.accept(this);
  260.         n.e2.accept(this);
  261.         return null;
  262.     }
  263.  
  264.     // Exp e1,e2;
  265.     public Void visit(Minus n) {
  266.         n.e1.accept(this);
  267.         n.e2.accept(this);
  268.         return null;
  269.     }
  270.  
  271.     // Exp e1,e2;
  272.     public Void visit(Times n) {
  273.         n.e1.accept(this);
  274.         n.e2.accept(this);
  275.         return null;
  276.     }
  277.  
  278.     // Exp e1,e2;
  279.     public Void visit(ArrayLookup n) {
  280.         n.e1.accept(this);
  281.         n.e2.accept(this);
  282.         return null;
  283.     }
  284.  
  285.     // Exp e;
  286.     public Void visit(ArrayLength n) {
  287.         n.e.accept(this);
  288.         return null;
  289.     }
  290.  
  291.     // Exp e;
  292.     // Identifier i;
  293.     // ExpList el;
  294.     public Void visit(Call n) {
  295.         n.e.accept(this);
  296.         n.i.accept(this);
  297.         for (int i = 0; i < n.el.size(); i++) {
  298.             n.el.elementAt(i).accept(this);
  299.         }
  300.         return null;
  301.     }
  302.  
  303.     // int i;
  304.     public Void visit(IntegerLiteral n) {
  305.         return null;
  306.     }
  307.  
  308.     public Void visit(True n) {
  309.         return null;
  310.     }
  311.  
  312.     public Void visit(False n) {
  313.         return null;
  314.     }
  315.  
  316.     // String s;
  317.     public Void visit(IdentifierExp n) {
  318.         return null;
  319.     }
  320.  
  321.     public Void visit(This n) {
  322.         return null;
  323.     }
  324.  
  325.     // Exp e;
  326.     public Void visit(NewArray n) {
  327.         n.e.accept(this);
  328.         return null;
  329.     }
  330.  
  331.     // Identifier i;
  332.     public Void visit(NewObject n) {
  333.         return null;
  334.     }
  335.  
  336.     // Exp e;
  337.     public Void visit(Not n) {
  338.         n.e.accept(this);
  339.         return null;
  340.     }
  341.  
  342.     // String s;
  343.     public Void visit(Identifier n) {
  344.         return null;
  345.     }
  346. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement