análise sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4...
TRANSCRIPT
Compiladores 2012/2013 1
Análise Sintática
Compiladores
Cristina C. Vieira
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
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 *
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
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
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
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 }
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’
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
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
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
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
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
( )
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.
( )
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
( )
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
( )
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
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
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
20
o Todas as strings não vazias de a’s com
comprimento par
o S → aa | aSa
o outras?
Gramáticas CFG
21
o L = { an bm cm dn | n,m >=1}
o S → aSd | aXd
o X → bXc | bc
o outras?
Gramáticas CFG
22
o Todas as strings com os parênteses esquerdos
e direitos balanceados
o S → SS |(S) |
o outras?
Gramáticas CFG
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
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
Eliminar ambiguidades
25
A gramática G
S → SS |(S) |
É ambígua? Porquê? Encontre uma gramática
não ambígua equivalente.
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)
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’ |
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 |
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’ |
Fatorizar à esquerda
30
Transformar as produções do tipo:
A → 1 | 2 |...| n | ζ
em produções do tipo:
A → A’| ζ
A’ → 1| 2|...| n
Factorizar à esquerda
31
o Factorizar à esquerda a gramática:
o G
S → aAb | abC | b
A → cb | ca | cC
C → a | b | c
Factorizar à esquerda
32
o G‘
S → aS’ | b
S’ → Ab | bC
A → cC
C → a | b | c
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?
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.