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