Exemplo n.º 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);
            }
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            Console.WriteLine("Digite o nome do arquivo: ");
            var arquivo = Console.ReadLine();

            if (File.Exists(arquivo))
            {
                if (arquivo.Substring(arquivo.Length - 2, 1) == "." && arquivo.Substring(arquivo.Length - 1) == "l" || arquivo.Substring(arquivo.Length - 1) == "L")
                {
                    Stream entrada = File.Open(arquivo, FileMode.Open);
                    AnalisadorSintatico aSintatico = new AnalisadorSintatico(entrada);

                    aSintatico.S();
                    Console.WriteLine("Compilado com sucesso.");
                }
                else
                {
                    Console.WriteLine(arquivo + " não compativel.");
                }
            }
            else
            {
                Console.WriteLine(arquivo + " não encontrado.");
            }

            Console.ReadKey();
        }
Exemplo n.º 3
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>();
        }
Exemplo n.º 4
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();
        }
Exemplo n.º 5
0
        private void Compile()
        {
            try
            {
                AnalisadorSintatico analisadorSintatico = new AnalisadorSintatico();
                String codigo = analisadorSintatico.Execute(fctb.Text);

                StringBuilder sb = new StringBuilder();
                foreach (string item in LineManager.Instance.LinesOut)
                {
                    sb.Append(item);
                }

                textBoxC3E.Text    = codigo;
                textBoxErrors.Text = "Compilado\r\n-----------------------\r\n\r\n";

                String ts = TableSymbol.Instance.ToString();
                textTableSymbol.Text = "Tabela simbolos:" + Environment.NewLine + ts;
            }
            catch (AnalisadorException ae)
            {
                textBoxC3E.Text      = "";
                textTableSymbol.Text = "";
                textBoxErrors.Text   = ae.Message + Environment.NewLine;
                textBoxErrors.Text  += String.Format("Posição vetor da string: {0}{1}", ae.Pos, Environment.NewLine);
                textBoxErrors.Text  += String.Format("Posição coluna: {0}{1}", ae.Col, Environment.NewLine);
                textBoxErrors.Text  += String.Format("Linha: {0} ", ae.Linha);
                textBoxErrors.Text  += String.Format("Token: {0}{1}-----------------------{1}{1}", ae.Token, Environment.NewLine);

                /* Console.WriteLine();
                 * Console.WriteLine("---ESTADO---");
                 * Console.WriteLine();
                 * Console.WriteLine(String.Format("Posição vetor da string: {0}", ae.Pos));
                 * Console.WriteLine(String.Format("Posição coluna: {0}", ae.Col));
                 * Console.WriteLine(String.Format("Linha: {0}", ae.Linha));
                 * Console.WriteLine(String.Format("Token: {0}", ae.Token));
                 * Console.WriteLine(String.Format("Código do Token: {0}", ae.TokenCod));
                 * Console.WriteLine();
                 * Console.WriteLine("------------");
                 * Console.WriteLine();*/
            }
            catch (Exception e)
            {
                textBoxC3E.Text      = "";
                textTableSymbol.Text = "";
                textBoxErrors.Text   = e.Message + Environment.NewLine;
            }
        }
