$$
\begin{array}{c|cccccc}
& id & + & * & ( & ) & \$ \\
\hline
E & E \to T E' & & & E \to T E' & & \\
E' & & E' \to + T E' & & & E' \to \epsilon & E' \to \epsilon \\
T & T \to F T' & & & T \to F T' & & \\
T' & & T' \to \epsilon & T' \to * F T' & & T' \to \epsilon & T' \to \epsilon \\
F & F \to id & & & F \to (E) & &
\end{array}
$$
Exemplo 5
Trace curto
Passo
Pilha
Entrada
Ação
1
[$, E]
id$
Consulta $M[E, id]$
2
[$, E', T]
id$
Expande $E \to T E'$
3
[$, E', T', F]
id$
Expande $T \to F T'$
4
[$, E', T', id]
id$
Expande $F \to id$
5
[$, E', T']
$
Faz match de id
6
[$, E']
$
Expande $T' \to \epsilon$
7
[$]
$
Expande $E' \to \epsilon$
8
[$]
$
Sucesso
Quando não é LL(1)
Três causas comuns:
Ambiguidade: duas árvores para a mesma cadeia
Recursão à esquerda: o parser volta ao mesmo não terminal antes de consumir entrada
Falta de fatoração: duas produções começam igual e o lookahead não basta
Prefixo comum
$$
A \to ab \mid ac
$$
com lookahead só em a, a decisão ainda não está pronta.
a solução é fatorar o prefixo comum.
Recursão à esquerda
$$
E \to E + T \mid T
$$
o parser tenta expandir E e volta para E antes de consumir qualquer coisa.
isso causa loop em parser top-down.
Ambiguidade
$$
E \to E + E \mid id
$$
para id + id + id, mais de uma árvore continua possível.
a tabela não consegue esconder um conflito que já existe na gramática.
Pŕoximos Passos
Na próxima aula, vamos fazer uma revisão para consolidar esses conceitos. Depois disso, o próximo passo será a geração de código na parte sintática.