Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tpicos em Computaao I o c
LR Parsing
anlise formada de operaoes shift e reduce a c shift move token da entrada para pilha pilha T+ T +( entrada (2) 2) ao ca shift shift
T num +
pilha 1 T
( T num
S E
A anlise descendente de uma sentena pode ser vista como a c uma tentativa de construir uma rvore de derivao em pr-ordem a ca e (da esquerda para a direita) para a sentena em questo: cria c a a raiz e, a seguir, cria as sub-rvores lhas, da esquerda para a a direita.
LR Parsing
Left-to-right, Rightmost-derivation Bottom-up (comea com tokens e termina com o estado inicial) c mais poderoso que LL 1 + (2) T + (2) T + (T ) T + (T ) T + (T E ) T + (S) T +T T +T T + TE TE S
O analisador redutivo empilha s mbolos na entrada at ter na e pilha uma seqncia de s ue mbolos que corresponde ` denio de a ca um no-terminal. A operao de reduo consiste em substia ca ca tuir na pilha, o lado direito de uma produo pelo seu lado esca querdo. A seqncia correta de reduoes levar ao s ue c a mbolo inicial da gramtica. Se coletarmos a seqencia de reduoes utilizados a u c na gerao da rvore de derivaoes e olharmos ao reverso, vereca a c mos que foi produzida uma derivao mais ` direita a partir do ca a s mbolo inicial.
Exemplo
0. 1. 2. 3. S S S S S S; S id := E print(L) 4. 5. 6. 7. E E E E id 8. L E num 9. L L, E E+E (S, E)
A anlise ascendente, tambm conhecida como redutiva ou a e bottom-up, de uma sentena pode ser vista como a tentativa de c construir uma rvore de derivao a partir das folhas, produzindo a ca uma derivao mais ` direita ao reverso. A denominao redutiva ca a ca refere-se ao processo que sofre a sentena de entrada, a qual c e reduzida ate ser atingido o s mbolo inicial da gramtica (raiz da a rvore de derivao). D-se o nome de reduo ` operao de a ca a ca a ca substituio do lado direito de uma produo pelo no-terminal ca ca a correspondente.
Utilize a gramtica acima para ilustrar a execuo a ca da anlise sinttica LR com a seguinte entrada: a a a := 7; b := c + (d := 5 + 6, d)
Tpicos em Computaao I o c
LR(0)
Left-to-right, Rightmost 0 no considera s a mbolos na leitura da entrada (olha s para a pilha) o aoes unicas para cada estado - shift ou reduce c boa introduo para LR(1) ca Estado conjunto de itens item regra de produo com um .do lado ca direito da regra. . indica o ponto atual da anlise a
A anlise LR(0) no muito poderosa em termos do nmero a a e u de gramticas para as quais tm sucesso, mas nos d uma boa a e a introduo de como construir a anlise LR(1). ca a Um item para uma gramtica G uma produo de G com um a e ca ponto em alguma de suas posioes no lado direito. Por exemplo, c a produo A XY Z produz os seguinte itens: ca A XY Z AX YZ A XY Z A XY Z Intuitivamente, um item indica quanto de uma produo j ca a examinamos a uma dada altura do processo de anlise sinttica. a a Por exemplo, o primeiro item acima indica que desejamos em seguida examinar uma cadeia na entrada, derivvel a partir de a XY Z. Para construir o analisador sinttico devemos construir um a AFD. Os estados do AFD so formados por itens. a
A operao de shift coloca no topo da pilha o s ca mbolo que est a sendo lido e avana o cabeote de leitura. A operao de reduce c c ca substitui todos os s mbolos do lado direito de uma produo pelo ca seu lado esquerdo. O analisador sinttico pode reconhecer toda a a sentena com uma operao de accept ou gerar um erro quando c ca ocorre um erro de sintaxe.
Shift-Reduce
Como saber quando utilizar shift ou reduce? utilizando autmatos nitos: o AFD utilizado para a pilha (AFD com pilha) arestas com s mbolos (terminais ou no terminais) a inicialmente, pilha apenas com $ Operaoes: c Shift(n) avana um token na entrada; empilha n c Reduce(k) k. X (reduo usando a regra k) ca desempilha , empilha X. Procure pelo goto a partir do ultimo estado e empilhe o valor do goto Accept / Error
LR(0) - Estados
S S$ S (L) Sx LS L L, S
Estado inicial: engloba a regra inicial e qualquer outra regra que possa comear pelo lado direito da regra inicial c
1 S S S . S$ .x . (L)
3 S L L S S (. L) . L, S .S . (L) .x
Sabemos que as operaoes utilizadas na anlise redutiva c a e composta basicamente por shift e reduce. Essas aoes indicam c quais elementos devemos desempilhar e empilhar na pilha. Porm e esse tipo de anlise tem o controle dirigido por uma tabela de a anlise. Essa tabela constru a partir de um autmato a e da o nito determin stico. As linhas da tabela indicam os estados do autmato, as colunas indicam os s o mbolos lidos. A partir de um estado e um s mbolo lido basta olhar na tabela para saber qual ao tomar. ca
O estado inicial do AFD constru a partir de todas as ree do gras de produo do s ca mbolo inicial. No exemplo do slide, temos S S$. Neste estado, a entrada deve iniciar com S, o que implica que pode iniciar com qualquer derivao de S. Chamamos ca o estado inicial de 1. Considerando um shift em x, o ponto passa para o lado direito de x. Ao efetuar um shift em (, a entrada deve iniciar com alguma cadeia derivvel a partir de L. Portanto, adicionamos as a produoes de L e de forma semelhante adicionamos as produoes c c de S para completar os itens do estado 3.
Tpicos em Computaao I o c
LR(0) - Estados
S S$ S (L) Sx
1 S S S . S$ .x . (L)
LS L L, S
Reduce: quando o topo da pilha corresponde ao lado direto de alguma regra de produo ca
2 S x.
E E {I J} until E and T did not change in this iteration Reduction: R{} for each state I in T for each item A . in I R R {(I, A )}
A ao goto ocorre quando analisamos um s ca mbolo noa terminal. Isto ocorre aps uma reduo de uma produo. Para o ca ca efetuarmos um goto basta passar o ponto do lado esquerdo de um no-terminal para o seu lado direito. a Quando o ponto est no m de um item, a regra foi analisada a por completo e a produo correspondente est pronta para uma ca a reduo (reduce). ca
O algoritmo acima utilizado para a construo do analisador e ca LR(0). Para o s mbolo $, no feito um goto, mas inserimos a e uma ao de accept, indicando m de anlise. ca a
Estados e DFA
S S$ S (L) Sx
1 x 2 S x S L L S S S L S. (. L) .S . L, S .x . (L) 7 S (L) . x. 3 (
LS L L, S
x 8 L S S L, . S . (L) .x S 9 L L, S .
S S S S
. S$ .x . (L) ( 4
,
L 5 S L ) 6 (L .) L . ,S
S.$
A operao closure adiciona mais itens no conjunto de itens ca quando existe um ponto do lado esquerdo de um s mbolo noa terminal. A operao goto move o ponto para depois do s ca mbolo X em todos os itens.
Tpicos em Computaao I o c
Tabela do LR(0)
Para toda aresta X I J Na linha I coluna X insira: shift J se X terminal e goto J se X no-terminal e a S S.$ insira accept A . insira reduce para todo token
Aps denirmos os estados da anlise LR(0) e seu AFD, o a e X poss construir a tabela LR(0). Para cada aresta I J do vel AFD, onde X um terminal, nos colocamos a ao shift J na e ca posio (I, X). Se X um no terminal, inserimos um goto ca e a na posio (I, X). Para cada estado I contendo um item com ca ponto antes do $, inserimos a ao accept na posio (I, $). Fica ca nalmente, para o estado contendo um ponto no nal da produo, ca inserimos um reduce na em todas as colunas de tokens da linha I. + s2 s2 s2 r3 r4 s2 s2 r1 r2 * s3 s3 s3 r3 r4 s3 s3 r1 r2 a s4 s4 s4 r3 r4 s4 s4 r1 r2 b s5 s5 s5 r3 r4 s5 s5 r1 r2 $ a g6 g7 r3 r4 g8 g9 r1 r2 E g1
Exerc cio
Construa a tabela LR(0) para a gramtica abaixo: a G = ({E}, {a, b, +, }, P, E) P = E a | b | + EE | EE
0 1 2 3 4 5 6 7 8 9
Tabela LR(0)
( 1 2 3 4 5 6 7 8 9 r1 r3 s3 r4 r4 s6 r1 r3 r1 r3 s2 r4 r4 r4 s8 r1 r3 r1 r3 g9 s3 r2 s3 r2 ) x s2 r2 s2 a r2 r2 g7 g5 , $ S g4 L