Exemplo n.º 6
0
    // Etapa 2 - Validação

    public bool Validar(AnalisadorSintatico Analise)
    {
        bool retorno = true;

        _analise = Analise;



        /*
         *  AÇÃO 1: VALIDAR AS SEGUINTES REGRAS
         *  1. OPERADORES MATEMÁTICOS DEVEM OPERAR EM VALORES DE TIPO DECIMAL, HEXA OU BINARIO
         *  2. OPERADORES MATEMÁTICOS DEVEM OPERAR EM VALORES DE TIPOS IGUAIS NOS 2 LADOS
         *  3. OPERADORES DE COMPARAÇÃO MAIOR, MENOR, MAIOR-IGUAL E MENOR-IGUAL DEVEM OPERAR  EM VALORES DE TIPO DECIMAL, HEXA OU BINARIO
         *  4. OPERADORES DE COMPARAÇÃO DEVEM OPERAR ENTRE VALORES DE TIPOS IGUAIS NOS 2 LADOS
         */

        bool dentrodeIF   = false;
        bool dentrodeTHEN = false;
        bool dentrodeELSE = false;
        ExpressaoCodigoIntermediario expressao = new ExpressaoCodigoIntermediario();

        for (int pos = 0; pos < Analise.AnaliseLexica.CodigoFonte.Count; pos++)
        {
            Token tk         = Analise.AnaliseLexica.CodigoFonte[pos];
            Token tkAnterior = null;
            Token tkProximo  = null;

            int linha = 0;
            linha = tk.Linha;

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

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

            if (tk is OMatematico && tk is OComparacao)
            {
                /*
                 *  REGRAS 1 E 2
                 *  O ANALISADOR SINTÁTICO GARANTE QUE IRÁ TER 2 NÚMEROS NAS OPERAÇÕES
                 *  ENTÃO PODEMOS INFERIR QUE O TOKEN ANTERIOR E PROXIMO SÃO VALORES E ASSIM SABER APENAS O TIPO
                 */
                if (tk is OMaior || tk is OMenor || tk is OMaiorIgual || tk is OMenorIgual)
                {
                    if (((Valor)tkAnterior).Tipo != Tipos.Dec && ((Valor)tkAnterior).Tipo != Tipos.Hex &&
                        ((Valor)tkAnterior).Tipo != Tipos.Bin)
                    {
                        string NomeValor = ((Valor)tkAnterior).NomeVariavel == "" ?
                                           ((Valor)tkAnterior).ValorVariavel.ToString() :
                                           ((Valor)tkAnterior).NomeVariavel;

                        this._mensagemerro = "Os tipo de valor " + NomeValor + " não é de possível comparação na linha: " + linha + ".";
                        retorno            = false;
                        break;
                    }
                }
            }
            else
            {
                this._mensagemerro = "Não é possivel efetuar operação aritimética com valores do tipo " + ((Valor)tk).Tipo + ". Erro na linha: " + linha + ".";
                retorno            = false;
                break;
            }

            /*
             * REGRAS 3 E 4
             * O ANALISADOR SINTÁTICO GARANTE QUE IRÁ TER 2 NÚMEROS NAS OPERAÇÕES
             * ENTÃO PODEMOS INFERIR QUE O TOKEN ANTERIOR E PROXIMO SÃO VALORES E ASSIM SABER APENAS O TIPO
             */
            if (tk is OComparacao)
            {
                if (((Valor)tkAnterior).Tipo == Tipos.Dec || ((Valor)tkAnterior).Tipo == Tipos.Hex ||
                    ((Valor)tkAnterior).Tipo == Tipos.Bin)
                {
                    this._mensagemerro = "Os tipos de valores devem ser iguais na comparação da linha: " + linha + ".";
                    retorno            = false;
                    break;
                }
                else
                {
                    if (!(tk is OIgual))
                    {
                        this._mensagemerro = "Não é possivel efetuar comparação numérica com valores do tipo " + ((Valor)tkAnterior).Tipo + " e " + ((Valor)tkProximo).Tipo + ". Erro na linha: " + linha + ".";
                        retorno            = false;
                        break;
                    }
                }
            }

            // AÇÃO 2: GERAR CÓDIGO INTERMEDIARIO
            if (tkAnterior != null)
            {
                // A CADA QUEBRA DE LINHA SE NÃO UMA NOVA EXPRESSÃO É INSTANCIADA
                if (tkAnterior.Linha != tk.Linha)
                {
                    if (expressao.Expressao.Count > 0 || expressao.ExpressaoCondicaoNaoAtendida.Count > 0)
                    {
                        // ADICIONA A EXPRESSÃO GERADA AO CÓDIGO INTERMEDIÁRIO
                        _codigoIntermediario.AdicionarExpressao(expressao);

                        // SE ESTIVER DENTRO DE UM THEN OU ELSE, A PRÓXIMA EXPRESSÃO DEVE SABER CONDIÇÃO DO IF
                        ExpressaoCodigoIntermediario expressaoTemp = new ExpressaoCodigoIntermediario();
                        if ((dentrodeTHEN || dentrodeELSE) && !(tk is OFimSe))
                        {
                            // COPIE A EXPRESSÃO IF PARA A NOVA EXPRESSOA
                            expressaoTemp.Condicao = expressao.getCopiaCondicao();
                        }

                        // A EXPRESSAO PASSA A SER NOVA EXPRESSAO
                        expressao = expressaoTemp;
                    }

                    // SE NÃO ESTÁ EM CONDIÇÃO E A EXPRESSÃO MANTÉM CONDIÇÃO EM SUA PROPRIEDADE, LIMPA
                    if (tk is OFimSe && expressao.Condicao.Count > 0)
                    {
                        expressao.Condicao = new List <Token>();
                    }
                }
            }

            if (tk is OSe)
            {
                dentrodeIF   = true;
                dentrodeTHEN = false;
                dentrodeELSE = false;

                // NESTE PONTO DEVE IR AO PRÓXIMO TOKEN
                continue;
            }

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

                // NESTE PONTO DEVE IR AO PRÓXIMO TOKEN
                continue;
            }

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

                // NESTE PONTO DEVE IR AO PRÓXIMO TOKEN
                continue;
            }

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

                // NESTE PONTO DEVE IR AO PRÓXIMO TOKEN
                continue;
            }

            if (dentrodeIF)
            {
                expressao.AdicionarTokenEmCondicao(tk);
            }
            else if (dentrodeTHEN)
            {
                expressao.AdicionarTokenEmExpressao(tk);
            }
            else if (dentrodeELSE)
            {
                expressao.AdicionarTokenEmExpressaoCondicaoNaoAtendida(tk);
            }
            else
            {
                expressao.AdicionarTokenEmExpressao(tk);
            }
        }

        // AO FIM DO GIRO SE AINDA HOUVER EXPRESSÃO A SER ADICIONADA, ENTÃO A ADICIONA AO CÓDIGO INTERMEDIARIO
        if (expressao.Expressao.Count > 0 || expressao.ExpressaoCondicaoNaoAtendida.Count > 0)
        {
            // ADICIONA A EXPRESSÃO GERADA AO CÓDIGO INTERMÉDIARIO
            _codigoIntermediario.AdicionarExpressao(expressao);
        }
        return(retorno);
    }
