private Boolean MontarTabelaSimbolos(List <TokenAtivo> TokenControle) { int Nivel = 0; if (Nivel1.Equals(true)) { Nivel = 1; } // PROGRAM. if (TokenControle[0].token.Codigo.Equals(1)) { analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(TokenControle[1].Buffer_ident, "ROTULO", "STRING", Nivel)); } // LABEL else if (TokenControle[0].token.Codigo.Equals(2)) { int i = 0; while (TokenControle[i].token.Simbolo != ";") { if (TokenControle[i].token.Codigo.Equals(25)) { if (!analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(TokenControle[i].Buffer_ident, "LABEL", "STRING", Nivel))) { // Sinalizar erro. _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Variável ambigua encontrada. | linha: " + TokenController.PilhaTokenPrincipal[0].Linha); return(false); } } i++; } } //CONSTANTE. else if (TokenControle[0].token.Codigo.Equals(3)) { // Se for diferente de var. ainda estamos declarando constantes. int i = 0; while (!TokenControle[i].token.Codigo.Equals(4)) { if (TokenControle[i].token.Codigo.Equals(25)) { if (!analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(TokenControle[i].Buffer_ident, "CONSTANTE", TokenControle[i + 2].token.Simbolo, Nivel))) { // Sinalizar erro. _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Variável ambigua encontrada. | linha: " + TokenController.PilhaTokenPrincipal[0].Linha); return(false); } } i++; } } // VAR. else if (TokenControle[0].token.Codigo.Equals(4)) { int i = 1; List <string> identificadores = new List <string>(); while (TokenControle[i].token.Simbolo != "PROCEDURE" && TokenControle[i].token.Simbolo != "BEGIN") { if (TokenControle[i].token.Codigo.Equals(25)) { // Salvar o identificador, em uma lista para verificar o tipo posteriormente. identificadores.Add(TokenControle[i].Buffer_ident); //analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(TokenControle[i].Buffer_ident, "IDENTIFICADOR", "STRING", 1)); } i++; } // proximo do i e o tipo de dados das declaracoes. for (int x = 0; x < identificadores.Count; x++) { if (!analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(identificadores[x], "VARIAVEL", TokenControle[i + 1].token.Simbolo, Nivel))) { // Sinalizar erro. _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Variável ambigua encontrada. | linha: " + TokenController.PilhaTokenPrincipal[0].Linha); return(false); } } } // PROCEDURE. else if (TokenControle[0].token.Codigo.Equals(5)) { Nivel1 = false; // Salvar nome da procedure. if (!analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(TokenControle[1].Buffer_ident, "PROCEDURE", "STRING", 0))) { // Sinalizar erro. _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Procedure ambigua encontrada. | linha: " + TokenController.PilhaTokenPrincipal[0].Linha); return(false); } Nivel1 = true; // Verificar existenica de parametros. int i = 3; List <string> identificadores = new List <string>(); while (TokenControle[i].token.Simbolo != ":") { if (TokenControle[i].token.Codigo.Equals(25)) { // Salvar o identificador, em uma lista para verificar o tipo posteriormente. identificadores.Add(TokenControle[i].Buffer_ident); //analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(TokenControle[i].Buffer_ident, "IDENTIFICADOR", "STRING", 1)); } i++; } // proximo do i e o tipo de dados das declaracoes. for (int x = 0; x < identificadores.Count; x++) { if (!analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(identificadores[x], "PARAMETRO", TokenControle[i + 1].token.Simbolo, 1))) { // Sinalizar erro. _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Variável ambigua encontrada. | linha: " + TokenController.PilhaTokenPrincipal[0].Linha); _frmInicio.ErroAoExcutar(); return(false); } } } // Controle limpeza de niveis 1. else if (TokenControle[0].token.Codigo.Equals(7)) { analizadorSemantico.Deletar(); Nivel1 = false; } // Atribuicao de variaveis. -- aqui que verifica o tipo da variavel na atribuição if (TokenControle[0].token.Codigo.Equals(6)) { int i = 0; while (!TokenControle[i].token.Codigo.Equals(7)) { if (TokenControle[i].token.Codigo.Equals(25)) { if (analizadorSemantico.Busca(TokenControle[i].Buffer_ident, Nivel)) { // Verificar o tipo doque esta sendo atribuido para verificar legalidade da operacao. if (analizadorSemantico.VerificarTipo(TokenControle[i].Buffer_ident, TokenControle[i].Buffer_ident)) { _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Atribuição de tipo incorreta. | linha: " + TokenController.PilhaTokenPrincipal[i].Linha); return(false); } } else { // Sinalizar erro. _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Atribuição de variável com erro. | linha: " + TokenController.PilhaTokenPrincipal[i].Linha); return(false); } } i++; } } _frmInicio.EscreverGridSemantica(); #region --- COMEMNTADO --- // Para nomes de funcoes. /*if (TokenControle[1].token.Simbolo.Equals(";")) * { * // Provavel nome de function, ou rotulo. * analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(TokenControle[0].Buffer_ident, "ROTULO", "FUNCTION", 0)); * }*/ // Tratamento das declaracoes de contantes. /*if (TokenControle[0].token.Simbolo.Equals("CONST")) * { * // Parei de implementar aqui. * } * * // Identifica as declaracoes de variaveis inclusive aninhadas. * if (TokenControle[0].token.Simbolo.Equals("VAR")) * { * int i = 0; * while (!TokenControle[i].token.Simbolo.Equals("INTEGER")) * { * * //tava tentando achar algum lugar pra definir o nivel, obviamente não é aqui * if (TokenControle[i].token.Simbolo.Equals("PROCEDURE")) * { * Nivel = 1; * } * * * if (TokenControle[i].token.Simbolo.Equals("END") && TokenControle[i+1].token.Simbolo.Equals(";")) * { * Nivel = 0; * } * * if (TokenControle[i].token.Simbolo.Equals("IDENTIFICADOR")) * { * if (!analizadorSemantico.Inserir(new AnalizadorSemantico.Auxiliar.TabelaSimbolos(TokenControle[i].Buffer_ident, "VARIAVEL", "INTEIRO", Nivel))) * { * _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Variável declarada duplicada. | linha: " + TokenController.PilhaTokenPrincipal[0].Linha); * return false; * } * } * i++; * } * } * * // Tratar quando e uma atribuicao. * if (TokenControle[1].token.Simbolo.Equals(":=")) * { * // Verificar primeiro se o identificador foi declarado. * // Verificar se o tipo de dados que se esta atribuindo e valido com o tipo declarado. * if (analizadorSemantico.Busca(TokenControle[0].Buffer_ident)) * { * // Simbolo presente na tabela. * // Verificar tipagem. * if (double.TryParse(TokenControle[2].Buffer_ident, out double verificacao)) * { * // Inteiro. * if(!analizadorSemantico.VerificarTipo(TokenControle[0].Buffer_ident, "INTEIRO")) * { * _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Atribuição de valor ilegal para variavel inteira. | linha: " + TokenController.PilhaTokenPrincipal[0].Linha); * return false; * * } * } * else * { * * } * } * else * { * _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Atribuição de variavel não declarada. | linha: " + TokenController.PilhaTokenPrincipal[0].Linha); * return false; * } * }*/ #endregion // Sucesso apos todas as leituras. return(true); // Verificar Atribuicoes de valores as variaveis. }
public void MontagemPilha(List <string> Linhas) { PilhaTokenPrincipal.Clear(); try { // Recebe as linhas brutas. char[] Caracteres; int j = 0; string concatenado = null; Token TokenEncontrado = null; string buffer_literal = ""; // Percorre as linhas brutas recebidas. for (int i = 0; i < Linhas.Count; i++) { // Quebra linha recebida em char para realizar tratamento. Caracteres = Linhas[i].ToCharArray(); while (j < Caracteres.Length) { // Concatena concatenado += Caracteres[j]; #region --- IGNORAR ESPAÇOS --- if (concatenado == " ") { j++; concatenado = ""; continue; } if (concatenado == "\t") { j++; concatenado = ""; continue; } #endregion #region --- CONROLE COMENTARIOS --- // Tratamento de comentarios. if (Caracteres[j].Equals('(') && Caracteres[j + 1].Equals('*')) { int LinhaQueComecou = i + 1; try { while (TratarComentarios(Caracteres[j], Caracteres.Length == 1 ? 'a' : Caracteres[j + 1]) != true) { j++; if (j.Equals(Caracteres.Length) | j.Equals(Caracteres.Length - 1)) { do { i++; Caracteres = Linhas[i].ToCharArray(); }while (Caracteres.Length == 0); j = 0; } } concatenado = ""; j++; } catch { _frmInicio.ErroAoExcutar(); _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Comentário sem fechamento! | linha: " + Convert.ToInt32(LinhaQueComecou)); goto PararLeitura; } } #endregion #region --- LITERAL --- if (Caracteres[j].Equals('\'')) { concatenado = ""; j++; while (!Caracteres[j].Equals('\'')) { if (concatenado.Length < 255) { concatenado += Caracteres[j]; j++; } else { _frmInicio.ErroAoExcutar(); _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> Limite de tamanho de literal exedido | linha: " + Convert.ToInt32(i + 1)); goto PararLeitura; } } TokenEncontrado = BuscarTokenNoDicionario("LITERAL", i); buffer_literal = concatenado; concatenado = ""; goto SalvamentoDireto; } #endregion // Switch pega os tokens dos caracteres especiais. switch (concatenado) { case ",": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case "+": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case "-": // Verificar aqui se o proximo e numero se for manda buscar la e retorna o inteiro e ignora o sinal. if (Caracteres[j].Equals('-') && char.IsNumber(Caracteres[j + 1]) && i == Caracteres.Length ? false : !char.IsNumber(Caracteres[j - 1])) { while (char.IsNumber(Caracteres[j + 1])) { j++; concatenado += Caracteres[j]; } if (!concatenado.Equals("-")) { valor = Convert.ToDouble(concatenado); } TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); if (TokenEncontrado != null) { if (TokenEncontrado.Codigo.Equals(-2)) { _frmInicio.ErroAoExcutar(); _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> " + TokenEncontrado.Simbolo + " | linha: " + Convert.ToInt32(i + 1)); goto PararLeitura; //break; } } } else { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } concatenado = null; break; case "*": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case "/": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case "[": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case "]": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case "(": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case ")": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case ":": try { //TokenEncontrado = Caracteres[j+1].Equals('=')? BuscarTokenNoDicionario(concatenado.ToUpper() + Caracteres[j+1]) :BuscarTokenNoDicionario(concatenado.ToUpper()); if (Caracteres[j + 1].Equals('=')) { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper() + Caracteres[j + 1], i); j++; } else { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } } catch { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } concatenado = null; break; case "=": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case ">": //TokenEncontrado = Caracteres[j+1].Equals('=')? BuscarTokenNoDicionario(concatenado.ToUpper() + Caracteres[j+1]) :BuscarTokenNoDicionario(concatenado.ToUpper()); try { if (Caracteres[j + 1].Equals('=')) { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper() + Caracteres[j + 1], i); j++; } else { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } } catch { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } concatenado = null; break; case "<": //TokenEncontrado = Caracteres[j+1].Equals('=')? BuscarTokenNoDicionario(concatenado.ToUpper() + Caracteres[j+1]) :BuscarTokenNoDicionario(concatenado.ToUpper()); try { if (Caracteres[j + 1].Equals('=')) { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper() + Caracteres[j + 1], i); j++; } else { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } } catch { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } concatenado = null; break; case "<>": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case ";": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; case ".": try { if (Caracteres[j + 1] == '.') { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper() + Caracteres[j + 1], i); j++; } else { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } } catch { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); } concatenado = null; break; case "$": TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); concatenado = null; break; default: // Default para concatenacao e manda para busca no dicionario. if (j.Equals(Caracteres.Length - 1) || Caracteres[j + 1].Equals(',') || Caracteres[j + 1].Equals(' ') || Caracteres[j + 1].Equals(';') || Caracteres[j + 1].Equals('+') || Caracteres[j + 1].Equals('-') || Caracteres[j + 1].Equals('*') || Caracteres[j + 1].Equals('/') || Caracteres[j + 1].Equals('[') || Caracteres[j + 1].Equals(']') || Caracteres[j + 1].Equals('(') || Caracteres[j + 1].Equals(')') || Caracteres[j + 1].ToString().Equals(":=") || Caracteres[j + 1].Equals(':') || Caracteres[j + 1].Equals('=') || Caracteres[j + 1].Equals('>') || Caracteres[j + 1].ToString().Equals(">=") || Caracteres[j + 1].Equals('<') || Caracteres[j + 1].ToString().Equals("<=") || Caracteres[j + 1].ToString().Equals("<>") || Caracteres[j + 1].ToString().Equals("..") || Caracteres[j + 1].Equals('.') || Caracteres[j + 1].Equals('$') ) { TokenEncontrado = BuscarTokenNoDicionario(concatenado.ToUpper(), i); if (TokenEncontrado != null) { if (TokenEncontrado.Codigo.Equals(-2)) { _frmInicio.ErroAoExcutar(); _frmInicio.EscreverSaida("ERROS ENCONTRADOS >> " + TokenEncontrado.Simbolo + " | linha: " + Convert.ToInt32(i + 1)); goto PararLeitura; //break; } } concatenado = null; } break; } SalvamentoDireto: // Adicionar a pilha principal. if (TokenEncontrado != null) { SalvarPilhaPrincipal(new TokenAtivo(TokenEncontrado, i + 1, "", Convert.ToInt32(valor), buffer_ident, buffer_literal)); } // Limpar Token encontrado. // Para encontrar proximo. valor = 0; buffer_literal = ""; buffer_ident = ""; TokenEncontrado = null; j++; } j = 0; } PararLeitura :; } catch (Exception ex) { MessageBox.Show(ex.Message, "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }