análise sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4...
TRANSCRIPT
![Page 1: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/1.jpg)
Compiladores 2012/2013 1
Análise Sintática
Compiladores
Cristina C. Vieira
![Page 2: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/2.jpg)
Compiladores 2011/2012 2
Sumário
Terminologia de gramáticas CFG
(gramáticas independentes do contexto)
Transformação de gramáticas CFG
Eliminar ambiguidades
Eliminar a recursividade à esquerda
Fatorizar à esquerda
![Page 3: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/3.jpg)
Compiladores 2012/2013 3
Analisador sintáctico
descendente
A recursividade à esquerda pode
levar a ciclos infinitos!
Exemplo de produção:
Term Term*Num
Passos potenciais na análise:
Term
Num * Term
Term
Term
Num * Term
Term
Num *
![Page 4: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/4.jpg)
Compiladores 2012/2013 4
Analisador sintáctico
descendente
A recursividade à esquerda pode
levar a ciclos infinitos!
Solução: modificar gramática de
modo a eliminar recursividade à
esquerda
![Page 5: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/5.jpg)
Compiladores 2012/2013 5
Eliminar recursividade à
esquerda
Começar com produções da forma
A A
A
Sequências , de símbolos
terminais e não-terminais que não
começam com A
Repetição da aplicação: A A
forma a árvore sintática seguinte:
A
A
A
![Page 6: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/6.jpg)
Compiladores 2012/2013 6
Eliminar recursividade à
esquerda
Produções de substituição
A A A R R é um novo símbolo não-terminal
A R R
R
A
A
A
R
R
R
Árvore inicial
Nova Árvore
![Page 7: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/7.jpg)
Compiladores 2012/2013 7
Gramática do Exemplo
INT = [0-9]+
Start Expr
Expr Expr “+” Term
Expr Expr “-” Term
Expr Term
Term Term “*” INT
Term Term “/” INT
Term INT
Conjunto de tokens
(símbolos terminais):
{ +, -, *, /, INT }
![Page 8: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/8.jpg)
Compiladores 2012/2013 8
Gramática Modificada
Pedaço da gramática
original
Term Term “*” INT
Term Term “/” INT
Term INT
Pedaço da gramática
modificada
Term INT Term’
Term’ “*” INT Term’
Term’ “/” INT Term’
Term’
![Page 9: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/9.jpg)
Compiladores 2012/2013 9
Gramática Modificada
Start Expr
Expr Term Expr’
Expr’ “+” Term Expr’
Expr’ “-” Term Expr’
Expr’
Term INT Term’
Term’ “*” INT Term’
Term’ “/” INT Term’
Term’
INT = [0-9]+
INT = [0-9]+
Start Expr
Expr Expr “+” Term
Expr Expr “-” Term
Expr Term
Term Term “*” INT
Term Term “/” INT
Term INT
![Page 10: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/10.jpg)
Compiladores 2012/2013 10
Comparando as Árvores
sintáticas
Term
INT *
Term
INT *
INT
Term
INT Term’
INT * Term’
INT * Term’
Gramática original Gramática modificada
![Page 11: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/11.jpg)
Compiladores 2012/2013 11
Eliminar Recursividade à
esquerda
Necessária na análise sintática
preditiva
Modifica o algoritmo de procura no espaço de produções
Elimina recursividade directa infinita
Contudo: gramática modificada é menos intuitiva
Requer mais transformações para se atingir AS desejada
![Page 12: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/12.jpg)
Compiladores 2012/2013 12
Requer +transformações para
se alcançar AST desejada
Árvore sintática para: 2*3*4
Construir AS desejada durante a derivação!
Term
INT
2
Term’
INT
3
* Term’
INT
4
* Term’
Term
INT
3
*
Term
INT
4 *
INT
2
AS Concreta AS desejada
![Page 13: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/13.jpg)
Compiladores 2011/2012 13
Analisadores Sintáticos
Técnicas de análise
Muitas técnicas de análise sintática
diferentes
Cada uma pode manusear algum
conjunto de CFGs
Categorização das técnicas
( )
![Page 14: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/14.jpg)
Compiladores 2011/2012 14
Terminologia
Muitas técnicas de análise sintática diferentes
Cada uma pode manusear algum conjunto de CFGs (gramáticas independentes do contexto)
Categorização das técnicas
L – análise da esq. para a drt.
R - análise da drt. para a esq.
( )
![Page 15: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/15.jpg)
Compiladores 2011/2012 15
Terminologia
Muitas técnicas de análise sintática diferentes
Cada uma pode manusear algum conjunto de CFGs (gramáticas independentes do contexto)
Categorização das técnicas
L – derivação pela esquerda
R – derivação pela direita
( )
![Page 16: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/16.jpg)
Compiladores 2011/2012 16
Terminologia
Muitas técnicas de análise sintática diferentes
Cada uma pode manusear algum conjunto de CFGs (gramáticas independentes do contexto)
Categorização das técnicas
Número de lookahead
( )
![Page 17: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/17.jpg)
Compiladores 2011/2012 17
Terminologia
Muitas técnicas de análise sintática diferentes
Cada uma pode manusear algum conjunto de CFGs (gramáticas independentes do contexto)
Categorização das técnicas
Exemplos: LL(3), LR(1)
Até agora: LL(1)
Nas próximas aulas • Análises LR(k)
( ) L L k
![Page 18: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/18.jpg)
Compiladores 2011/2012 18
Terminologia
LL(k)
Descendente (top-down), preditiva
Constrói derivação pela esquerda (leftmost) de
cima para baixo
LR(k)
Ascendente (bottom-up), shift-reduce
Constrói derivação pela direita (rightmost) de
baixo para cima
![Page 19: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/19.jpg)
Compiladores 2011/2012 19
Gramáticas CFG
Especificar gramáticas independentes do
contexto para as linguagens seguintes:
Todas as strings não vazias de a’s com
comprimento par
L = { an bm cm dn | n, m >=1}
Todas as strings com os parênteses
esquerdos e direitos balanceados
![Page 20: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/20.jpg)
20
o Todas as strings não vazias de a’s com
comprimento par
o S → aa | aSa
o outras?
Gramáticas CFG
![Page 21: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/21.jpg)
21
o L = { an bm cm dn | n,m >=1}
o S → aSd | aXd
o X → bXc | bc
o outras?
Gramáticas CFG
![Page 22: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/22.jpg)
22
o Todas as strings com os parênteses esquerdos
e direitos balanceados
o S → SS |(S) |
o outras?
Gramáticas CFG
![Page 23: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/23.jpg)
Eliminar ambiguidades
23
o Uma gramática ambígua produz mais do que uma
derivação, mais à esquerda ou mais à direita, para a
mesma frase
o Exp → Exp OP Exp |(Exp) |“-”Exp | ID | NUM
o OP → “+” | “-” | “*” | “/”
o A multiplicação e a divisão têm prioridade sobre a
soma e a subtração. Logo há que introduzir novos
terminais para reflectir essas prioridades e
associar os operadores à esquerda
![Page 24: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/24.jpg)
Eliminar ambiguidades
24
o Gramática transformada
o E → E + T | E – T | T
o T → T * F | T / F | F
o F → ID | NUM | (E) | - E
![Page 25: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/25.jpg)
Eliminar ambiguidades
25
A gramática G
S → SS |(S) |
É ambígua? Porquê? Encontre uma gramática
não ambígua equivalente.
![Page 26: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/26.jpg)
Eliminar ambiguidades
26
o Gramática não ambígua (quase) equivalente a G
o S → SS |(S’
o S’→ )| S)
Outras?
S → () | SS |(S’
S’→ S)
![Page 27: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/27.jpg)
Eliminar a recursividade à esquerda
27
Transformar as produções do tipo A → A | em produções do tipo:
A → A’
A’→ A’|
Generalizando:
A → A1 | A2 |...|An | 1 | 2 |...| m
A → 1A’| 2A’|...| mA’
A’→ 1A’| 2A’|...| nA’ |
![Page 28: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/28.jpg)
Eliminar a recursividade à esquerda
28
o Eliminar a recursividade à esquerda das
gramáticas:
o G1
o S → (L) | a
o L → L,S | S
o G2
o S → Aa | b
o A → Ac | Sd |
![Page 29: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/29.jpg)
Eliminar a recursividade à esquerda
29
o G1’
o S → (L) | a
o L → S L’
o L’→ , S L’ |
o G2’
o S → Aa | b
o A → bdA’| A’
o A’→ cA’| adA’ |
![Page 30: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/30.jpg)
Fatorizar à esquerda
30
Transformar as produções do tipo:
A → 1 | 2 |...| n | ζ
em produções do tipo:
A → A’| ζ
A’ → 1| 2|...| n
![Page 31: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/31.jpg)
Factorizar à esquerda
31
o Factorizar à esquerda a gramática:
o G
S → aAb | abC | b
A → cb | ca | cC
C → a | b | c
![Page 32: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/32.jpg)
Factorizar à esquerda
32
o G‘
S → aS’ | b
S’ → Ab | bC
A → cC
C → a | b | c
![Page 33: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/33.jpg)
Compiladores 2012/2013 33
Resumo
Analisador sintáctico descendente
Utilizar Lookahead para evitar Backtracking
Modificar gramática para evitar
necessidade de inspecção de tokens muito
à frente (lookahead): factorização
Modificar gramática para evitar ciclos
infinitos
Como implementar o analisador sintáctico
descendente?
![Page 34: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda](https://reader030.vdocuments.net/reader030/viewer/2022021808/5be6dcdb09d3f2ea1a8dce59/html5/thumbnails/34.jpg)
TPC
34
S → TS | Td | c
T → Tab | c | ε
o A gramática é ambígua? Porquê?
o Remova a recursividade à esquerda e fatorize a
gramática.
o Após as transformações verifique se a gramática
continua ambígua.