Exemplo n.º 1
0
        // deve receber um arquivo
        public Compilador(string arquivo)
        {
           // this.tokensLexico = new List<Token>();
            this.geradorCodigo = new GeradorCodigo();
            // this.sintatico = new Sintatico(arquivo,geradorCodigo, ref tokensLexico);
            this.sintatico = new Sintatico(arquivo, geradorCodigo);
            this.arquivoCompilado = arquivo;

        }
Exemplo n.º 2
0
        //public Sintatico(string dados,GeradorCodigo gerador, ref List<Token> tokens)
        public Sintatico(string dados,GeradorCodigo gerador)
        {
            this.token = new Token();

            //this.lexico = new Lexico(dados, ref tokens);
            this.lexico = new Lexico(dados);

            this.tabelaSimbolos = new TabelaSimbolo();

            this.semantico = new Semantico(tabelaSimbolos);

            this.retornoFuncaoFlag = false;

            this.geradorCodigo = gerador;
        }
Exemplo n.º 3
0
        /// <summary>
        /// Método responsável por Analisar o tipo de cada membro da expressao e validar o tipo final da expressâo
        /// </summary>
        /// <param name="tabelaSimbolos"></param>
        /// <param name="tokenAtual"></param>
        /// <param name="simboloValido"></param>
        /// <param name="comando"></param>
        public void AnalisaExpressaoSemanticamente(GeradorCodigo gerador,Token tokenAtual,Simbolo simboloValido, String comando)
        {
            posFixa.DesimpilharPilhaPrioridade(); // remove os membros restantes da pilha, caso venha ter.

            // verifica se o tipo da expressao retornada é de fato igual ao tipo exigido
            if (AnalisaExpressaoPosFixa() != simboloValido)
            {
                if (simboloValido == Simbolo.Sbooleano)
                    throw new ErroException(String.Format("Linha: {0}. Erro Semântico! {1} deve conter uma expressão booleana!", tokenAtual.Linha, comando), tokenAtual.Linha);
                else
                    throw new ErroException(String.Format("Linha: {0}. Erro Semântico! {1} deve conter uma expressão inteira!", tokenAtual.Linha, comando), tokenAtual.Linha);
            }

            //gera código da expressao pos fixa
            GeraCodigoExpressao(gerador);

            // limpar lista da pos fixa
            posFixa.ResetarPosFixa();
        }
Exemplo n.º 4
0
        /// <summary>
        /// método responsável por gerar o código da expressão pos-fixa gerada.
        /// </summary>
        /// <param name="geradorCodigo"></param>
        private void GeraCodigoExpressao(GeradorCodigo geradorCodigo)
        {
            foreach (Token item in posFixa.ObterListaPosfixa())
            {
                if (item.Simbolo == Simbolo.Sidentificador)
                { //pesquisa o item na tabela de simbolos para saber se é variável ou função
                    ItemSimbolo variavelFuncao = tabelaSimbolos.PesquisaItem(item.Lexema);

                    if (variavelFuncao.GetType() == typeof(VariavelSimbolo))
                    {
                        geradorCodigo.GerarCodigo(Codigo.LDV, new string[] { ((VariavelSimbolo)variavelFuncao).Memoria.ToString() });
                    }
                    else if (variavelFuncao.GetType() == typeof(FuncaoSimbolo))
                    {
                        geradorCodigo.GerarCodigo(Codigo.CALL, new string[] { ((FuncaoSimbolo)variavelFuncao).Nivel.ToString() });
                    }
                }
                else if (item.Simbolo == Simbolo.Snumero)
                {
                    geradorCodigo.GerarCodigo(Codigo.LDC, new string[] { item.Lexema });
                }
                else if (item.Simbolo == Simbolo.Snao)
                {
                    geradorCodigo.GerarCodigo(Codigo.NEG, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Sverdadeiro || item.Simbolo == Simbolo.Sfalso)
                {
                    geradorCodigo.GerarCodigo(Codigo.LDC, new string[] { ((int)item.Simbolo).ToString() });
                }
                else if (item.Simbolo == Simbolo.Smaisunario) //checar
                {
                   // geradorCodigo.GerarCodigo(Codigo.INV, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Smenosunario)
                {
                    geradorCodigo.GerarCodigo(Codigo.INV, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Smult)
                {
                    geradorCodigo.GerarCodigo(Codigo.MULT, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Sdiv)
                {
                    geradorCodigo.GerarCodigo(Codigo.DIVI, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Smais)
                {
                    geradorCodigo.GerarCodigo(Codigo.ADD, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Smenos)
                {
                    geradorCodigo.GerarCodigo(Codigo.SUB, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Sig)
                {
                    geradorCodigo.GerarCodigo(Codigo.CEQ, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Sdif)
                {
                    geradorCodigo.GerarCodigo(Codigo.CDIF, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Smenor)
                {
                    geradorCodigo.GerarCodigo(Codigo.CME, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Smenorig)
                {
                    geradorCodigo.GerarCodigo(Codigo.CMEQ, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Smaior)
                {
                    geradorCodigo.GerarCodigo(Codigo.CMA, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Smaiorig)
                {
                    geradorCodigo.GerarCodigo(Codigo.CMAQ, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Se)
                {
                    geradorCodigo.GerarCodigo(Codigo.AND, new string[] { });
                }
                else if (item.Simbolo == Simbolo.Sou)
                {
                    geradorCodigo.GerarCodigo(Codigo.OR, new string[] { });
                }
            }
        }