public String gerarParserDescendenteRecusivo() {
   String programa =
       "import javax.swing.JOptionPane;\n"
           + "public class z {\n\n"
           + "    public static String sentenca;\n"
           + "    public static String err = \"\";\n"
           + "    \n"
           + "        public static String alex(String a) {\n"
           + "	if(a.length() != 0) {\n"
           + "	    sentenca = sentenca.substring(sentenca.indexOf(a + \" \") + a.length() + 1);\n"
           + "	}\n"
           + "	return sentenca.split(\" \")[0];\n"
           + "    }\n\n"
           + "    public static void error(String e) {\n"
           + "        JOptionPane.showMessageDialog(null, e);\n"
           + "        System.exit(0);\n"
           + "    }"
           + "public static void main(String[] args){\n"
           + "        z.sentenca = args[0]+\" $\";\n"
           + "        String x = z.alex(\"\");"
           + "        x = z."
           + glc.getSimboloInicial()
           + "(x);\n"
           + "        if(x.equals(\"$\")){\n"
           + "            z.error(\"Sentença reconhecida\");\n"
           + "        }else{\n"
           + "            z.error(\"Sentença não reconhecida\");\n"
           + "        }\n"
           + "    }\n";
   String[] Nterminais = gramatica.split("\n");
   for (int i = 0; i < Nterminais.length; i++) {
     String terminal = Nterminais[i].split("->")[0].trim();
     programa += gerarCodigoNTerm(terminal);
     String[] prods = Nterminais[i].split("->")[1].split("\\|");
     for (int j = 0; j < prods.length; j++) {
       if (j != 0) {
         programa += "else ";
       }
       programa += gerarCodigoProd(prods[j].trim(), Nterminais[i].split("->")[0]);
     }
     if (!glc.obterConjuntosFirst().get(terminal).contains("&")) {
       if (errorBuffer.charAt(errorBuffer.length() - 2) == 'u') {
         errorBuffer = errorBuffer.substring(0, errorBuffer.length() - 3);
       }
       programa += "z.error(\"esperava-se " + errorBuffer + " \");\nreturn x;\n}";
     } else {
       programa += "return x;\n}";
     }
     errorBuffer = "";
   }
   // programa += "return x;\n}\n";
   return programa;
 }
  public AnalizadorSintático(String gramatica) {
    this.gramatica = gramatica;
    glc = new GLC(gramatica);
    firsts = glc.obterConjuntosFirst();
    programa = gerarParserDescendenteRecusivo();
    programa += "}";
    FileWriter arquivo;

    try {
      arquivo = new FileWriter(new File("z.java"));
      arquivo.write(programa);
      arquivo.close();
      Runtime.getRuntime().exec("javac z.java");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }