示例#1
0
        /// <summary>
        /// Valida uma produção, antes de adicionar à gramática.
        /// </summary>
        /// <param name="p">A produção a ser validada.</param>
        /// <returns>Verdadeiro se a produção é válida; senão, falso.</returns>
        public bool ValidarProducao(string p)
        {
            var    lista   = new List <string>();
            string simbolo = "";

            for (int i = p.Length - 1; i >= 0; i--)
            {
                simbolo = simbolo.Insert(0, p[i].ToString());

                if (Terminais.Any(nt => nt.Valor.Equals(simbolo)) ||
                    NaoTerminais.Any(nt => nt.Valor.Equals(simbolo)))
                {
                    lista.Add(simbolo);
                    simbolo = "";
                }
            }

            if (simbolo.Length > 0)
            {
                return(false);
            }

            if (lista.Count >= 3)
            {
                if (!IsTerminal(lista[0]) && IsTerminal(lista[1]) && !IsTerminal(lista[2]) && lista[0].Equals(lista[1]))
                {
                    return(false);
                }
            }

            bool achou;

            foreach (var s in lista)
            {
                achou = false;

                foreach (var nt in NaoTerminais)
                {
                    if (nt.Valor.Equals(s))
                    {
                        achou = true;
                    }
                }

                foreach (var t in Terminais)
                {
                    if (t.Valor.Equals(s))
                    {
                        achou = true;
                    }
                }

                if (!achou)
                {
                    return(false);
                }
            }

            return(true);
        }
示例#2
0
        private List <string> ProducoesParaLista(Producao producao)
        {
            var lista = new List <string>();

            string simbolo = "";

            for (int i = producao.Valor.Length - 1; i >= 0; i--)
            {
                simbolo = simbolo.Insert(0, producao.Valor[i].ToString());

                if (Terminais.Any(t => t.Valor.Equals(simbolo)) ||
                    NaoTerminais.Any(nt => nt.Valor.Equals(simbolo)))
                {
                    lista.Add(simbolo);
                    simbolo = "";
                }
            }

            lista.Reverse();
            lista.Insert(0, ".");
            return(lista);
        }
        public AnalisadorSintatico(List <String> code)
        {
            /// Cria código de tokens
            codigo = code;

            ////////////////////////////////////////////////////////////////////

            /// gera os nós terminais (tokens)
            string[] lines = System.IO.File.ReadAllLines(@"Tokens.txt");
            map    = new Dictionary <string, bool>();
            tokens = new List <Token>();
            foreach (string line in lines)
            {
                String[] subs = line.Split('&');
                Token    x    = new Token(subs[0], subs[1], subs[2]);
                map[subs[0]] = true;
                tokens.Add(x);
            }

            ////////////////////////////////////////////////////////////////
            //// gera as gramáticas
            gramaticas = new List <Gramatica>();
            lines      = System.IO.File.ReadAllLines(@"Gramaticas.txt");

            foreach (string line in lines)
            {
                String[] subs = line.Split(' ');

                Gramatica a1 = new Gramatica();
                a1.Nome = subs[0];
                List <String> nos = new List <String>();
                for (int z = 1; z < subs.Length; z++)
                {
                    nos.Add(subs[z]);
                }
                a1.Nos = nos;

                gramaticas.Add(a1);
            }
            ///////////////////////////////////////////////////////
            /// Gera os nós não terminais
            naoterminais = new List <NaoTerminais>();

            /// Adiciona as gramaticas aos nos nao terminais também!
            foreach (Gramatica g in gramaticas)
            {
                NaoTerminais n = new NaoTerminais();
                n.Nome = g.Nome;
                List <String> l = g.Nos;

                List <List <String> > nods = new List <List <String> >();
                nods.Add(l);
                n.Nos = nods;
                naoterminais.Add(n);
            }

            lines = System.IO.File.ReadAllLines(@"NaoTerminais.txt");

            foreach (string line in lines)
            {
                String[] subs = line.Split('&');

                NaoTerminais n = new NaoTerminais();
                n.Nome = subs[0];

                String[] subs2             = subs[1].Split('|');
                List <List <String> > tudo = new List <List <string> > ();
                foreach (string no in subs2)
                {
                    String[]      subs3 = no.Split(' ');
                    List <String> eoq   = new List <string>();
                    foreach (string h in subs3)
                    {
                        Console.WriteLine(h);
                        eoq.Add(h);
                    }
                    tudo.Add(eoq);
                }
                n.Nos = tudo;



                naoterminais.Add(n);
            }


            ///////////////////////////////////////////////////////////////
        }
        public int OlhaTerminal(string node, int pos)
        {
            int ans = 0;

            for (int i = 0; i < naoterminais.Count; i++)
            {
                if (naoterminais[i].Nome == node)
                {
                    NaoTerminais f = naoterminais[i];

                    for (int j = 0; j < f.Nos.Count; j++)
                    {
                        bool bateu     = false;
                        int  antigoans = ans;

                        for (int k = 0; k < f.Nos[j].Count; k++)
                        {
                            string atual = f.Nos[j][k];

                            if (map.ContainsKey(atual))
                            {
                                if (pos + ans >= codigo.Count)
                                {
                                    ans = infinito;
                                    break;
                                }
                                if (atual == codigo[pos + ans])
                                {
                                    bateu = true;
                                    ans++;
                                }
                                else
                                {
                                    bateu = false;
                                    break;
                                }
                            }
                            else
                            {
                                int ahs = OlhaTerminal(atual, pos + ans);


                                if (ahs < infinito)
                                {
                                    ans  += ahs;
                                    bateu = true;
                                }
                                else
                                {
                                    bateu = false;
                                    break;
                                }
                            }
                        }

                        if (!bateu)
                        {
                            ans = antigoans;
                        }
                        else
                        {
                            break;
                        }
                    }
                    break;
                }
            }
            if (ans == 0)
            {
                return(infinito);
            }
            return(ans);
        }