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(); } }