// 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;
        }
Esempio n. 2
0
        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);
            }
        }