// Función con una gram'atica estatica para probar primeros... public void TestPrimeros() { Primeros primeros = new Primeros(MainWindow.productions, noTerminales); var nada = primeros.GetView(); PrimerosTable.ItemsSource = nada; }
private List <string> P(string s) { List <string> primeros = new List <string>(); if (Gramatica.EsTerminal(s)) { primeros.Add(s); return(primeros); } char nt = s[0]; if (Primeros.TryGetValue(nt, out List <string> primerosD)) { return(primerosD); } if (Gramatica.Produccciones.Exists(p => p.Cabeza == nt && p.Cuerpo == Produccion.EPSILON)) { primeros.Add(Produccion.EPSILON); } List <Produccion> producciones = Gramatica.Produccciones.Where(p => p.Cabeza == nt && p.Cuerpo != Produccion.EPSILON).ToList(); foreach (Produccion p in producciones) { int n = p.Palabras.Length; foreach (string a in p.Palabras) { List <string> primerosA = P(a); primeros.AddRange(primerosA); if (!primerosA.Contains(Produccion.EPSILON)) { break; } n--; } if (n <= 0) { primeros.Add(Produccion.EPSILON); } } primeros = primeros.Distinct().ToList(); Primeros.TryAdd(nt, primeros); return(primeros); }
private void GenerarTabla_Click(object sender, RoutedEventArgs e) { if (!String.IsNullOrEmpty(EntradaGramatica.Text)) { // Se limpia UI tabla A.S TablaAnalisis.ItemsSource = null; // Se separan el texto de entrada de la gramática y se crea la lista de producciones Tokenizer obtenProd = new Tokenizer(); MainWindow.productions = obtenProd.obtenProducciones(EntradaGramatica.Text); noTerminales = obtenProd.NT; List <Token> simbolosGramaticales = obtenProd.tokens; simbolosGramaticales.RemoveAll(pred => pred.Content == "ε"); // Se calcula el conjunto de primeros para la gramática Primeros primeros = new Primeros(MainWindow.productions, noTerminales); //Se calcula el AFD de la lista de producciones AFDGenerator AFDGen = new AFDGenerator(MainWindow.productions, primeros, simbolosGramaticales); List <Node> AFD = AFDGen.GenerateAFD(); //================== //AFDGen.AddAugmentedProduction(); App.currentParser = new Parser(AFD); //================= //App.currentParser.EvalString("n + n - n - n + n"); // Se muestran los primeros en la UI PrimerosTable.ItemsSource = primeros.GetView(); // Se crea la tabla de Analisis Sintáctico //App.currentParser.CreateSyntaxisAnalysisTable(); // Se muestra la tabla de Analisis Sintáctico ShowTablaAS(App.currentParser.States); } }