Пример #1
0
        private void btnLexica_Click(object sender, EventArgs e)
        {
            AnalisadorLexico Al = new AnalisadorLexico();

            if (Al.Validar(txtCodigo.Text, variaveis.ListaVariaveis))
            {
                AnalisadorSintatico Asin = new AnalisadorSintatico();
                if (Asin.Validar(Al))
                {
                    AnalisadorSemantico Asem = new AnalisadorSemantico();
                    if (Asem.Validar(Asin))
                    {
                        dgvCodigo.DataSource = Asem.getCodigoIntermediario();
                        codigo = Asem.Codigo;
                    }
                    else
                    {
                        MessageBox.Show(Asem.MensagemErro);
                    }
                }
                else
                {
                    MessageBox.Show(Asin.MensagemErro);
                }
            }
            else
            {
                MessageBox.Show(Al.MensagemErro);
            }
        }
Пример #2
0
        static void Main(string[] args)
        {
            AnalisadorLexico analisadorLexico = new AnalisadorLexico(true);

            analisadorLexico.ExtrairTokensLexicos("P1", "C://Files/a.txt", null);

            Console.ReadKey();
        }
Пример #3
0
        public void Entrada_vazia_retorna_nenhum_token()
        {
            //Arrange
            var analisadorLexico = new AnalisadorLexico(string.Empty);

            //Act
            var tokens = analisadorLexico.Analisar();

            //Assert
            tokens.Should().Equal(new List <Token>());
        }
Пример #4
0
        public void Entrada_Identificador_Invalido()
        {
            //Arrange
            var analisadorLexico = new AnalisadorLexico("13212dasd");

            //Act
            Action analisar = () => analisadorLexico.Analisar();

            //Assert
            analisar.Should().Throw <CompiladorException>()
            .WithMessage("Identificador Inválido: 13212dasd \n Linha: 1");
        }
Пример #5
0
        public void EntradaInvalida()
        {
            //Arrange
            var analisadorLexico = new AnalisadorLexico(Helper.GetExemploIncorretoLalg());

            analisadorLexico.Analisar();
            var analisadorSintatico = new AnalisadorSintatico(analisadorLexico.Tokens);

            //Act
            Action analisar = () => analisadorSintatico.Analisar();

            //Assert
            analisar.Should().Throw <CompiladorException>();
        }
Пример #6
0
        public void EntradaValida()
        {
            //Arrange
            var analisadorLexico = new AnalisadorLexico(Helper.GetExemploCorretoLalg());

            analisadorLexico.Analisar();
            var analisadorSintatico = new AnalisadorSintatico(analisadorLexico.Tokens);

            //Act
            Action analisar = () => analisadorSintatico.Analisar();

            //Assert
            analisar.Should().NotThrow();
        }
Пример #7
0
        public void Entrada_Identificador_Invalido_Linha2()
        {
            //Arrange
            System.IO.File.WriteAllText("entrada.txt", "if numero > 1\n123abc");
            var textoArquivo     = System.IO.File.ReadAllText("entrada.txt");
            var analisadorLexico = new AnalisadorLexico(textoArquivo);

            //Act
            Action analisar = () => analisadorLexico.Analisar();

            //Assert
            analisar.Should().Throw <CompiladorException>()
            .WithMessage("Identificador Inválido: 123abc \n Linha: 2");
        }
Пример #8
0
        public void Entrada_Identificadores_Validos()
        {
            //Arrange
            var analisadorLexico = new AnalisadorLexico("if teste");

            //Act
            var tokens = analisadorLexico.Analisar();

            //Assert
            tokens.Should().Equal(new List <Token>()
            {
                new Token("if", ReservadoIf, 1), new Token("teste", Identificador, 1)
            });
        }
