5.5 – Análise Bottom-Up Tentativa de construir uma árvore sintática para a sentença analisada, começando das folhas, indo em direção à raiz (pós-ordem , em alguns métodos) Esse processo pode ser encarado como a redução total de uma sentença ou um programa ao símbolo inicial da gramática Redução unitária (ou simplesmente redução): numa forma sentencial, uma sub-cadeia de símbolos igual ao lado direito de uma produção é substituído pelo não-terminal do lado esquerdo dessa produção
Exemplo: Risco: escolher reduções erradas e nunca chegar ao símbolo inicial S
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Uma forma sentencial pode apresentar várias alternativas conflitantes para reduções: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Se a gramática não for ambígua, só uma delas coopera para se chegar ao símbolo inicial
5.5.1 – Análise por deslocamento e redução Os átomos da sentença são deslocados um por um para dentro de uma pilha para reduções Essas ocorrem para terminais e/ou não-terminais do topo da pilha Se a sub-cadeia é devidamente escolhida a cada redução, o resultado é uma completa derivação mais à direita reversa
a b b c d e a A b c d e a A d e a A B e S Exemplo: Seja a gramática: S a A B e A A b c | b B d Seja a sentença abbcde e sua redução total a S: a b b c d e a A b c d e a A d e a A B e S Esta redução total é inversa a seguinte derivação mais à direita: S md a A B e md a A d e md a A b c d e md a b b c d e
A ser feita mais tarde, quando ‘d’ cair na pilha S a A B e A A b c | b B d Sentença abbcde e sua redução total a S: a b b c d e a A b c d e a A d e a A B e S Três possíveis reduções da forma sentencial: a A b c d e A Redução escolhida A ser feita mais tarde, quando ‘d’ cair na pilha Não leva a S, mas é o primeiro lado direito que se forma no topo da pilha A B
a b b c d e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a b b c d e
a b b c d e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a b b c d e
a b b c d e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a b b c d e Lado direito de uma produção: Reduzir
a A b c d e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A b c d e
a A b c d e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A b c d e Lado direito de uma produção: Não reduzir
a A b c d e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A b c d e Lado direito de uma produção: Reduzir
a A d e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A d e
a A d e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A d e Lado direito de uma produção: Reduzir
a A B e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A B e
a A B e S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A B e Lado direito de uma produção: Reduzir
S S a A B e A A b c | b B d Simulação da redução de a b b c d e: Observa-se que Pilha Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada S Aceitar a cadeia de entrada
Exemplo: seja a gramática L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ Pilha Entrada Ação # 10*(5+3)$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ Pilha Entrada Ação # 10*(5+3)$# d
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ Pilha Entrada Ação #C10 *(5+3)$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ Pilha Entrada Ação #C10 *(5+3)$# r: F C
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ Pilha Entrada Ação #F *(5+3)$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ Pilha Entrada Ação #F *(5+3)$# r: T F
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ Pilha Entrada Ação #T *(5+3)$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ Pilha Entrada Ação #T *(5+3)$# d d d
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ Pilha Entrada Ação #T*(C5 +3)$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ Pilha Entrada Ação #T*(C5 +3)$# r: F C
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ Pilha Entrada Ação #T*(F +3)$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ Pilha Entrada Ação #T*(F +3)$# r: T F
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ Pilha Entrada Ação #T*(T +3)$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ Pilha Entrada Ação #T*(T +3)$# r: E T
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ Pilha Entrada Ação #T*(E +3)$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ Pilha Entrada Ação #T*(E +3)$# d d
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ Pilha Entrada Ação #T*(E+C3 )$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ Pilha Entrada Ação #T*(E+C3 )$# r: F C
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ Pilha Entrada Ação #T*(E+F )$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ Pilha Entrada Ação #T*(E+F )$# r: T F
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ Pilha Entrada Ação #T*(E+T )$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ Pilha Entrada Ação #T*(E+T )$# r: E E+T
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ Pilha Entrada Ação #T*(E )$#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ Pilha Entrada Ação #T*(E )$# d
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ Pilha Entrada Ação #T*(E) $#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ Pilha Entrada Ação #T*(E) $# r: F (E)
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ Pilha Entrada Ação #T*F $#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ Pilha Entrada Ação #T*F $# r: T T*F
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ Pilha Entrada Ação #T $#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ Pilha Entrada Ação #T $# r: E T
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ E $ Pilha Entrada Ação #E $#
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ E $ Pilha Entrada Ação #E $# d
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ E $ Pilha Entrada Ação #E$ #
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ E $ Pilha Entrada Ação #E$ # r: L E$
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ E $ L Pilha Entrada Ação #L #
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ E $ L Pilha Entrada Ação #L # aceitar
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T * ( 5 + 3 ) $ T * ( F + 3 ) $ T * ( T + 3 ) $ T * ( E + 3 ) $ T * ( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ E $ L Pilha Entrada Ação #L #
Análise da expressão 10 * (5 + 3)$ L E $ E E opad T | T T T opmult F | F F cte | ( E ) Análise da expressão 10 * (5 + 3)$ Além das ações de deslocar, reduzir e aceitar, há também a de tratar erro Pilha Entrada Ação #L #
Há reduções legais e ilegais Reduções ilegais: não levam ao símbolo inicial Exemplos de reduções ilegais: E E E T T T F F F 10 * ( 5 + 3 ) $
Das reduções legais, qual fazer? Com deslocamento e redução, escolhe-se a da esquerda É a que se forma primeiro na pilha F F F 10 * ( 5 + 3 ) $ Numa gramática não-ambígua, asa de uma forma sentencial é o lado direito da redução legal mais à esquerda Redução escolhida
Numa gramática não-ambígua, asa de uma forma sentencial é o lado direito da redução legal mais à esquerda Asa em Inglês é handle (termo usado nos livros) Numa tal gramática, a asa de uma forma sentencial é única Em gramáticas ambíguas, há formas sentenciais com mais de uma asa Então é necessário definir asa de modo mais abrangente
Asa de uma forma sentencial: Uma de suas sub-cadeias que corresponde ao lado direito de uma produção tal que Sua redução para o não-terminal à esquerda dessa produção representa um passo de uma derivação mais à direita reversa Em gramáticas ambíguas, pode haver sentenças com mais de uma derivação mais à direita O grande problema é determinar qual(ais) a(s) asa(s) de uma forma sentencial, para poder fazer uma redução Nesta disciplina não serão abordadas gramáticas ambíguas
a b b c d e a A b c d e a A d e a A B e S Exemplo: Asas da redução de abbcde a b b c d e a A b c d e a A d e a A B e S Exemplo: Asas da redução de 10 * ( 5 + 3 ) $ 10 * ( 5 + 3 ) $ F * ( 5 + 3 ) $ T*( 5 + 3 ) $ T * ( F+3 ) $ T * ( T+3 ) $ T * ( E+3 ) $ T *( E + F ) $ T * ( E+T )$ T * ( E )$ T * F $ T $ E $ L Análise por deslocamento e redução faz o corte das asas formadas no topo da pilha Sem ambiguidades, uma vez formada a asa no topo da pilha, ela deve ser cortada (reduzida) O problema é identificar asas no topo da pilha
Já que Pilha Entrada é uma forma sentencial (derivada de S) O conteúdo da pilha é chamado de prefixo dessa forma Prefixo viável de uma forma sentencial é um prefixo dessa forma que não vai além do final da asa mais à direita da mesma: É um prefixo que pode aparecer na pilha de um analisador por deslocamento e redução
5 e E+T são as asas de suas respectivas formas Para gramáticas não ambíguas, prefixo viável de uma forma sentencial é um prefixo dessa forma que não vai além do final de sua asa Exemplo: sejam as seguintes situações na pilha 5 e E+T são as asas de suas respectivas formas Os prefixos #T*(5+ e #T*(E+T) são inviáveis Deslocar o ‘+’ ou ‘)’ equivale a enterrar asas Pilha Entrada #T*(5 +3)$# Pilha Entrada #T*(E+T )$#
Para gramáticas não ambíguas, prefixo viável de uma forma sentencial é um prefixo dessa forma que não vai além do final de sua asa Um analisador por deslocamento e redução faz detecção de prefixos inviáveis em sua pilha Isso é fundamental para a decisão entre deslocar ou reduzir
5.5.2 – Gramáticas LR(k) e LR(1) Gramáticas LR(k): admitem analisadores por deslocamento e redução que: Analisam as sentenças da esquerda para a direita (L - left) Produzem derivações mais à direita reversas (R - right) Precisam analisar no máximo, os próximos k símbolos, para decidir se vão reduzir ou deslocar e, se forem reduzir, que produção usar Gramáticas LR(1): gramáticas LR(k) em que k = 1
Comparação entre analisadores LL e LR: Analisador LR(k): reconhece o lado direito de uma produção, depois de ter lido todo o trecho do programa derivado desse lado direito, analisando os próximos k terminais de entrada Analisador LL(k): reconhece o uso de uma produção para expandir um não-terminal, analisando os próximos k terminais de entrada, sem levar em consideração nada que já foi lido Analisadores LR utilizam mais informações da entrada que analisadores LL para tomar decisões; suas dúvidas e conflitos são menos numerosas Analisadores LR podem analisar mais gramáticas que LL
5.5.3 – Analisadores LR São analisadores sintáticos para gramáticas LR Métodos LR conseguem analisar GLC’s recursivas à esquerda Um analisador LR consegue detectar um erro sintático tão cedo quanto possível, numa análise da esquerda para a direita da sentença É grande o trabalho de construir um analisador LR manualmente É providencial poder contar com um gerador automático; a ferramenta Yacc é LR
Esquema de um analisador LR:
Autômato: detecta prefixos inviáveis na pilha; governa todo analisador
Elemento da pilha: um símbolo e um estado do autômato
Tabela de ações: Ação[e, a] (a – átomo de entrada corrente e – estado no topo da pilha) pode ser: Deslocar, e’ - e’ é um estado Reduzir, p - p é o número de uma produção A Aceitar Erro
Tabela de transições: Goto[e, A] (e – estado, A – não-terminal) pode ser: Um outro estado Erro
Funcionamento do analisador: Se Ação [em, ai] = Deslocar, e: (e, ai) é empilhado (o autômato muda de estado) ai+1 passa a ser o átomo de entrada corrente
Funcionamento do analisador: Se Ação [em, ai] = Reduzir, p (p é A): r elementos da pilha são desempilhados (r – comprimento de ) (em-r, Xm-r) passa a ser o topo da pilha e Goto [em-r, A] (e, A) é empilhado (o autômato muda de estado)
Funcionamento do analisador: Se Ação [em, ai] = Aceitar: encerra-se a análise Se Ação [em, ai] = Erro: chama tratamento de erro A saída pode ser a relação de produções usadas nas reduções
Algoritmo 5.8: Análise LR Empilhar (e0); w sentença || $; p &(w[0]); Repetir sempre{ e estado do topo da pilha; a *p; caso (Ação [e, a]) seja { Aceitar: retornar; Erro: TratarErro ( ); Deslocar, e’: { Empilhar (e’, a); Avançar (p); } Reduzir, p (p = A, r = comprimento()): { Imprimir (A); Desempilhar (r elementos); e estado do topo da pilha; Empilhar (Goto [e, A], A); }
Exemplo: seja a seguinte gramática de expressões: 1) E E + T 3) T T * F 5) F ( E ) 2) E T 4) T F 6) F id Seja a seguinte sentença em análise: id * id + id Tabelas de ações e transições (construção apresentada a seguir):
Programa analisador LR Estado inicial: Ação: d 5 Sentença de entrada id * + $ Programa analisador LR Saída Pilha
Programa analisador LR Ação: r 6 Sentença de entrada F id id * + $ Programa analisador LR id 5 Saída Pilha
Programa analisador LR Sentença de entrada F id id * + $ Programa analisador LR id 5 Saída Pilha
Programa analisador LR Ação: r 4 Sentença de entrada F id T F F id id * + $ Programa analisador LR F 3 Saída Pilha
Programa analisador LR Ação: r 4 Sentença de entrada F id T F id * + $ Programa analisador LR F 3 Saída Pilha
Programa analisador LR Ação: d 7 Não reduz segundo E T Sentença de entrada F id T F id * + $ Programa analisador LR T 2 Saída Pilha
Programa analisador LR Ação: d 5 Sentença de entrada F id T F id * + $ * 7 Programa analisador LR T 2 Saída Pilha
Programa analisador LR Ação: r 6 Sentença de entrada F id T F F id T F id * + $ id 5 * 7 Programa analisador LR T 2 Saída Pilha
Programa analisador LR Sentença de entrada F id T F id * + $ id 5 * 7 Programa analisador LR T 2 Saída Pilha
Programa analisador LR Ação: r 3 Sentença de entrada F id T F T T*F F id T F id * + $ F 10 * 7 Programa analisador LR T 2 Saída Pilha
Programa analisador LR Sentença de entrada F id T F T T*F id * + $ F 10 * 7 Programa analisador LR T 2 Saída Pilha
Programa analisador LR Ação: r 2 Sentença de entrada F id T F T T*F F id T F T T*F E T id * + $ Programa analisador LR T 2 Saída Pilha
Programa analisador LR Sentença de entrada F id T F T T*F E T id * + $ Programa analisador LR T 2 Saída Pilha
Programa analisador LR Ação: d 6 Sentença de entrada F id T F T T*F E T id * + $ Programa analisador LR E 1 Saída Pilha
Programa analisador LR Ação: d 5 Sentença de entrada F id T F T T*F E T id * + $ + 6 Programa analisador LR E 1 Saída Pilha
Programa analisador LR Ação: r 6 Sentença de entrada F id T F T T*F E T F id T F T T*F E T id * + $ id 5 + 6 Programa analisador LR E 1 Saída Pilha
Programa analisador LR Sentença de entrada F id T F T T*F E T id * + $ id 5 + 6 Programa analisador LR E 1 Saída Pilha
Programa analisador LR Ação: r 4 Sentença de entrada F id T F T T*F E T F id T F T T*F E T id * + $ F 3 + 6 Programa analisador LR E 1 Saída Pilha
Programa analisador LR Sentença de entrada F id T F T T*F E T id * + $ F 3 + 6 Programa analisador LR E 1 Saída Pilha
Programa analisador LR Ação: r 1 Sentença de entrada F id T F T T*F E T E E+T F id T F T T*F E T id * + $ T 9 + 6 Programa analisador LR E 1 Saída Pilha
Programa analisador LR Sentença de entrada F id T F T T*F E T E E+T id * + $ T 9 + 6 Programa analisador LR E 1 Saída Pilha
Programa analisador LR Ação: act Sentença de entrada F id T F T T*F E T E E+T id * + $ Programa analisador LR E 1 Saída Pilha