FACULDADE ANGLO AMERICANO FOZ DO IGUAÇU Curso de Ciência da Computação 7º Periodo Disciplina: Compiladores Prof. Erinaldo Sanches Nascimento Analisadores Sintáticos LR SLR LR Canônicos LALR
Analisadores Sintáticos LR L representa a escansão da entrada da esquerda para a direita R representa a construção das derivações mais à direita ao reverso K representa os símbolos à frente no fluxo de entrada que auxiliam nas decisões de análise. K = 0 ou K = 1 Quando K é omitido, K é considerado como sendo 1.
Analisadores LR(k) LR (Left to right with Rigthmost derivation) Analisadores redutores que leem a sentença da esquerda para a direita. Produzem uma derivação mais à direita ao reverso, considerando k símbolos sob o cabeçote de leitura.
Destaques 1. Reconhecem, praticamente, todas as estruturas sintáticas definidas por GLC. 2. LR é mais geral que qualquer outro método do tipo empilha-reduz e pode ser implementado com o mesmo grau de eficiência. 3. Descobrem erros sintáticos no momento da leitura da sentença em análise.
Desvantagem Dificuldade de implementação, sendo necessário utilizar ferramentas automatizadas na construção da tabela de análise.
Tipos 1. SLR (Simple LR) Fácil de implementar Aplicável a uma classe restrita de gramáticas. 2. LR Canônicos Mais poderoso Aplicados a um grande número de linguagens livres do contexto 3. LALR Nível intermediário Implementação eficiente Funciona para a maioria das linguagens de programação
Itens LR(0) Um item LR(0) de uma GLC é uma escolha de produção com uma posição identificada em seu lado direito. Um item LR(0) de uma gramática G é uma produção de G com um ponto em alguma posição do seu lado direito.
Se A for uma escolha de produção, e se e forem duas cadeias quaisquer de símbolos (incluindo a cadeia vazia ) tais que =, então A será um item LR(0).
Exemplo 1 A produção A A XYZ A X YZ A XY Z A XYZ A produção A A. XYZ gera quatro itens: gera apenas um item,
Exemplo 2 Considere a gramática: S S S ( S ) S Essa gramática tem três escolhas de produções e oito itens: S S S S S ( S ) S S ( S ) S S ( S ) S S ( S ) S S ( S ) S S
Autômatos Finitos para Itens Coleção LR(0) canônica Oferece a base para a construção de um autômato finito determinista para dirigir as decisões durante a análise. Cada estado do autômato LR(0) representa um conjunto de itens n coleção LR(0) canônica.
Exemplo Considere o item A suponha que inicie com o símbolo X, que pode ser uma marca ou um nãoterminal, tal que o item possa ser escrito como A X X A X A X Se X for uma marca, essa transição carrega X da entrada para o topo da pilha durante a análise. Se X for um não-terminal, X será carregado para a pilha durante uma redução por uma produção X.
NFA dos Itens LR(0) S S S S S S (S)S S S (S)S ( S S ( S)S S S (S )S ) S (S) S
DFA dos Itens LR(0) S S S (S)S S S S S ( ( S ( S)S S (S)S S S ( S (S )S ) S (S) S S (S)S S S S (S)S
Fechamento de Conjunto de Itens 1. Inicialmente, acrescente todo item de I no CLOSURE(I). 2. Se A B está em CLORUSE(I) e B é uma produção, então adicione o item B em CLOSURE(I), se ele ainda não está lá. Aplique essa regra até que nenhum outro item possa ser incluido no CLORURE(I).
SetOfItems CLOSURE(I){ J = I; repita } para (cada item A B em J) para (cada produção B de G) se (B não está em J) adicione B em J; até mais nenhum item seja adicionado a J; retorne J;
Função de Transição GOTO(I, X), onde I é um conjunto de itens e X é um símbolo da gramática. É definido como o fechamento do conjunto de todos os itens [A X ] tais que [A X ] está em I É utilizada para definir as transições no autômato LR(0) para uma gramática. Os estados do autômato correspondem aos conjuntos de itens. GOTO(I, X) especifica a transição do estado I para um novo estado I sob a entrada X.
void itens(g ){ C = CLOSURE({[S S]}); } repita para (cada conjunto de itens I em C) para (cada símbolo de gramática X) se (GOTO(I, X) não é vazio e não está em C) adicione GOTO(I, X) em C; até nenhum novo conjunto de itens seja adicionado em C em uma rodada;
Uso do Autômato LR(0) Os estados desse autômato são os conjuntos de itens da coleção LR(0) canônica. As transições são dadas pela função de transição GOTO. O estado inicial do autômato LR(0) é dado por CLOSURE({[S S]} S é o símbolo inicial da gramática estendida.
Algoritmo de Análise Sintática LR Consistem em: Entrada Saída Pilha Tabela de análise constituida de duas partes ACTION GOTO O algoritmo é o mesmo para todos os analisadores sintáticos LR, o que muda é a tabela de análise
Pilha A pilha contém uma sequência de estados, s 0, s 1,... s m, onde s m está no topo. No método SLR, a pilha contém estados do autômato LR(0); Os método LR canônico LARL são semelhantes.
Estrutura da Tabela de Análise LR 1. A função ACTION recebe como argumentos um estado i e um terminal a. O valor de ACTION[i, a] pode ter um dos quatro formatos: (a) Shift j, onde j é um estado Transfere a entrada a para a pilha, mas usa o estado j para representar a. (b) Reduce A. Reduz no topo da pilha para A, lado esquerdo da produção. (c) (d) Accept Aceita a entrada e terminada a análise. Error Descobre um erro e passa o controle para o recuperador de erro. 2. GOTO Se GOTO[I i, A] = I j, então GOTO também mapeia um estado i e um não terminal A para o estado j.
Configurações do Analisador LR O conteúdo da pilha, com o topo à direita A pilha contém estados, a partir dos quais os símbolos da gramática podem ser recuperados. A entrada restante
Comportamento do Analisador LR 1. Se ACTION[s m,a i ] = shift s, movimento de transferência (shift move). Empilha o próximo estado s e avança na entrada. O símbolo corrente da entrada agora é a i+1. 2. Se ACTION[s m,a i ] = reduce A, movimento de reduzir (reduce move). 3. Se ACTION[s m, a i ] = accept, análise está concluída. 4. Se ACTION[s m, a i ] = error, recuperação de erro.
seja a o primeiro símbolo de w$; enquanto(1){ seja s p estado no topo da pilha; se (ACTION[s,a] = shift t){ empilha t na pilha; seja a o próximo símbolo na entrada; } senão se (ACTION[s,a] = reduce A ){ desempilha símbolos da pilha; faça o estado t agora ser o topo da pilha; empilhe GOTO[t,A] na pilha; imprima a produção A ; } senão se (ACTION[s,a] = accept) pare; senão chame a rotina de recuperação de erro; }
Gramática de Expressão Gramática de expressão: (1) E E+T (2) E T (3) T T * F (4) T F (5) F (E) (6) F id Para a entrada id*id+id
ESTADO ACTION GOTO id + * ( ) $ E T F 0 S5 S4 1 2 3 1 S6 acc 2 R2 S7 R2 R2 3 R4 R4 R4 R4 4 S5 S4 8 2 3 5 R6 R6 R6 R6 6 S5 S4 9 3 7 s5 S4 10 8 S6 S11 9 R1 S7 R1 R1 10 R3 R3 R3 R3 11 r5 r5 r5 R5
Exercício 1 Crie o NFA, converta o NFA em DFA e construa a tabela de análise LR: a) S 0S1 01 com a cadeia 000111. b) S SS+ SS* a com a cadeia aa+a*. c) S S(S) com a cadeia (()()).