Пример #9
0
        static void Main(string[] args)
        {
            Console.WriteLine(Welcome);

            bool interromperProcesso = false;

            while (!interromperProcesso)
            {
                AnalisadorLexico        analisador = new AnalisadorLexico();
                AnalisadorLexicoEntrada entrada    = new AnalisadorLexicoEntrada();

                Console.WriteLine("Informe o caminho completo para o arquivo de entrada...");

                string   caminhoArquivoEntrada = Console.ReadLine();
                FileInfo arquivoEntrada        = null;

                if (!string.IsNullOrWhiteSpace(caminhoArquivoEntrada))
                {
                    arquivoEntrada = new FileInfo(caminhoArquivoEntrada.Replace("\"", ""));
                }

                if (arquivoEntrada != null && arquivoEntrada.Exists)
                {
                    entrada.ArquivoFonte = arquivoEntrada;

                    AnalisadorLexicoSaida saida = analisador.Processar(entrada, tokens);
                    saida.GerarArquivos(entrada.ArquivoFonte);

                    Console.WriteLine("");
                    Console.WriteLine("Processo de análise finalizado, hash de identificação {0}", saida.Identificador);
                }
                else
                {
                    Console.WriteLine("");
                    Console.WriteLine("Arquivo de entrada não pode ser localizado");
                }

                Console.WriteLine("Pressione qualquer tecla para continuar ou pressione ESC para sair...");
                Console.WriteLine("");

                interromperProcesso = Console.ReadKey().Key == ConsoleKey.Escape;
            }
        }
