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.
        }
Exemple #2
0
        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);
            }
        }