public static String getErro(int line) { tabelaErros tabelaerrosintatico = new tabelaErros(); tabelaerrosintatico.tabeladeerros.Add(0, "E0 - Codigo inicializado de forma incorreta - inicio"); tabelaerrosintatico.tabeladeerros.Add(2, "E2 - Inicio de declaracao de varaveis nao declarado - varfim"); tabelaerrosintatico.tabeladeerros.Add(3, "E3 - Tipos de dados, elementos de estrutura condicional (entao e fimse), delimitacao de declaracao de variaveis, atribuiao, operadores (relacionais e aritmeticos), inicio de programa e declaracao de variaveis, parenteses ou ponto e virgula nao permitidos"); tabelaerrosintatico.tabeladeerros.Add(4, "E4 - Espaco para declaracao de variaveis: Necessario declaracao das variaveis, nao sendo permitidos atribuicoes, operacoes, estruturas condicionais, parenteses ou ponto e virgula"); tabelaerrosintatico.tabeladeerros.Add(6, "E6 - Tipos de dados, elementos de estrutura condicional (entao e fimse), delimitacao de declaracao de variaveis, atribuiao, operadores (relacionais e aritmeticos), inicio de programa e declaracao de variaveis, parenteses ou ponto e virgula nao permitidos"); tabelaerrosintatico.tabeladeerros.Add(7, "E7 - Tipos de dados, elementos de estrutura condicional (entao e fimse), delimitacao de declaracao de variaveis, atribuiao, operadores (relacionais e aritmeticos), inicio de programa e declaracao de variaveis, parenteses ou ponto e virgula nao permitidos"); tabelaerrosintatico.tabeladeerros.Add(8, "E8 - Tipos de dados, elementos de estrutura condicional (entao e fimse), delimitacao de declaracao de variaveis, atribuiao, operadores (relacionais e aritmeticos), inicio de programa e declaracao de variaveis, parenteses ou ponto e virgula nao permitidos"); tabelaerrosintatico.tabeladeerros.Add(9, "E9 - Tipos de dados, elementos de estrutura condicional (entao e fim), delimitacao de declaracao de variaveis, atribuicao, operadores (relacionais e aritmeticos), inicio de programa e declaracao de variaveis, parenteses ou ponto e virgula nao permitidos"); tabelaerrosintatico.tabeladeerros.Add(11, "E11 - Leitura de variaveis: esperavasse um identificador"); tabelaerrosintatico.tabeladeerros.Add(12, "E12 - Escrita de variaveis: esperavasse um identificador, um inteiro ou um literal"); tabelaerrosintatico.tabeladeerros.Add(13, "E13 - Atribuicao de variaveis: esperavasse uma atribuicao"); tabelaerrosintatico.tabeladeerros.Add(14, "E14 - Inicio de expressao do condicional SE: esperavasse um abre parenteses"); tabelaerrosintatico.tabeladeerros.Add(16, "E16 - Espaco para declaracao de variaveis: esperavasse um varfim ou um identificador"); tabelaerrosintatico.tabeladeerros.Add(17, "E17 - Final de atribuicao, expressao, escrita, leitura ou espaco para declaracao de variaveis: esperavasse um ponto e virgula"); tabelaerrosintatico.tabeladeerros.Add(18, "E18 - Espaco para declaracao de variaveis: esperavasse um tipo para o identificador"); tabelaerrosintatico.tabeladeerros.Add(23, "E23 - Tipos de dados, elementos de estrutura condicional (entao e fim), delimitacao de declaracao de variaveis, atribuicao, operadores (relacionais e aritmeticos), inicio de programa e declaracao de variaveis, parenteses ou ponto e virgula nao permitidos"); tabelaerrosintatico.tabeladeerros.Add(24, "E24 - Tipos de dados, elementos de estrutura condicional (entao e fim), delimitacao de declaracao de variaveis, atribuicao, operadores (relacionais e aritmeticos), inicio de programa e declaracao de variaveis, parenteses ou ponto e virgula nao permitidos"); tabelaerrosintatico.tabeladeerros.Add(25, "E25 - Tipos de dados, elementos de estrutura condicional (entao e fim), delimitacao de declaracao de variaveis, atribuicao, operadores (relacionais e aritmeticos), inicio de programa e declaracao de variaveis, parenteses ou ponto e virgula nao permitidos"); tabelaerrosintatico.tabeladeerros.Add(27, "E27 - Final de atribuicao, expressao, escrita, leitura ou espaco para declaracao de variaveis: esperavasse um ponto e virgula"); tabelaerrosintatico.tabeladeerros.Add(28, "E28 - Final de atribuicao, expressao, escrita, leitura ou espaco para declaracao de variaveis: esperavasse um ponto e virgula"); tabelaerrosintatico.tabeladeerros.Add(32, "E32 - Atribuicao de variaveis ou expressao aritmetica: esperavasse um identificador ou um numeral"); tabelaerrosintatico.tabeladeerros.Add(33, "E33 - Atribuicao de variaveis ou expressao relacional: esperavasse um identificador ou um numeral"); tabelaerrosintatico.tabeladeerros.Add(36, "E36 - Final de atribuicao, expressao, escrita, leitura ou espaco para declaracao de variaveis: esperavasse um ponto e virgula"); tabelaerrosintatico.tabeladeerros.Add(44, "E44 - Final de atribuicao, expressao, escrita, leitura ou espaco para declaracao de variaveis: esperavasse um ponto e virgula"); tabelaerrosintatico.tabeladeerros.Add(45, "E45 - Expressao aritmetica: esperavasse um operador aritmetica"); tabelaerrosintatico.tabeladeerros.Add(48, "E48 - Fim de expressao do condicional SE: esperavasse um fecha parenteses"); tabelaerrosintatico.tabeladeerros.Add(49, "E49 - Expressao relacional: esperavasse um operador relacional"); tabelaerrosintatico.tabeladeerros.Add(53, "E53 - Expressao aritmetica: esperavasse um identificador ou um numeral"); tabelaerrosintatico.tabeladeerros.Add(54, "E54 - Estrutura condicional SE: esperavasse um entao"); tabelaerrosintatico.tabeladeerros.Add(57, "E57 - Expressao relacional: esperavasse um identificador ou um numeral"); return((String)tabelaerrosintatico.tabeladeerros[line]); }
public static controleDadosSimbolos getLex(int Posi) //Função que lê um arquivo, acha lexemas, insere na tabela e retorna o lexema { pos = Posi; //Atualização da posição da leitura long tam; //Tamanho da Stream int[] S = { 128, 1, 0, 69, 43, 45, 42, 47, 62, 60, 61, 40, 41, 59, 34, 129, 123, 125, 130, 10, 32, 32, 46, 95, 131, 19, 25, 132, 11, 12, 13, 14, 4, 1, 26, 9, 10, 8, 15, 132, 17, 132, 3, 131, 131, 131, 132, 132, 1, 0, 0, 0, 0, 6, 0, 0, 7, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 132, 15, 15, 132, 15, 15, 15, 15, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 132, 17, 18, 132, 17, 17, 17, 17, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 21, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 21, 21, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 24, 132, 132, 23, 23, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 23, 24, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132 }; Stack <int> estados = new Stack <int>(); //Pilha dos estados da tabela tabelaTransicao[,] tabelaT = new tabelaTransicao[29, 24]; //Tabela de transição int t = 0; // for (int i = 0; i < 29; i++) // { // for (int j = 0; j < 24; j++) // { //Adicionando o vetor S a tabela de transição tabelaT[i, j] = new tabelaTransicao(S[t]); // t++; // } // } // tabelaErros tabelahashe = new tabelaErros(); //Tabela de erros simples tabelahashe.tabeladeerros.Add(1, "Identificador não permitido"); // tabelahashe.tabeladeerros.Add(16, "Constantes literais nao permitidas"); // tabelahashe.tabeladeerros.Add(18, "Erro de foramatacao de comentario (chaves)"); // tabelahashe.tabeladeerros.Add(21, "Constantes numericas nao permitidas"); // tabelahashe.tabeladeerros.Add(23, "Constantes numericas nao permitidas"); // tabelahashe.tabeladeerros.Add(24, "Constantes numericas nao permitidas"); // //Tente try { StringBuilder bffCaracter = new StringBuilder(); //Criando o buffer de caracteres StreamReader stream = File.OpenText("C:\\Users\\lucas\\Desktop\\Compilador\\FONTE.ALG"); //Abrindo o arquivo (Mudar caso necessário) int caracter = 0, linha = 1, coluna = 0; //Caracter = caracter atual stream.BaseStream.Position = pos; //Setando a leitura do arquivo para a posição necessária tam = stream.BaseStream.Length; //Tamanho total do arquivo estados.Push(tabelaT[linha, coluna].Elemento); //Colocando na tabela de estados o estado inicial 131 while (pos <= tam || erro == 0) //Enquanto a posição for menor que o tamanho total do arquivo ou encontrar algum erro { caracter = stream.Read(); //Lendo o caracter atual int test = 0; //Teste se o caracter esta na tabela ou não for (int i = 0; i < 24; i++) // { // if (tabelaT[0, i].Elemento == caracter) // { // coluna = i; //Testando se está ou não na tabela de transição test = 1; // } // } // //Caso o caracter não esteja na tabela if (test == 0 && caracter != 10 && caracter != 13 && caracter == 32) //Coloque ele na coluna que representa a coluna dos outros caracteres { coluna = 17; } if (test == 0 && (caracter == 10 || caracter == 13 || caracter == 32))//Verifico se o caracter é espaço, tab ou quebra linha { coluna = 19; } if (caracter == -1)//Verifico se o caracter é de fim de arquivo { coluna = 18; } if (char.IsDigit((char)caracter))//Verifico se o caracter é digido { coluna = 1; } //Tratando o problema do espaço no literal if (coluna == 21 && caracter == 32 && estados.Peek() == 15)//Se for espaço e o estado atual é literal não ignore { bffCaracter.Append((char)caracter); } //tratando o problema do \n if (caracter == 92 && estados.Peek() == 15)//Se for \n e o estado atual é de literal não ignore { coluna = 2; } if (char.IsLetter((char)caracter))//verificando se o caracter é letra { coluna = 2; } if ((caracter == 69 || caracter == 101) && (estados.Peek() == 19 || estados.Peek() == 21))//Tratando e|E { coluna = 3; } //Procura o estado atual que se encontra for (int i = 0; i < 29; i++) { if (tabelaT[i, 0].Elemento == estados.Peek()) { linha = i; } } estados.Push(tabelaT[linha, coluna].Elemento);//Adicionana na tabela de estados //Verificando se o estado atual é vazio ou de erro if (tabelaT[linha, coluna].Elemento == 0)//Caso seja o fim de um lexema { if (tabelaSimbolo.ContainsKey(bffCaracter.ToString())) //if (tabelahash.tabeladesimbolos.ContainsKey(bffCaracter.ToString()) == true)//Verifica se este lexema já esta na tabela { controleDadosSimbolos aux; //aux = (controleDadosSimbolos)tabelahash.tabeladesimbolos[bffCaracter.ToString()]; aux = tabelaSimbolo[bffCaracter.ToString()]; return(aux);//Se já estiver na tabela retorne ele } else//Caso não esteja na tabela - Buscar qual token este estado pertence { controleDadosSimbolos simaux; estados.Pop(); switch (estados.Peek()) { case 1: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opr", " "); return(simaux); case 2: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opr", " "); return(simaux); case 3: simaux = new controleDadosSimbolos("EOF", "EOF", " "); return(simaux); case 4: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opr", " "); return(simaux); case 5: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opr", " "); return(simaux); case 6: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "rcb", " "); return(simaux); case 7: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opr", " "); return(simaux); case 8: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "pt_v", " "); return(simaux); case 9: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "ab_p", " "); return(simaux); case 10: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "fc_p", " "); return(simaux); case 11: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opm", " "); return(simaux); case 12: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opm", " "); return(simaux); case 13: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opm", " "); return(simaux); case 14: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opm", " "); return(simaux); case 26: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "opm", " "); return(simaux); case 16: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "literal", "literal"); return(simaux); case 18: Console.WriteLine("Comentario " + bffCaracter); break; case 19: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "num", "inteiro"); return(simaux); case 21: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "num", "real"); return(simaux); case 24: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "num", "real"); return(simaux); case 25: simaux = new controleDadosSimbolos(bffCaracter.ToString(), "id", " "); tabelaSimbolo.Add(simaux.Lexema, simaux); return(simaux); default: Console.WriteLine("Erro na leitura da pilha ou formato do comentário errado!"); Console.WriteLine("\nLinha" + linhaerro + " Coluna " + colunaerro); erro = 1; break; } } estados.Clear(); //Limpar a tabela de estados após estados.Push(tabelaT[1, coluna].Elemento); //Adiciona o estado inicial bffCaracter.Remove(0, bffCaracter.Length); //E limpa o buffer } if (tabelaT[linha, coluna].Elemento == 132) //Caso o estado atual seja de erro { Console.WriteLine("ERRO ENCONTRADO - " + tabelahashe.tabeladeerros[linha]); // Console.WriteLine("\nlinha na tabela: " + linha + " Coluna: " + coluna); // Console.WriteLine("\nLinha: " + linhaerro + " Coluna: " + colunaerro); //Retornando o erro erro = 1; // controleDadosSimbolos simerro = new controleDadosSimbolos("ERRO", "ERRO", " "); // return(simerro); // } //Caso o caracter atual não seja espaço, tab ou quebra linha guarde ele no buffer if (caracter != 10 && caracter != 13 && caracter != 32) { bffCaracter.Append((char)caracter); } pos++; //Avança a posição if (caracter == 13) { linhaerro++; colunaerro = 0; } else { colunaerro++; } } stream.Close(); } catch (Exception e) //Caso não consiga abrir o arquivo { Console.Error.WriteLine("Erro na abertura do arquivo:" + e + "\n"); //retorne o erro } return(null); }