Exemplo n.º 7
0
        private void compilarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Colorir();

            listViewError.Items.Clear();

            Save();

            analisadorSintatico = new AnalisadorSintatico(path);
            //analisadorSintatico.Iniciar();
            try
            {
                analisadorSintatico.Iniciar();

                listViewError.Items.Add(new ListViewItem(new string[] { "0", "0", "Compilacao terminou com sucesso" }));
            }

            catch (ExceptionErroLexical ex)
            {
                Range rng = new Range(textBoxEditor, (int)ex.coluna, (int)ex.linha, (int)ex.coluna + 1, (int)ex.linha);
                ClearStyles(rng);
                rng.SetStyle(redStyle);

                listViewError.Items.Add(new ListViewItem(new string[] { ex.linha.ToString(), ex.coluna.ToString(), "Erro lexical: " + ex.ToString() }));
            }
            catch (ExceptionSimboloEsperado ex)
            {
                Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha);
                ClearStyles(rng);
                rng.SetStyle(redStyle);

                listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro sintatico ExceptionSimboloEsperado: " + ex.ToString() }));
            }
            catch (ExceptionSimboloInesperado ex)
            {
                Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha);
                ClearStyles(rng);
                rng.SetStyle(redStyle);

                listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro sintatico ExceptionSimboloInesperado: " + ex.ToString() }));
            }
            catch (ExceptionVariavelNaoDeclarada ex)
            {
                Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha);
                ClearStyles(rng);
                rng.SetStyle(redStyle);

                listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro semantico ExceptionVariavelNaoDeclarada: " + ex.ToString() }));
            }
            catch (ExceptionVariavelDuplicada ex)
            {
                Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha);
                ClearStyles(rng);
                rng.SetStyle(redStyle);

                listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro semantico ExceptionVariavelDuplicada: " + ex.ToString() }));
            }
            catch (ExceptionTipoInvalido ex)
            {
                Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha);
                ClearStyles(rng);
                rng.SetStyle(redStyle);

                listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro semantico ExceptionTipoInvalido: " + ex.ToString() }));
            }
            catch (ExceptionRetornoDeFuncaoInesperado ex)
            {
                Range rng = new Range(textBoxEditor, (int)ex.token.coluna - ex.token.lexema.Length - 1, (int)ex.token.linha, (int)ex.token.coluna - 1, (int)ex.token.linha);
                ClearStyles(rng);
                rng.SetStyle(redStyle);

                listViewError.Items.Add(new ListViewItem(new string[] { ex.token.linha.ToString(), ex.token.coluna.ToString(), "Erro semantico ExceptionRetornoDeFuncaoInesperado: " + ex.ToString() }));
            }
            catch (Exception ex)
            {
                listViewError.Items.Add(new ListViewItem(new string[] { "0", "0", ex.Message }));
            }

            analisadorSintatico.Finalizar();
        }