a + b $XYZParserTabela deAnáliseFigura 4.5: Funcionamento de um Analisador Sintático DescendenteO algoritmo para calcular a função FIRST já foi visto anteriormente. O algoritmopara calcular a função FOLLOW é apresentado a seguir:1. Se S é o símbolo inicial da gramática e $ é o marcador de fim de sentença, então $está em FOLLOW(S);2. Se existe produção do tipo A → αXβ, então todos os terminais de FIRST(β), fazemparte de FOLLOW(X);3. Se existe produção do tipo A → αX, ou A → αXβ, sendo que β → ε, então todosos terminais que estiverem em FOLLOW(A) fazem parte de FOLLOW(X).Dada a gramática G = ({E, E ′ , T, T ′ , F }, {∨, ∧, ¬, id}, P, E) para expressões lógicas:Cláusula FirstE → T E ′E ′ → ∨T E ′ | εT → F T ′T ′ → ∧F T ′ | εF → ¬F | idConvém iniciar o processo pelos não-terminais que gerem conjuntos triviais. No exemplo,temos os não-terminais F, E’ e T’ que só geram elementos terminais (ou vazio):F = {¬, id}E ′ = {∧, ε}T ′ = {∨, ε}Como T deriva apenas em FT’ e F não leva em vazio, conclui-se que FIRST(T) =FIRST(F). E ainda, FIRST(E) = FIRST(T) = FIRST(F) = {¬, id}.28
Cláusula FollowPela regra 1 temos que FOLLOW(E) = {$}. Pela regra 3 tem-se que FOLLOW(E)= FOLLOW(E’). FOLLOW(T) é obtido a partir da união dos conjuntos obtidos pelaaplicação da regra 2 em (E ′ → ∨T E ′ ) e regra 3 em (E ′ → ε). Sendo assim temos:FOLLOW(T) = FIRST(E’) + FOLLOW(E’) = {∨, $}.FOLLOW(T’) = FOLLOW(T) pela aplicação da regra 3 em T → F T ′ . E finalmente,FOLLOW(F) = FIRST(T’) + FOLLOW(T’). Aplicação das regras 2 e 3 em T ′ → ∧F T ′ |ε, ou seja FOLLOW(F) = {∨, ∧, $}.4.4.1 Algoritmo para Construção da Tabela de AnáliseMétodo:• Para cada produção X → α, execute os passos 2 e 3 (para criar a linha X da tabelaM);• Para cada terminal a de FIRST(α), adicione a produção X → α a M[X,a];• Se FIRST(α) inclui a palavra vazia, então adicione X → α a M[X,b] para cada bem FOLLOW(X);Aplicando-se o algoritmo acima à gramática de expressões lógicas temos:Para E → T E ′ tem-se FIRST(TE’) = {¬, id} então, M[E, ¬] = M[E,id] = E → T E ′ .Para E ′ → ∨T E ′ tem-se FIRST(∨T E ′ ) = {∨} então, M[E’, ∨] = E ′ → ∨T E ′ .Para E ′ → ε tem-se FOLLOW(E’) = {$} então, M[E’, $] = E ′ → ε.Para T → F T ′ tem-se FIRST(FT’) = {¬, id} então, M[T, ¬] = M[T,id] = T → F T ′ .Para T ′ → ∧F T ′ tem-se FIRST(∧F T ′ ) = {∧} então, M[T’, ∧] = T ′ → ∧F T ′ .Para T ′ → ε tem-se FOLLOW(T’) = {∨, $} então, M[T’, ∨] = M[T’,$] = T ′ → ε.Para F → ¬F tem-se FIRST(¬F ) = {¬} então, M[F, ¬] = F → ¬F .Para F → id tem-se FIRST(id) = {id} então,M[F,id] = F → id.id ∨ ∧ ¬ $E E → T E ′ E → T E ′E’ E ′ → ∨T E ′ E ′ → εT T → F T ′ T → F T ′T’ T ′ → ε T ′ → ∧F T ′ T ′ → εF F → id F → ¬idSe, em cada entrada da Tabela de Análise, existe apenas uma produção, então agramática que originou a tabela é dita ser do tipo LL(1), ou seja: as sentenças geradaspela gramática são passíveis de serem analisadas da esquerda para a direita (Left toRight), produzindo uma derivação mais à esquerda (Leftmost Derivation), levandoem conta apenas um símbolo da entrada.Exercício: Considerando a gramática para a linguagem a ser reconhecida pelo protótipode compilador para análise descendente, construir a tabela de análise resultante.29