コード例 #1
0
        /// <summary>
        /// método responsável por analisar a garantia da gramática e semantica do programa
        /// </summary>
        public void AnalisadorSintatico()
        {
            lexico.AbreArquivo();
            //rotulo = 1 -- disable
            token = lexico.AnalisadorLexico();
            if (token.Simbolo == Simbolo.Sprograma)
            {
                geradorCodigo.GerarCodigo(Codigo.START,new string[] { });
                ObtemTokenLexico();
                if (token.Simbolo == Simbolo.Sidentificador)
                {
                    //insere tabela(token.lexema, nome do programa, "","") -- disable
                    tabelaSimbolos.InserirTabela(new ProgramaSimbolo {Lexema = token.Lexema }); // insere na tabela de simbolos o programa                    
                    semantico.PilhaRetornoFuncao.Push(token.Clonar());
                    ObtemTokenLexico();
                    if (token.Simbolo == Simbolo.Spontovirgula)
                    {
                        AnalisaBloco();
                        semantico.PilhaRetornoFuncao.Pop();
                        
                        //gerador de codigo, gera o comando Dalloc
                        int qtdVariaveis = geradorCodigo.PilhaQtdVariaveisAlocadas.Pop();
                        if (qtdVariaveis != 0)
                        { //gera um dalloc
                            geradorCodigo.BaseVariavel -= qtdVariaveis; // decrementa a base
                            geradorCodigo.GerarCodigo(Codigo.DALLOC, new string[] { geradorCodigo.BaseVariavel.ToString(), qtdVariaveis.ToString() });
                        }

                        if (token.Simbolo == Simbolo.Sponto)
                        {
                            geradorCodigo.GerarCodigo(Codigo.HLT, new string[] { });
                            // verifica se acabou arquivo ou é comentário
                            ObtemTokenLexico();
                            if (token.Simbolo != Simbolo.Ssemtoken)
                            {
                                //erro token a mais
                                throw new ErroException(String.Format("Linha: {0}. Erro Sintático! Código excedente encontrado!", token.Linha),token.Linha);
                            }
                            //gerador do arquivo
                        }
                        else
                        {
                            //erro falta ponto
                            throw new ErroException(String.Format("Linha: {0}. Erro Sintático! \".\" esperado!", token.Linha), token.Linha);
                        }
                    }
                    else
                    {
                        //erro falta ponto virgula
                        throw new ErroException(String.Format("Linha: {0}. Erro Sintático! \";\" esperado!", token.Linha), token.Linha);
                    }
                }
                else
                {
                    //erro falta identificador
                    throw new ErroException(String.Format("Linha: {0}. Erro Sintático! Nome do programa esperado!", token.Linha), token.Linha);
                }
            }
            else
            {
                //erro falta: sprograma
                throw new ErroException(String.Format("Linha: {0}. Erro Sintático! \"programa\" esperado!", token.Linha), token.Linha);
            }
            lexico.FechaArquivo();
        }
コード例 #2
0
 /// <summary>
 /// metodo responsável por inserir um token ou na pilha de prioridade ou na lista da pós-fixa
 /// conforme a logica de geração da pós-fixa
 /// </summary>
 /// <param name="item"></param>
 public void InserePosFixa(Token item)
 {
     Token novoItem = item.Clonar();
     // se for um identificador insere direto na lista
     if (novoItem.Simbolo == Simbolo.Sidentificador || 
         novoItem.Simbolo == Simbolo.Snumero || 
         novoItem.Simbolo == Simbolo.Sverdadeiro ||
         novoItem.Simbolo == Simbolo.Sfalso)
         InsereLista(novoItem);
     else
         InserePilha(novoItem);
 }