@Before
  public void setup() throws Exception {
    GLC glc =
        new GLC(
            "E -> T E2 \n"
                + "E2 -> + T E2 | & \n"
                + "T -> F T2 \n"
                + "T2 -> * F T2 | & \n"
                + "F -> ( E ) | d");
    ParserGenerator generator = new ParserGenerator(glc);
    parser1 = generator.getParser();

    glc = new GLC("A -> B C \n B -> b | & \n C -> c");
    generator = new ParserGenerator(glc);
    parser2 = generator.getParser();

    glc = new GLC("S -> L L1\nL1 -> = L | &\nL -> * L | id");
    generator = new ParserGenerator(glc);
    parser3 = generator.getParser();

    glc = new GLC("S -> A a A b | B b B a\nA -> &\nB -> &");
    generator = new ParserGenerator(glc);
    parser4 = generator.getParser();

    glc =
        new GLC(
            "P -> begin D C end\nD -> int I | &\nI -> , id I | &\nC -> ; T = E C1 | T = E | com\nC1-> ; T = E C1| &\nE ->  + T E1\nE1 -> + T E1 | &\nT -> id T1 \nT1 -> [ E ] | &\n");
    generator = new ParserGenerator(glc);
    parser5 = generator.getParser();

    glc =
        new GLC(
            "P -> B P1\nP1 -> ; B P1 | &\nI -> , id I | &\nB -> K V C\nK -> c K | &\nV -> v V | &\nC -> b C2 | &\nC2 -> K V ; C e C1 | C e C1 \nC1 -> com C1 | &\n");
    generator = new ParserGenerator(glc);
    parser6 = generator.getParser();
  }
  /**
   * Generate Java beans with getters & setters as well as a json parser
   *
   * @param table
   * @return
   */
  public static ArrayList<String> generateJavaBean(Table table) {
    if (table == null || table.getFields() == null || table.getFields().size() == 0) return null;

    ArrayList<String> javaOutput = new ArrayList<String>();
    String fieldName;
    String fieldNameMethod;
    String fieldType;
    String line;
    // used to reduce the amount of necessary loop
    String line2 = "\n" + Utils.tabGen(1) + "public " + table.getName() + "(";
    javaOutput.add("\npublic class " + table.getName() + " {");
    ArrayList<Field> fields = table.getFields();
    // Field id = new Field("_id", "id", "long", null);
    // fields.add(id);

    // attributes
    for (Field f : fields) {
      if (f != null) {
        fieldType = f.getType();
        if (!fieldType.equalsIgnoreCase(Constants.JUNCTION)
            && !fieldType.equalsIgnoreCase(Constants.CALLER)) {
          fieldName = Utils.getNamePascalCase(f.getName());
          if (f.getType() != Constants.OBJECT) {
            if (fieldType.equalsIgnoreCase(Constants.URI)) {
              fieldType = Constants.INT;
            }

            if (fieldType != Constants.ARRAY) {
              line = Utils.tabGen(1) + "private " + fieldType + " " + fieldName + ";";
            } else {
              line = Utils.tabGen(1) + "private ArrayList<Integer> " + fieldName + ";";
            }
            javaOutput.add(line);
            // if(!fieldName.equalsIgnoreCase("id")) {
            line2 += fieldType + " " + fieldName;
            if (fields.indexOf(f) < fields.size() - 1) {
              line2 += ", ";
            }
            // }
          }
        }
      }
    }

    line2 += ") {";
    line2 += "\n" + Utils.tabGen(2) + "super();";

    // constructors
    line = "\n" + Utils.tabGen(1) + "public " + table.getName() + "() {";
    line += "\n" + Utils.tabGen(2) + "super();\n" + Utils.tabGen(1) + "}";
    javaOutput.add(line);

    for (Field f : fields) {
      if (f != null) {
        fieldType = f.getType();
        if (!fieldType.equalsIgnoreCase(Constants.JUNCTION)
            && !fieldType.equalsIgnoreCase(Constants.CALLER)) {
          fieldName = Utils.getNamePascalCase(f.getName());
          if (fieldName != null) {
            line2 += "\n" + Utils.tabGen(2) + "this." + fieldName + " = " + fieldName + ";";
          }
        }
      }
    }

    line2 += "\n" + Utils.tabGen(1) + "}\n";
    javaOutput.add(line2);

    // getters & setters
    for (Field f : fields) {
      if (f != null) {
        fieldType = f.getType();
        if (!fieldType.equalsIgnoreCase(Constants.JUNCTION)
            && !fieldType.equalsIgnoreCase(Constants.CALLER)) {
          fieldName = Utils.getNamePascalCase(f.getName());
          fieldNameMethod = Utils.getNameCamelCase(f.getName());
          if (fieldType != Constants.OBJECT) {
            if (fieldType.equalsIgnoreCase(Constants.URI)) {
              fieldType = Constants.INT;
            }

            line = Utils.tabGen(1) + "public " + fieldType + " get" + fieldNameMethod + "() {\n";
            line += Utils.tabGen(2) + "return this." + fieldName + ";\n	}\n";
            line +=
                "\n"
                    + Utils.tabGen(1)
                    + "public void set"
                    + fieldNameMethod
                    + "("
                    + fieldType
                    + " "
                    + fieldName
                    + ") {\n";
            line +=
                Utils.tabGen(2)
                    + "this."
                    + fieldName
                    + " = "
                    + fieldName
                    + ";\n"
                    + Utils.tabGen(1)
                    + "}\n";
            javaOutput.add(line);
          }
        }
      }
    }
    javaOutput.addAll(ParserGenerator.generateJavaParser(table));
    javaOutput.add("}");
    return javaOutput;
  }