static void Main(string[] args) { string entrada = File.ReadAllText(@"..\..\prueba.txt"); Console.WriteLine("Entrada:\n"); Console.WriteLine(entrada); Console.WriteLine(); var gramatica = new Gramatica(); var parser = new Parser(gramatica); var arbol = parser.Parse(entrada); if (arbol.Root == null) { Console.WriteLine("Analisis Lexico Sintactico Fallido :("); } else { Console.WriteLine("Analisis Lexico Sintactico Exitoso :D"); } Console.ReadLine(); }
public bool analiza() { int contAbre = 0; foreach (string x in codigo) { if (x == "abre_ch") { contAbre++; } else if (x == "fecha_ch") { if (contAbre > 0) { contAbre--; } else { // Console.WriteLine() return(false); } } } if (contAbre > 0) { return(false); } int grammar = -1; for (int i = 0; i < codigo.Count;) { grammar = -1; string x = codigo[i]; if (grammar == -1) { for (int j = 0; j < gramaticas.Count; j++) { Gramatica z = gramaticas[j]; if (z.Nos[0] == x) { grammar = j; // i++; } } } if (grammar == -1) { Console.Write("Entrei aqui ein - 1"); return(false); } if (gramaticas[grammar].Nome == "ENTRE_CHAVES") { i++; if (i >= codigo.Count) { return(false); } string atual = codigo[i]; int abertos = 1; while (abertos != 0) { if (atual == "abre_ch") { i++; atual = codigo[i]; abertos++; continue; } if (atual == "fecha_ch") { i++; if (i < codigo.Count) { atual = codigo[i]; } abertos--; continue; } for (int j = 0; j < gramaticas.Count; j++) { Gramatica z = gramaticas[j]; if (z.Nos[0] == atual) { grammar = j; break; } } Console.WriteLine("Começando a gramatica " + gramaticas[grammar].Nome); for (int j = 0; j < gramaticas[grammar].Nos.Count; j++) { if (i >= codigo.Count) { return(false); } string agora = gramaticas[grammar].Nos[j]; if (map.ContainsKey(agora)) { if (codigo[i] == agora) { i++; } else { return(false); } } else { // Console.WriteLine(agora); int ans = OlhaTerminal(agora, i); if (ans < infinito) { i += ans; } else { return(false); } } } if (i >= codigo.Count) { return(false); } atual = codigo[i]; } // i++; continue; } for (int j = 0; j < gramaticas[grammar].Nos.Count; j++) { if (i >= codigo.Count) { //Console.Write("Entrei aqui ein - 2"); return(false); } string agora = gramaticas[grammar].Nos[j]; if (map.ContainsKey(agora)) { if (codigo[i] == agora) { i++; } else { // Console.Write("asdsadjsaidjasidjasidjiasjdiasdjiasjdiasjdisadiasjd"); return(false); } } else { int ans = OlhaTerminal(agora, i); if (ans < infinito) { i += ans; } else { // Console.Write("Entrei aqui ein - 4"); return(false); } } } grammar = -1; } return(true); }
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); } /////////////////////////////////////////////////////////////// }