Escolar Documentos
Profissional Documentos
Cultura Documentos
Analisador Sintático
Prof. Raimundo BARRETO
DCC/UFAM
Introdução
Toda linguagem de programação tem regras que
descrevem sua estrutura sintática (ou sintaxe)
FIRST(T') = { *, ε}
FIRST(T') = { *, ε}
FOLLOW(E) = {$}
FIRST(T') = { *, ε}
FOLLOW(E) = {), $}
FIRST(T') = { *, ε}
FOLLOW(E) = FOLLOW(E') = { ), $}
FOLLOW(T) = FOLLOW(T') = { +, ), $}
FOLLOW(F) = { +, *, ), $}
Descendente preditivo
Tabela de parsing
Descendente preditivo
Construção da Tabela de parsing
Algoritmo: Construção da tabela de parsing
Início
→α da gramática faça:
Para cada produção A→α
para cada símbolo terminal a em FIRST(αα) faça:
→α em M[A, a]
adicione a produção A→α
se ε está em FIRST(α
α)
→α em M[A, b], para
adicione a produção A→α
cada terminal b em FOLLOW(A)
se ε está em FIRST(α
α) e $ está em FOLLOW(A)
→α em M[A, $]
adicione a produção A→α
Indique erro em cada entrada indefinida de M.
Fim
Descendente preditivo
Construção da Tabela de parsing
(1)E → TE' (5) T' → *FT'
(2)E' → +TE' (6) T' → ε
(3)E' → ε (7) F → ( E )
(4)T → FT' (8) F → id
Descendente preditivo
Construção da Tabela de parsing
(1)E → TE' (5) T' → *FT'
(2)E' → +TE' (6) T' → ε
(3)E' → ε (7) F → ( E )
(4)T → FT' (8) F → id
Regra 1
FIRST(TE’) =
FIRST{T} = {id, (}
Descendente preditivo
Construção da Tabela de parsing
(1)E → TE' (5) T' → *FT'
(2)E' → +TE' (6) T' → ε
(3)E' → ε (7) F → ( E )
(4)T → FT' (8) F → id
Regra 1
Uma vez que
FIRST(+)={+}
Descendente preditivo
Construção da Tabela de parsing
(1)E → TE' (5) T' → *FT'
(2)E' → +TE' (6) T' → ε
(3)E' → ε (7) F → ( E )
(4)T → FT' (8) F → id
Regra 2, uma
vez que
FOLLOW(E’)
={), $}
Descendente preditivo
O algoritmo dado é válido para qualquer
gramática
Porém, para algumas gramáticas, a matriz M
pode possuir algumas entradas multiplamente
definidas
por exemplo, se a gramática é recursiva à
esquerda ou ambígua, temos pelo menos uma
entrada multiplamente definida.
Descendente preditivo
Exemplo: A gramática abaixo é ambígua para a sentença
w, e pode ser interpretada de duas formas diferentes.
<cmd> ::= if <cond> then <cmd> <pelse>
<cmd> ::= a
<pelse> ::= else <cmd>
<pelse> ::= ε
<cond> ::= b
if <cond> then
if <cond> then a
else a
ou
if <cond> then
if <cond> then a
else a
Descendente preditivo
Para essa gramática, teríamos a seguinte matriz
de análise sintática:
Descendente preditivo
Gramáticas cujas tabelas de análise sintática não
possuem entradas múltiplas definidas são ditas
LL(1).