Пример #10
0
        static void Main(string[] args)
        {
            try
            {
                if (args.Length > 0)
                {
                    var analisador = new AnalisadorLexico(args[0]);
                    analisador.Processar();

                    Console.WriteLine(analisador.Resultado);
                }
                else
                {
                    Console.WriteLine("A execução do analisador deve ser: \"alex <fonte>\"\nonde <fonte> é o caminho do arquivo a ser analisado.");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadKey();
        }
Пример #11
0
 public static bool LetraDigitoSublinhado(this char caractere, AnalisadorLexico analisador)
 {
     return(caractere.Letra(analisador) || caractere.Digito(analisador) || (caractere.Equals('_')));
 }
Пример #12
0
 public static bool Simbolo(this char caractere, AnalisadorLexico analisador)
 {
     return(analisador.Simbolo.Contains(caractere));
 }
Пример #13
0
 public static bool Digito(this char caractere, AnalisadorLexico analisador)
 {
     return(analisador.Digito.Contains(caractere));
 }
Пример #14
0
        static void Main(string[] args)
        {
            Level level = Level.EXEC;

            Log.level = Level.EXEC;

            if (!LerArquivo(args))
            {
                Log.println("Erro de leitura do arquivo fonte!", Level.EXEC);
                Console.ReadKey();
                return; //sai do programa
            }

            //ANÁLISE LÉXICA

            AnalisadorLexico analisadorLexico = new AnalisadorLexico(file);

            analisadorLexico.Analisar();
            if (analisadorLexico.TemErros())
            {
                Log.println("Análise Léxica terminada com erro:", Level.DEBUG);
                analisadorLexico.MostraErros();
                Console.ReadKey();
                return;
            }
            else
            {
                Log.println("Análise Léxica terminada com sucesso!", Level.DEBUG);
                if (level == Level.DEBUG)
                {
                    analisadorLexico.MostraTokens();
                }
            }

            //ANÁLISE SINTÁTICA COM GERAÇÃO DE ÁRVORE

            AnalisadorSintaticoGeradorArvore analisadorSintatico = new AnalisadorSintaticoGeradorArvore(analisadorLexico.Tokens);

            analisadorSintatico.Analisar();
            if (analisadorSintatico.TemErros())
            {
                Log.println("Análise Sintática terminada com erro:", Level.DEBUG);
                analisadorSintatico.MostraErros();
                Console.ReadKey();
                return;
            }
            else
            {
                Log.println("Análise Sintática terminada com sucesso!", Level.DEBUG);
                if (level == Level.DEBUG)
                {
                    analisadorLexico.MostraTokens();
                    TabelaSimbolos.MostraSimbolos();
                }
            }

            //analisadorSintatico.MostraArvore();


            AnalisadorSemantico analisadorSemantico = new AnalisadorSemantico(analisadorSintatico.Raiz);

            analisadorSemantico.Analisar();
            if (analisadorSemantico.TemErros())
            {
                Log.println("Análise Semântica terminada com erro:", Level.DEBUG);
                analisadorSemantico.MostraErros();
                Console.ReadKey();
                return;
            }
            else
            {
                Log.println("Análise Semântica terminada com sucesso!", Level.DEBUG);
                if (level == Level.DEBUG)
                {
                    TabelaSimbolos.MostraSimbolos();
                }
            }

            try
            {
                DateTime      inicio        = DateTime.Now;
                Interpretador interpretador = new Interpretador(analisadorSemantico.Raiz, args);
                //interpretador.Memoization = true;
                interpretador.Executar();
                DateTime fim = DateTime.Now;
                Log.println("\n\nExecução encerrada com sucesso! Tempo gasto: " + fim.Subtract(inicio).TotalMilliseconds + " ms", Level.EXEC);
            }
            catch (Exception ex)
            {
                Log.println("Erro na interpretação: " + ex.Message, Level.EXEC);
            }


            Console.ReadKey();
        }
Пример #15
0
 public static bool LetraDigitoSimboloEspaco(this char caractere, AnalisadorLexico analisador)
 {
     return(caractere.Letra(analisador) || caractere.Digito(analisador) || caractere.Simbolo(analisador) || (caractere.Equals(' ')));
 }
        public bool Validar(AnalisadorLexico Analise)
        {
            bool retorno = true;

            _analise = Analise;

            //*** ANÁLISE DAS POSIÇÕES DE CADA TOKEN SE ESTÁ CORRETO
            string lido  = "";
            int    linha = 0;

            bool dentrodeIF   = false;
            bool dentrodeTHEN = false;
            bool dentrodeELSE = false;
            bool ocorreuMudancaEstruturaIf = false;
            bool ocorreuOperadorMatematico = false;
            bool ocorreuOperadorComparacao = false;
            bool ocorreuOperadorLogico     = false;

            string ConteudoIf            = "";
            string ConteudoThen_PorLinha = "";
            string ConteudoElse_PorLinha = "";

            for (int Pos = 0; Pos < Analise.CodigoFonte.Count; Pos++)
            {
                Token tk = Analise.CodigoFonte[Pos];
                //*** VALIDA SE AS LINHAS NÃO COMEÇAM COM OPERADORES DE COMPARAÇÃO, MATEMATICOS OU LOGICOS (EXCETO IF/ELSE, ELSE/SENAO, ENDIF/FIMSE)

                //*** SE OCORREU MUDANÇA DE LINHA
                if (linha != tk.Linha)
                {
                    lido = "";
                    //** SE O PRIMEIRO TOKEN DA LINHA É UM OPERADOR E NÃO O SE/IF, ENTÃO O SEU USO É INCORRETO
                    if (tk is Operador && !(tk is OSe) && !(tk is OSenao) && !(tk is OFimSe))
                    {
                        this._mensagemErro = "Erro de sintaxe: Uso incorreto do operador no inicio da expressão. Linha " + tk.Linha + ".";
                        retorno            = false;
                        break;
                    }
                }
                linha = tk.Linha;

                //*** VALIDA SE AS LINHAS NÃO TERMINAM COM OPERADORES DE COMPARAÇÃO, MATEMATICOS OU IF/ELSE
                //** SE NAO É O ULTIMO TOKEN
                if (Pos < Analise.CodigoFonte.Count - 1)
                {
                    //*** RECUPERA QUAL SERÁ O PROXIMO TOKEN
                    Token ProximoToken = Analise.CodigoFonte[Pos + 1];

                    //*** SE O PROXIMO TOKEN ESTA EM OUTRA LINHA ENTAO ELE É O PRIMEIRO TOKEN DA PROXIMA LINHA E
                    // CONSEQUENTEMENTE ESTAMOS NO ULTIMO TOKEN
                    if (ProximoToken.Linha != linha)
                    {
                        //*** SE FOR OPERADOR DE COMPARAÇÃO OU MATEMÁTICO OU IF/SE
                        if (tk is OComparacao || tk is OMatematico || tk is OSe)
                        {
                            this._mensagemErro = "Erro de sintaxe: Uso incorreto do operador no final da expressão. Linha " + tk.Linha + ".";
                            retorno            = false;
                            break;
                        }
                    }
                }

                //*** VALIDA SE SEGUE A SEQUENCIA VALOR -> OPERADOR -> VALOR
                if (tk is Valor)
                {
                    if (lido == "" || lido == "O")
                    {
                        lido = "V";
                    }
                    else
                    {
                        this._mensagemErro = "Erro de sintaxe: Simbolo " + ((Valor)tk).NomeVariavel + " Utilizado de forma incorreta na linha " + linha + ".";
                        retorno            = false;
                        break;
                    }
                }
                else if (tk is Operador)
                {
                    if (lido == "" || lido == "V")
                    {
                        lido = "O";
                    }
                    else
                    {
                        this._mensagemErro = "Erro de sintaxe: Operador utilizado de forma incorreta na linha " + linha + ".";
                        retorno            = false;
                        break;
                    }
                }

                //***VALIDA SE O IF/SE POSSUI UMA ESTRUTURA CORRETA
                ocorreuMudancaEstruturaIf = false;
                if (tk is OSe)
                {
                    dentrodeIF   = true;
                    dentrodeTHEN = false;
                    dentrodeELSE = false;

                    ocorreuMudancaEstruturaIf = true;
                }
                if (tk is OEntao)
                {
                    dentrodeIF   = false;
                    dentrodeTHEN = true;
                    dentrodeELSE = false;

                    ocorreuMudancaEstruturaIf = true;
                }
                if (tk is OSenao)
                {
                    dentrodeIF   = false;
                    dentrodeTHEN = false;
                    dentrodeELSE = true;

                    ocorreuMudancaEstruturaIf = true;
                }
                if (tk is OFimSe)
                {
                    dentrodeIF   = false;
                    dentrodeTHEN = false;
                    dentrodeELSE = false;

                    ocorreuMudancaEstruturaIf = true;
                }

                Token tkAnterior = null;
                Token tkProximo  = null;

                if (Pos > 0)
                {
                    tkAnterior = Analise.CodigoFonte[Pos - 1];
                }

                if (Pos < Analise.CodigoFonte.Count - 1)
                {
                    tkProximo = Analise.CodigoFonte[Pos + 1];
                }

                //** REGRAS DE EXPRESSOES DENTRO DE IF, THEN E ELSE

                // 1. OPERADORES LÓGICOS SOMENTE DDEVEM OCORRER DENTRO DE IF
                if (tk is OLogico && !dentrodeIF)
                {
                    this._mensagemErro = "Erro de sintaxe: Operador Lógico " + ((OLogico)tk).Cadeia.Valor + " fora de operador condicional na linha " + linha + ".";
                    retorno            = false;
                    break;
                }

                // 2. VALIDA SE FORMATO DO IF ESTÁ CORRETO
                if (dentrodeIF)
                {
                    //SE NESTA ÁREA HOUVER OPERADOR IF, COMPARACAO, MATEMATICO, LOGICO OU VALOR
                    if (tk is OSe)
                    {
                        ConteudoIf += ((OSe)tk).Cadeia.Valor;
                    }
                    else if (tk is OComparacao)
                    {
                        ConteudoIf += ((OComparacao)tk).Cadeia.Valor;
                    }
                    else if (tk is OMatematico)
                    {
                        ConteudoIf += ((OMatematico)tk).Cadeia.Valor;
                    }
                    else if (tk is OLogico)
                    {
                        ConteudoIf += ((OLogico)tk).Cadeia.Valor;
                    }
                    else if (tk is Valor)
                    {
                        if (((Valor)tk).NomeVariavel != null)
                        {
                            ConteudoIf += ((Valor)tk).NomeVariavel;
                        }
                        else
                        {
                            ConteudoIf += ((Valor)tk).ValorVariavel;
                        }
                    }
                    else
                    {
                        this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSe().Cadeia.Valor +
                                             " com estrutura errada identificado na linha " + linha + ".";
                        retorno = false;
                        break;
                    }

                    //SEPARA AS PALAVRAS POR ESPAÇO
                    ConteudoIf += " ";
                }
                //*** VALIDA O IF FEITO E TAMBEM SE O FORMATO DO THEN ESTA CORRETO
                else if (dentrodeTHEN)
                {
                    if (ConteudoIf != "")
                    {
                        ConteudoIf += new OEntao().Cadeia.Valor;
                        string ER    = ExpressaoRegularSeEntao();
                        Match  match = Regex.Match(ConteudoIf, ER);

                        if (match.Success)
                        {
                            ConteudoIf = "";
                        }
                        else
                        {
                            this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSe().Cadeia.Valor +
                                                 " com estrutura errada identificado na linha " + linha + ".";
                            retorno = false;
                            break;
                        }
                    }
                    else
                    {
                        // SE NESTA ÁREA HOUVER OPERADOR COMPARACAO, MATEMATICO, LOGICO OU VALOR GUARDA PARA VALIDACAO NA QUEBRA DE LINHA,
                        //SE NAO ESTA ERRADO
                        if (tk is OComparacao)
                        {
                            ConteudoThen_PorLinha += ((OComparacao)tk).Cadeia.Valor;
                        }
                        else if (tk is OMatematico)
                        {
                            ConteudoThen_PorLinha += ((OMatematico)tk).Cadeia.Valor;
                        }
                        else if (tk is OLogico)
                        {
                            ConteudoThen_PorLinha += ((OLogico)tk).Cadeia.Valor;
                        }
                        else if (tk is Valor)
                        {
                            if (((Valor)tk).NomeVariavel != null)
                            {
                                ConteudoThen_PorLinha += ((Valor)tk).NomeVariavel;
                            }
                            else
                            {
                                ConteudoThen_PorLinha += ((Valor)tk).ValorVariavel;
                            }
                        }
                        else
                        {
                            this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OEntao().Cadeia.Valor +
                                                 " com estrutura errada identificado na linha " + linha + ".";
                            retorno = false;
                            break;
                        }

                        //*** A CADA MUDANÇA DE LINHA VALIDA SE AS LINHAS DO THEN POSSUI UMA ESTRUTURA DE EXPRESSAO CORRETA
                        if (tkAnterior != null)
                        {
                            if ((!(tk is OEntao) && tk.Linha != tkProximo.Linha) || tkProximo is OSenao || tkProximo is OFimSe)
                            {
                                string ER    = ExpressaoRegularExpressoes();
                                Match  match = Regex.Match(ConteudoThen_PorLinha, ER);

                                if (match.Success)
                                {
                                    ConteudoElse_PorLinha = "";
                                }
                                else
                                {
                                    this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OEntao().Cadeia.Valor +
                                                         " com expressao errada, identificada na linha " + linha + ".";
                                    retorno = false;
                                    break;
                                }
                            }
                        }
                        //SEPARA AS PLAVRAS POR ESPAÇO
                        if (ConteudoElse_PorLinha != "")
                        {
                            ConteudoElse_PorLinha += " ";
                        }
                    }
                }
                else if (dentrodeELSE)
                {
                    // SE NESTA ÁREA HOUVER OPERADOR COMPARACAO, MATEMATICO, LOGICO OU VALOR GUARDA PARA VALIDACAO NA QUEBRA DE LINHA,
                    //SE NAO ESTA ERRADO
                    if (tk is OComparacao)
                    {
                        ConteudoElse_PorLinha += ((OComparacao)tk).Cadeia.Valor;
                    }
                    else if (tk is OMatematico)
                    {
                        ConteudoElse_PorLinha += ((OMatematico)tk).Cadeia.Valor;
                    }
                    else if (tk is OLogico)
                    {
                        ConteudoElse_PorLinha += ((OLogico)tk).Cadeia.Valor;
                    }
                    else if (tk is Valor)
                    {
                        if (((Valor)tk).NomeVariavel != null)
                        {
                            ConteudoElse_PorLinha += ((Valor)tk).NomeVariavel;
                        }
                        else
                        {
                            ConteudoElse_PorLinha += ((Valor)tk).ValorVariavel;
                        }
                    }
                    else
                    {
                        this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSenao().Cadeia.Valor +
                                             " com simbolo nao reconhecido, identificado na linha " + linha + ".";
                        retorno = false;
                        break;
                    }

                    if (tkAnterior != null)
                    {
                        if ((!(tk is OSenao) && tk.Linha != tkProximo.Linha) || tkProximo is OFimSe)
                        {
                            if (ConteudoElse_PorLinha.Trim() != "")
                            {
                                string ER    = ExpressaoRegularExpressoes();
                                Match  match = Regex.Match(ConteudoElse_PorLinha, ER);

                                if (match.Success)
                                {
                                    ConteudoElse_PorLinha = "";
                                }
                                else
                                {
                                    this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSenao().Cadeia.Valor +
                                                         " com expressao errada identificado na linha " + linha + ".";
                                    retorno = false;
                                    break;
                                }
                            }
                        }
                    }

                    //SEPARA AS PALAVRAS POR ESPAÇO
                    if (ConteudoElse_PorLinha != "")
                    {
                        ConteudoElse_PorLinha += " ";
                    }
                }
                else
                {
                    if (ConteudoIf != "")
                    {
                        this._mensagemErro = "Erro de sintaxe: Operador Condicional " + new OSe().Cadeia.Valor +
                                             " sem fechamento do operador " + new OSenao().Cadeia.Valor + " ou " + new OFimSe().Cadeia.Valor + " identidicado na linha " + linha + ".";
                        retorno = false;
                        break;
                    }
                }
            }

            return(retorno);
        }
Пример #17
0
 public static bool Letra(this char caractere, AnalisadorLexico analisador)
 {
     return(analisador.Letra.Contains(caractere));
 }
Пример #18
0
        void Colorir()
        {
            if (path == null)
            {
                return;
            }

            ClearStyles(new Range(textBoxEditor, 0, 0, textBoxEditor.Lines[textBoxEditor.Lines.Count - 1].Length, textBoxEditor.Lines.Count - 1));

            string pathTmp = path + ".tmp";

            if (!File.Exists(pathTmp))
            {
                File.Create(pathTmp);
            }

            File.WriteAllText(pathTmp, textBoxEditor.Text);

            using (StreamReader arquivo = new StreamReader(new FileStream(pathTmp, FileMode.Open)))
            {
                AnalisadorLexico lexico = new AnalisadorLexico(arquivo);

                try
                {
                    //listBox1.Items.Clear();

                    while (!lexico.FimDeArquivo())
                    {
                        var token = lexico.PegaToken();
                        //listBox1.Items.Add(token.linha + " " + token.lexema);

                        Range rng = new Range(textBoxEditor, (int)token.coluna - token.lexema.Length - 1, (int)token.linha, (int)token.coluna - 1, (int)token.linha);

                        if (token.simbolo == Simbolo.S_PROCEDIMENTO ||
                            token.simbolo == Simbolo.S_PROGRAMA ||
                            token.simbolo == Simbolo.S_FACA ||
                            token.simbolo == Simbolo.S_SE ||
                            token.simbolo == Simbolo.S_SENAO ||
                            token.simbolo == Simbolo.S_ENTAO ||
                            token.simbolo == Simbolo.S_VAR ||
                            token.simbolo == Simbolo.S_ENQUANTO ||
                            token.simbolo == Simbolo.S_FUNCAO)
                        {
                            rng.SetStyle(blueStyle);
                        }

                        if (token.simbolo == Simbolo.S_INICIO ||
                            token.simbolo == Simbolo.S_FIM)
                        {
                            rng.SetStyle(negritoStyle);
                        }

                        if (token.simbolo == Simbolo.S_NUMERO)
                        {
                            rng.SetStyle(salmonStyle);
                        }

                        if (token.simbolo == Simbolo.S_VERDADEIRO ||
                            token.simbolo == Simbolo.S_FALSO)
                        {
                            rng.SetStyle(salmonStyle);
                        }

                        if (token.simbolo == Simbolo.S_BOOLEANO ||
                            token.simbolo == Simbolo.S_INTEIRO ||
                            token.simbolo == Simbolo.S_E ||
                            token.simbolo == Simbolo.S_OU ||
                            token.simbolo == Simbolo.S_NAO ||
                            token.simbolo == Simbolo.S_DIV)
                        {
                            rng.SetStyle(blackItallicStyle);
                        }
                    }
                }
                catch { }

                arquivo.Close();
            }

            using (StreamReader arquivo = new StreamReader(new FileStream(pathTmp, FileMode.Open)))
            {
                AnalisadorLexico lexico = new AnalisadorLexico(arquivo);

                while (!lexico.FimDeArquivo())
                {
                    if (lexico.c == '{')
                    {
                        int startL = (int)lexico.linha;
                        int startC = (int)lexico.coluna - 1;
                        while (lexico.c != '}' && !lexico.FimDeArquivo())
                        {
                            lexico.c = lexico.Ler();
                        }
                        int endL = (int)lexico.linha;
                        int endC = (int)lexico.coluna;

                        Range rng = new Range(textBoxEditor, startC, startL, endC, endL);
                        ClearStyles(rng);
                        rng.SetStyle(grayStyle);
                    }

                    lexico.c = lexico.Ler();
                }

                arquivo.Close();
            }
        }