• Nenhum resultado encontrado

Para toda Br → Asβr faça excluir Br → Asβr de P4;

Para toda Asaα faça P4 = P4 {Br aαBB

r};

Fim para Fim para

A gramática resultante desse passo é G4 = (N3, T1, P4, S)

E as produções da forma A aα onde α é composta por símbolos não-terminais.

As gramáticas na forma normal tendem a ter um maior número de produções, estas são no entanto mais simples, na sua forma, do que as produções numa gramática equivalente que não esteja na forma normal.

• Pilha – Memória auxiliar que pode ser usada livremente para leitura e gravação; Dividida em células onde cada um armazena um símbolo do alfabeto auxiliar. Em estrutura do tipo pilha, a leitura e a gravação é sempre realizada na mesma extremidade, denominada topo.

Seu tamanho é infinito, sendo que seu valor inicial é vazio;

• Unidade de Controle – Indica o estado corrente da máquina. Apresenta um número finito e predefinido de estados, possuindo uma cabeça de fita e uma cabeça de pilha, definidas por:

o Cabeça da Fita – É uma unidade exclusivamente de leitura. Realiza a leitura, acessando um a célula por vez e movimentando-se sempre para a direita;

o Cabeça da Pilha – É uma unidade de leitura e gravação. Realiza a gravação movendo- se para à esquerda, ou para cima, podendo armazenar uma palavra composta por mais de um símbolo, em uma mesma operação. Realiza a leitura movendo-se para direita, ou para baixo, excluindo o símbolo lido. Está sempre posicionada no topo da pilha e acessa um símbolo de cada vez.

• Função de Transição – Comanda a leitura da fita, leitura e gravação da pilha e define o estado da máquina, conforme mostrado na Figura 6. Analisando o estado corrente, o símbolo lido da fita e símbolo lido da pilha, determina o novo estado e a palavra a ser gravada na pilha. Podendo realizar um movimento vazio, ao realizar a leitura do símbolo ε, permitindo mudar de estado sem ler da fita. O símbolo ε na gravação indica que nenhuma gravação é realizada na pilha e também não realiza movimento da cabeça. A omissão do parâmetro de leitura, indicado por “?”, representa o teste de pilha vazia ou toda palavra de entrada lida.

Figura 6 – Representação da Função de Transição.

Fonte: Furtado 2006, p. 34

A Figura 7 ilustra os movimentos do autômato de pilha que ocorrem pela função de mapeamento. A partir do estado atual, do próximo símbolo da entrada e do topo da pilha, se obtém o próximo estado e os símbolos que serão empilhados no lugar do anterior. O símbolo da entrada é consumido no processo e o último símbolo gravado é o primeiro a ser lido. A base da pilha é fixa e define seu início e o topo é variável e define a posição do último símbolo gravado. No caso de a transição possuir ε como símbolo da entrada, esta transição pode ocorrer com qualquer que seja o símbolo da entrada, sem consumi-lo.

Figura 7 – Estrutura do Tipo Pilha.

Fonte: Menezes 2000, p. 105

Segundo Menezes (2000, p.106), o autômato com pilha possui duas definições que diferem no critério de parada do autômato:

• o valor inicial da pilha é vazio e o autômato pára aceitando a linguagem ao atingir um estado final;

• a pilha contém, inicialmente, um símbolo especial denominado símbolo inicial da pilha.

Não existem estados finais e o autômato pára, aceitando a linguagem, quando a pilha estiver vazia.

Apesar de diferentes, as duas definições são equivalente e aceitas universalmente, possuindo o mesmo poder computacional.

4.6.1 Definição Formal de um Autômato com Pilha

O autômato com pilha envolve sete componentes e pode ser especificado segundo Hopcroft (2002, p.237), como:

P = (Q, Σ, Γ, δ, q0, Z0, F), onde:

Q conjunto de estados possíveis do autômato o qual é finito;

Σ alfabeto de símbolos de entrada;

Γ alfabeto de pilha finito, ou seja, o conjunto de símbolos permitidos de serem inseridos na pilha;

δ função programa ou função de transição, que controla as transições de estado e a pilha δ: Q x (Σ ∪ {ε, ?}) x (V ∪ {ε, ?}) → 2QxV*;

q0 estado inicial do autômato tal que q0 é elemento de Q;

Z0 o símbolo de inicial;

F conjunto de estados de aceitação ou estados finais, tal que F está contido em Q.

Exemplo de um PDA, proposto por Hopcroft (2002, p.238).

Dada a Linguagem

Lwwr = {wwr | w está em (0 + 1)*}

pode-se descrever um PDA para a Lwwr como:

P = {(q0, q1, q2), (0, 1), (0, 1, Z0), δ, q0, Z0, (q2)}

4.6.2 Notação gráfica para Autômatos com Pilha

A função de transição de um PDA, representada por δ, pode ser ilustrada por um diagrama de transição. Em geral, segundo Hopcroft (2002, p.239), um diagrama de transição para um PDA constitui-se:

• dos nós, que correspondem aos estados do PDA;

• de uma seta identificada por início, que indica o estado inicial;

• de estados com círculos duplos, que indicam os estados de aceitação ou finais;

• de arcos, que correspondem às transições do PDA no sentido dado a seguir:

o um arco identificado por a, X / α do estado q para ao estado p significa que δ (q, a, X) contém o par (p, α), talvez entre outros pares. Ou seja, o rótulo do arco informa que entrada é usada e também fornece o topo da pilha antigo e o novo.

O diagrama não informa qual símbolo da pilha é o símbolo inicial. Convencionalmente, ele é Z0, a menos que seja indicado outro.

A Figura 8 mostra um exemplo de representação gráfica do PDA para o exemplo apresentado em 3.6.1, proposto por Hopcroft (2002, p.238).

Figura 8 - Representação gráfica de um PDA.

Fonte: Hopcroft 2002, p. 238

O fato do autômato com pilha ser não-determinístico é importante, pois aumenta o seu poder computacional, o que permite reconhecer exatamente a Classe das Linguagens Livre de Contexto. Assim, o autômato com pilha reconhece qualquer Linguagens Livre de Contexto, com um único estado, ou três estados, dependendo da definição. Isto significa que a pilha é suficiente como memória auxiliar, não sendo necessário empregar estados para memorizar as informações passadas.

5 ANÁLISE SINTÁTICA

A análise sintática tem a função de verificar se a estrutura gramatical do programa está correta. Segundo Price (2001, p.09), o analisador sintático, também chamado de parser, identifica seqüências de símbolos que constituem estruturas sintáticas por meio de uma varredura ou “parsing” dos tokens13 do programa fonte. O analisador sintático produz, explicita ou implicitamente, uma estrutura em árvore, chamada de árvore de derivação, que exibe a estrutura sintática do texto fonte, resultante da aplicação das regras gramaticais da GLC da linguagem.

Outra função dos reconhecedores sintáticos é a detecção de erros de sintaxe, identificando objetivamente a posição e o tipo de erro ocorrido. Mesmo que erros tenham sido encontrados, o analisador sintático deve tentar recuperá-los, prosseguindo a análise do texto restante.

O processo de análise sintática, dos compiladores dirigidos pela sintaxe engloba funções como a identificação de sentenças, detecção de erros de sintaxe, recuperação de erros, correção de erros, ativação do analisador léxico, ativação de rotinas de análise de dependências de contexto da linguagem, ativação de rotinas de análise semântica a partir da árvore sintática e ativação de rotinas de síntese de código objeto.

Documentos relacionados