static void Main(string[] args) { var codigoFonte = File.ReadAllText(@"CodigoFonte.txt"); // Transforma o arquivo todo em string codigoFonte = codigoFonte.Replace(' ', '\r'); AnalisadorLexico.AnalisadorLexico analisadorLexico = new AnalisadorLexico.AnalisadorLexico(codigoFonte); Simbolo simbolo = new Simbolo(); Console.WriteLine("Aperte ENTER para solicitar o TOKEN:"); while (simbolo.Lexema != "EOF") { string caracterDigitado = Console.ReadLine(); if (caracterDigitado == "\n") { ; } simbolo = analisadorLexico.RetornaToken(); EscreveSimboloNaTela(simbolo); } Console.ReadLine(); List <Simbolo> TabelaDeSimbolos = analisadorLexico.GetTabelaDeSimbolos(); }
static void Main(string[] args) { AnalisadorLexico lex = new AnalisadorLexico(@"C:\Users\ailat\Documents\DEV\AnalisadorLexico\prog.in.txt"); Console.WriteLine(lex.nextToken()); Console.WriteLine(lex.nextToken()); Console.WriteLine(lex.nextToken()); }
public void AnaliseSintatica() { AnalisadorLexico.AnalisadorLexico analisadorLexico = new AnalisadorLexico.AnalisadorLexico(_codigoFonte); //aqui é onde ele inicializa o analisador léxico _pilha.Push(0); // Empilha o estado inicial na pilha int estado = 0; string acao = ""; string guardaToken = ""; Simbolo simbolo = analisadorLexico.RetornaToken(); Stack <Simbolo> pilhaDeSimbolos = new Stack <Simbolo>(); while (true) // Início do procedimento de Shift - Reduce { //enquanto ele não aceitar ou dar erro ele não para a execução if (simbolo.Token != "ERRO") //CASO NÃO SEJA RETORNADO UM ERRO DO ANALISADOR LÉXICO { acao = _tabelaShiftReduce.Rows[estado][$"{simbolo.Token}"].ToString(); //captura a ação da tabela shift-reduce de acordo com o estado e com o simbolo if (acao.Contains("S")) //EMPILHA { estado = Convert.ToInt32(acao.Substring(1)); _pilha.Push(estado); if (pilhaDeSimbolos.Count == 0) { simbolo = analisadorLexico.RetornaToken(); //atualiza o simbolo com o token retornado do léxico } else { simbolo.Token = guardaToken; //atualiza o token após o tratamento do erro simbolo = pilhaDeSimbolos.Pop(); //atualiza com o simbolo da pilha } } else { if (acao.Contains("R")) // REDUZ { int numProducao = Convert.ToInt32(acao.Substring(1)); //captura o numero da produção se for S32 PEGA SO O 32; var producao = new string[2]; _producoes.TryGetValue(numProducao, out producao); //Atualiza a produção De acordo com o número da ação; var Simbolos = producao[1].Split(' '); int numSimbolos = Simbolos.Count(); //DESEMPILHA QUANTIDADE DE SÍMBOLOS LADO DIREITO for (int i = 0; i < numSimbolos; i++) { _pilha.Pop(); } //EMPILHAR O VALOR DE [t,A] na pilha estado = Convert.ToInt32(_tabelaShiftReduce.Rows[Convert.ToInt32(_pilha.Peek())][producao[0].ToString()]); //pula para o estado seguinte _pilha.Push(estado); Console.WriteLine($"{producao[0]} -> {producao[1]}"); } else { if (acao.Contains("ACC")) // ACEITA { Console.WriteLine("P' -> P"); Console.ReadLine(); break; } else //EM CASO DE ERRO SINTÁTICO { if (Convert.ToInt32(acao.Substring(1)) < 16) //CASO O ERRO SEJA TRATÁVEL { Simbolo s = CopiaSimbolo(simbolo); pilhaDeSimbolos.Push(s); //cria uma nova pilha para guardar os tokens já lidos var tipoDeErro = Erro(acao, s); guardaToken = simbolo.Token; //guarda o token do simbolo atual para atualizar depois do tratamento de erro simbolo.Token = tipoDeErro[1].ToString(); //Rotina de erro } else //SE O ERRO NÃO FOR TRATÁVEL A COMPILAÇÃO É PAUSADA { Erro(acao, simbolo); Console.ReadLine(); break; } } } } } else//EM CASO DE ERRO LÉXICO { PrintErro(simbolo.DescricaoERRO, simbolo); //Escreve o erro na tela simbolo = analisadorLexico.RetornaToken(); //Busca o próximo token } } List <Simbolo> TabelaDeSimbolos = analisadorLexico.GetTabelaDeSimbolos(); //busca a tabela de símbolos }