SlideShare a Scribd company logo
1 of 118
Download to read offline
Análise sintática

   Ivan Ricarte


      2008




                    I NTRODUÇÃO À COMPILAÇÃO
Sumário
  Reconhecimento de sentenças

  Derivações canônicas

  Árvores sintáticas

  Gramáticas ambíguas

  Analisadores sintáticos
    Autômato de pilha
    Analisador sintático preditivo
    Analisador de precedência fraca

  Geradores de analisadores sintáticos
     Especificação da gramática
     Manipulação das sentenças reconhecidas
     Desenvolvimento de uma aplicação
                                              I NTRODUÇÃO À COMPILAÇÃO
Análise sintática



   Arquivo de       análise
                                                                    Arquivo de
                                     ...                síntese      destino
     origem          léxica

                          análise
                         sintática

                        análise


                                           Estruturas
                Gramáticas                  internas




                                                                  I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças




     O reconhecimento de sentenças, ou parsing, é o
     procedimento que verifica se uma dada sentença pertence
     à linguagem gerada por uma gramática.
     Gramáticas tipo 2, ou gramáticas livres de contexto, são
     adequadas para representar boa parte das características
     de linguagens de programação.




                                                   I NTRODUÇÃO À COMPILAÇÃO
Validação de uma sentença


  Há duas formas de validar uma sentença:
  Top-down ou descendente: a partir do símbolo sentencial,
             selecionar uma seqüência de aplicação de regras
             e aplicá-las, substituindo o lado esquerdo pelo
             lado direito, até que se obtenha a sentença sob
             análise; ou
  Bottom-up ou ascendente: a partir da sentença, selecionar
             uma seqüência de aplicação de regras e
             aplicá-las, substituindo o lado direito pelo lado
             esquerdo, até que reste apenas o símbolo
             sentencial.



                                                       I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: uma gramática para expressões




    Para reconhecer expressões (E):
                     E    →    E +E              1
                     E    →    E ×E              2
                     E    →    (E)               3
                     E    →    v                 4

         A expressão (v + v ) × v faz parte dessa gramática?




                                                        I NTRODUÇÃO À COMPILAÇÃO
Estratégias de validação



   Há duas formas de responder a essa questão:
   Validação descendente A partir do símbolo sentencial E,
               procura aplicar produções da gramática
               substituindo o lado esquerdo pelo lado direito até
               que a sentença (v + v ) × v seja derivada
   Validação ascendente A partir da sentença (v + v ) × v ,
               procura aplicar produções da gramática
               substituindo o lado direito pelo lado esquerdo até
               que reste apenas o símbolo sentencial E




                                                       I NTRODUÇÃO À COMPILAÇÃO
Validação descendente


 Produções                   Derivações
  E   →   E +E         1
  E   →   E ×E         2                  2
                                    E =⇒ E × E
  E   →   (E)          3
                                          3
  E   →   v            4              =⇒ (E) × E
                                          1
                                      =⇒ (E + E) × E
                                          4
                                      =⇒ (v + E) × E
                                          4
                                      =⇒ (v + v ) × E
                                          4
                                      =⇒ (v + v ) × v

      Seqüência 2, 3, 1, 4, 4, 4

                                                   I NTRODUÇÃO À COMPILAÇÃO
Validação descendente

  Outras seqüências de reconhecimento podem ser obtidas para
  essa mesma estratégia:
      2, 3, 4, 1, 4, 4
              2          3           4
          E =⇒ E × E =⇒ (E) × E =⇒ (E) × v
              1              4              4
            =⇒ (E + E) × v =⇒ (E + v ) × v =⇒ (v + v ) × v

      2, 4, 3, 1, 4, 4
              2          4       3
          E =⇒ E × E =⇒ E × v =⇒ (E) × v
              1              4              4
            =⇒ (E + E) × v =⇒ (E + v ) × v =⇒ (v + v ) × v




                                                   I NTRODUÇÃO À COMPILAÇÃO
Validação ascendente


 Produções                  Derivações
  E   →   E +E        1
  E   →   E ×E        2                      4
                                (v + v ) × v ⇐= (E + v ) × v
  E   →   (E)         3
                                             4
  E   →   v           4                     ⇐= (E + E) × v
                                             4
                                            ⇐= (E + E) × E
                                             1
                                            ⇐= (E) × E
                                             3
                                            ⇐= E × E
                                             2
                                            ⇐= E

      Seqüência de reconhecimento 4, 4, 4, 1, 3, 2
      Também há outras seqüências
                                                     I NTRODUÇÃO À COMPILAÇÃO
Derivações canônicas




     Forma sistemática de selecionar qual símbolo da forma
     sentencial será substituído na próxima derivação
     Duas formas
         Derivação canônica mais à esquerda (leftmost derivation)
         Derivação canônica mais à direita (rightmost derivation)
     Para uma derivação canônica, a seqüência de
     reconhecimento é única




                                                       I NTRODUÇÃO À COMPILAÇÃO
Derivações canônicas
Derivação canônica mais à esquerda




    Derivação canônica mais à esquerda aplica uma produção da
                gramática para substituir o símbolo não-terminal
                mais à esquerda da forma sentencial

         A seqüência de produções aplicadas desde o símbolo
         sentencial até a sentença é denominada a seqüência de
         reconhecimento mais à esquerda, ou leftmost parse




                                                      I NTRODUÇÃO À COMPILAÇÃO
Derivações canônicas
Derivação canônica mais à direita




    Derivação canônica mais à direita símbolo não-terminal mais à
                direita da forma sentencial é selecionado para ser
                substituído pela aplicação de uma produção da
                gramática

          A seqüência de reconhecimento mais à direita, ou
          rightmost parse, é dada pelo reverso da seqüência de
          produções associada à derivação
          É a seqüência de aplicação de produções para partir da
          sentença e alcançar o símbolo sentencial



                                                        I NTRODUÇÃO À COMPILAÇÃO
Derivações canônicas
Exemplo



    Produções
     E    →    E +E        1
     E    →    E ×E        2
     E    →    (E)         3
     E    →    v           4


    Derivações canônicas para (v + v ) × v
          Seqüência de reconhecimento mais à esquerda:
          2, 3, 1, 4, 4, 4
          Seqüência de reconhecimento mais à direita:
          4, 4, 1, 3, 4, 2


                                                        I NTRODUÇÃO À COMPILAÇÃO
Árvores sintáticas


   Representação das derivações utilizadas no reconhecimento
   de uma sentença através de uma estrutura de árvore

   Em uma árvore sintática:
    1. a raiz da árvore é um nó com o símbolo sentencial;
    2. as folhas da árvore são símbolos terminais, na mesma
       seqüência em que estes ocorrem na sentença analisada; e
    3. os nós intermediários da árvore correspondem a símbolos
       não terminais, onde um nó cujo rótulo é P com filhos
       s1 , s2 , . . . , sn pode ocorrer apenas se houver uma regra
       P → s1 s2 . . . sn na gramática.




                                                        I NTRODUÇÃO À COMPILAÇÃO
Árvores sintáticas
Subárvores para a gramática de expressões




                                            E →E ×E
    E →E +E
                                                       E
                E
                                               E   ×       E
            E   +   E

                                            E →v
    E → (E)
                                                   E
            (   E   )
                                                   v




                                                               I NTRODUÇÃO À COMPILAÇÃO
Árvore sintática para (v + v ) × v


                               E


                   E           ×     E

                                     v
           (       E       )

               E   +   E

               v       v




                                         I NTRODUÇÃO À COMPILAÇÃO
Árvores sintáticas
Relação com derivações canônicas



         Estrutura da árvore sintática independe da seqüência de
         derivações utilizada para reconhecimento
         Uma derivação canônica está associada à estratégia
         utilizada para percorrer seqüencialmente os elementos da
         árvore
          pré-ordem raiz antes das folhas, folhas da esquerda para
                       a direita
              seqüência de reconhecimento mais à esquerda
          pós-ordem folhas da esquerda para a direita, raiz depois
                    das folhas

              seqüência de reconhecimento mais à direita


                                                            I NTRODUÇÃO À COMPILAÇÃO
Gramáticas ambíguas



  Gramática é ambígua se for possível obter, para uma
  sentença, mais de uma árvore sintática
      De modo equivalente, é ambígua se houver mais que uma
      seqüência de reconhecimento mais à direita
      Ou mais de uma seqüência de reconhecimento mais à
      esquerda
      Ou ainda, mais de uma derivação canônica mais à
      esquerda
      Ou mais de uma derivação canônica mais à direita




                                                    I NTRODUÇÃO À COMPILAÇÃO
Gramáticas ambíguas
Exemplo




    Considere a sentença v + v × v em

     E    →   E +E       1
     E    →   E ×E       2
     E    →   (E)        3
     E    →   v          4




                                        I NTRODUÇÃO À COMPILAÇÃO
Gramáticas ambíguas
Exemplo: árvore 1




                         E


                    E    +       E

                    v        E   ×   E

                             v       v
    seqüência de reconhecimento mais à esquerda 1, 4, 2, 4, 4
    seqüência de reconhecimento mais à direita 4, 4, 4, 2, 1




                                                        I NTRODUÇÃO À COMPILAÇÃO
Gramáticas ambíguas
Exemplo: árvore 2




                                E


                        E       ×    E

                    E   +   E        v

                    v       v
    seqüência de reconhecimento mais à esquerda 2, 1, 4, 4, 4
    seqüência de reconhecimento mais à direita 4, 4, 1, 4, 2




                                                        I NTRODUÇÃO À COMPILAÇÃO
Versão não-ambígua da gramática de expressões




   E   →   E +M          1
   E   →   M             2
   M   →   M ×P          3
   M   →   P             4
   P   →   (E)           5
   P   →   v             6




                                       I NTRODUÇÃO À COMPILAÇÃO
Mesma sentença, na gramática revista


        Única interpretação possível para v + v × v
        Por exemplo, para o reconhecimento descendente:
                                                E
    1           2
  E ⇒E +M ⇒M +M
    4           6
                                        E       +          M
    ⇒P +M ⇒v +M
    3               4                  M              M    ×      P
    ⇒v +M ×P ⇒v +P ×P
    6               6
    ⇒v +v ×P ⇒v +v ×v                   P             P           v

                                        v             v



                                                          I NTRODUÇÃO À COMPILAÇÃO
Analisadores sintáticos



      Programas que reconhecem automaticamente sentenças
      de uma dada gramática livre de contexto
         Como para analisadores léxicos, um autômato é uma
         representação abstrata para o analisador
         No entanto, para o analisador sintático o autômato precisa
         de uma memória auxiliar:
                Pilha estrutura linear com política de acesso LIFO
                      (Last In, First Out)




                                                        I NTRODUÇÃO À COMPILAÇÃO
Autômato de pilha



  Definição formal
  Sêxtupla M = (K , Σ, Γ, δ, s, F ), na qual os elementos são:
    1. o conjunto finito de estados, K ;
    2. o alfabeto de entrada finito, Σ;
    3. o alfabeto de pilha finito, Γ;
    4. a função de transição, δ : K × Σ × Γ → K × Γ;
    5. o estado inicial, s, s ∈ K ; e
    6. o conjunto de estados finais, F , com F ⊆ K .




                                                         I NTRODUÇÃO À COMPILAÇÃO
Analisadores sintáticos



      Analisadores utilizam o autômato de pilha para reconhecer
      sentenças de uma linguagem livre de contexto
      Podem usar a técnica de construção descendente ou
      ascendente
      Descendente Pilha começa com símbolo sentencial
      Ascendente Pilha começa vazia
      Exemplos de analisadores
      Analisador sintático preditivo construção descendente
      Analisador de precedência fraca construção ascendente




                                                    I NTRODUÇÃO À COMPILAÇÃO
Analisador sintático preditivo




   Analisador apropriado para gramáticas LL(1)
       Varredura da sentença ocorre da esquerda para a direita
       (Left-to-right)
       Derivação canônica mais à esquerda (Leftmost derivation)
       Um único símbolo da sentença (lookahead) analisado a
       cada passo




                                                     I NTRODUÇÃO À COMPILAÇÃO
Analisador sintático preditivo
Gramáticas LL(1)




    Gramática com produções A → α e A → β é LL(1) se:
     1. α e β não iniciam com o mesmo símbolo terminal
              Ou com símbolos não-terminais cujas expansões iniciem
              com o mesmo símbolo terminal
      2. Só α ou só β tem expansões que levam à string vazia
      3. Se α leva à string vazia, β não inicia expansão com
         símbolo terminal que possa ocorrer imediatamente à
         direita de A




                                                          I NTRODUÇÃO À COMPILAÇÃO
Analisador sintático preditivo
Conversão de produções recursivas




          Técnica de construção descendente não pode ser aplicada
          a gramáticas com produções recursivas à esquerda
          Se houver produção dessa forma, é necessário
          convertê-la:
                                    Para
     De

                                             A→δA
             A→Aβ
                                            A →βA
             A→δ
                                            A →ε



                                                         I NTRODUÇÃO À COMPILAÇÃO
Construção do analisador sintático preditivo


      Uma tabela sintática representa as operações possíveis
      para o autômato associado ao analisador
      Construção dessa tabela é feita pela análise de cada
      produção
      Para cada par símbolo não-terminal, símbolo terminal, a
      tabela indica qual produção deve ser aplicada, se possível
          Símbolo terminal é o próximo símbolo da sentença
          Símbolo não-terminal é o símbolo no topo da pilha
      Além dos símbolos terminais, um delimitador de sentença
      (denotado aqui por $ ) é uma entrada reconhecida pela
      tabela



                                                        I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática

   Para cada produção A → B na gramática,
       Insira a produção na tabela sintática na linha A, coluna t,
       para cada símbolo terminal t que pode iniciar a expansão
       de B
       Se B = ε, então insira a produção na tabela sintática na
       linha A, coluna t para cada símbolo terminal t que pode
       ocorrer à direita de A, sendo que:
           O delimitador $ pode estar à direita do símbolo sentencial;
           t pode ser um símbolo terminal que inicia a expansão de
           um símbolo não-terminal que ocorre à direita de A em
           alguma produção
       Para cada produção na forma A → . . . B, os símbolos que
       podem ocorrer à direita de A também podem ocorrer à
       direita de B

                                                          I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Exemplo




    Considere a construção do analisador sintático preditivo para a
    seguinte gramática de expressões:

    Gramática original
                   E   →    E +M                  1
                   E   →    M                     2
                   M   →    M ×P                  3
                   M   →    P                     4
                   P   →    (E)                   5
                   P   →    v                     6




                                                        I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Conversão da gramática

    Inicialmente, é preciso eliminar das produções da gramática
    qualquer recursão à esquerda:

    Gramática equivalente sem recursão à esquerda

                              E → ME                              (1)
                             E → +ME                              (2)
                             E →ε                                 (3)
                             M → PM                               (4)
                             M → ×PM                              (5)
                             M →ε                                 (6)
                              P → (E)                             (7)
                              P→v                                 (8)

                                                       I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Análise das produções (1)


    A seguir, cada produção é analisada para obter as entradas na
    tabela:
    Produção 1: E → ME
         Os símbolos terminais que podem iniciar a expansão de E
         são aqueles que iniciam a expansão de M
         Por sua vez, M → PM — expansão de P
         Como P → (E) e P → v , os símbolos terminais que
         podem iniciar essa expansão são ( e v

                            ...    (   ...   v    ...
                        E         P1         P1


                                                        I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Análise das produções (2)




    Produção 2: E → +ME
         Um símbolo terminal pode iniciar a expansão de E por
         essa produção: +

                            ...   +    ...   ...   ...
                        E         P2




                                                         I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Análise das produções (3)

    Produção 3: E → ε
         Não há expansão, a segunda regra deve ser usada
               Se A → ε, então insira a produção na tabela sintática na
               linha A, coluna t para cada símbolo terminal t que pode
               ocorrer à direita de A
         Pelas produções, não há nenhum símbolo que ocorra
         diretamente à direita de E
         Como E → ME , o que pode ocorrer à direita de E
         também pode indiretamente ocorrer à direita de E
                $ (E é o símbolo sentencial) e ) (pela produção P → (E))


                            ...    )    ...    $    ...
                        E         P3          P3
                                                              I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Análise das produções (4)




    Produção 4: M → PM
         Os símbolos terminais que podem iniciar a expansão de M
         são aqueles que iniciam a expansão de P
         Como P → (E) e P → v , os símbolos terminais que
         podem iniciar essa expansão são ( e v

                            ...    (   ...   v    ...
                        M         P4         P4




                                                        I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Análise das produções (5)




    Produção 5: M → ×PM
         Um símbolo terminal pode iniciar a expansão de M por
         essa produção: ×

                            ...   ×    ...   ...   ...
                        M         P5




                                                         I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Análise das produções (6)

    Produção 6: M → ε
         Não há expansão, a segunda regra deve ser usada
         Pelas produções, não há nenhum símbolo que ocorra
         diretamente à direita de M
         Como M → PM , o que pode ocorrer à direita de M
         também pode indiretamente ocorrer à direita de M
               Pelas produções 1 e 2, E aparece à direita de M; a
               expansão de E pode iniciar com +
               Como E → ε pela produção 3, é preciso incluir também os
               símbolos que podem ocorrer à direita de E, pois E → ME :
                $ e)


                            ...    )    +    $    ...
                        M         P6   P6    P6
                                                            I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Análise das produções (7)




    Produção 7: P → (E)
         Um símbolo terminal pode iniciar a expansão de P por
         essa produção: (

                            ...    (   ...   ...   ...
                        P         P7




                                                         I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Análise das produções (8)




    Produção 8: P → v
         Um símbolo terminal pode iniciar a expansão de P por
         essa produção: v

                            ...   v    ...   ...   ...
                        P         P8




                                                         I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela sintática
Resultado




    Tabela sintática derivada das produções

                      +   ×    (    )    v    $
                E              P1        P1
                E    P2             P3        P3
                M              P4        P4
                M    P6   P5        P6        P6
                P              P7        P8




                                                   I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças


     O reconhecimento da sentença com o analisador preditivo
     utiliza duas estruturas auxiliares
      1. Uma pilha com a forma sentencial resultante da aplicação
         das produções, inicialmente com o símbolo sentencial
         (precedido do delimitador de sentença, $ )
      2. Uma lista com os símbolos terminais que compõem a
         sentença, com o delimitador de sentença $ ao final
     Quando o topo da pilha e o início da sentença têm o
     mesmo símbolo, ambos são retirados
     Condição de reconhecimento ocorre quando a pilha de
     símbolos e a sentença tornam-se vazias



                                                       I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (1)




    Estado inicial:


     Pilha         Lista de tokens   Árvore sintática
                      v   +v × v $              E
       E
       $




                                                    I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (2)




    Para [E, v ], tabela indica aplicação da produção 1: E → ME


     Pilha         Lista de tokens      Árvore sintática
                    v    +v × v $                 E
       M
       E                                      M       E
       $




                                                          I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (3)




    Para [M, v ], tabela indica aplicação da produção 4: M → PM


     Pilha         Lista de tokens      Árvore sintática
                    v    +v × v $                   E
      P
      M                                         M       E
      E
                                            P       M
       $




                                                            I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (4)




    Para [P, v ], tabela indica aplicação da produção 8: P → v


     Pilha         Lista de tokens       Árvore sintática
                    v    +v × v $                     E
      v
      M                                           M       E
      E
                                              P       M
       $
                                              v




                                                              I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (5)



    Mesmo símbolo no topo da pilha e no início da lista:
    consumi-los


     Pilha         Lista de tokens       Árvore sintática
                    +    v ×v $                       E
      M
      E                                           M       E
       $                                     P        M

                                              v



                                                              I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (6)




    Para [M , +], tabela indica aplicação da produção 6: M → ε


     Pilha         Lista de tokens      Árvore sintática
                    +    v ×v $                     E
       E
                                                M       E
       $
                                            P       M

                                            v       ε




                                                            I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (7)




    Para [E , +], produção 2: E → +ME


     Pilha         Lista de tokens      Árvore sintática
                    +    v ×v $                      E
       +
       M                                     M           E
       E
                                         P       M   +   M     E
       $
                                         v       ε



                                                         I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (8)




    Mesmo símbolo no topo da pilha e início da lista: consumi-los


     Pilha         Lista de tokens      Árvore sintática
                    v    ×v $                         E
       M
       E                                      M           E
       $
                                          P       M   +   M     E

                                          v       ε



                                                          I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (9)



    Para [M, v ], produção 4: M → PM


    Pilha        Lista de tokens       Árvore sintática
                   v   ×v $                        E
      P
      M
                                           M               E
      E
      $                                P       M
                                                   +       M        E
                                       v       ε
                                                       P       M



                                                           I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (10)


    Para [P, v ], produção 8: P → v


    Pilha        Lista de tokens      Árvore sintática
                   v   ×v $                       E
     v
     M
                                          M               E
     E
      $                               P       M
                                                  +       M        E
                                      v       ε
                                                      P       M

                                                      v

                                                          I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (11)


    Mesmo símbolo no topo da pilha e início da lista: consumi-los


    Pilha        Lista de tokens      Árvore sintática
                   ×   v $                         E
     M
     E
                                           M               E
      $
                                       P       M
                                                   +       M        E
                                       v       ε
                                                       P       M

                                                       v

                                                           I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (12)




    Para [M , ×], produção 5: M → ×PM


                 Pilha             Lista de tokens
                                    ×   v $
                  ×
                  P
                  M
                  E
                   $




                                                     I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (13)



    Árvore sintática
                             E


                 M                     E

             P       M

             v       ε   +             M           E

                                   P       M

                                   v   ×   P   M


                                                       I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (14)




    Mesmo símbolo no topo da pilha e início da lista: consumi-los


                 Pilha               Lista de tokens
                                       v   $
                  P
                  M
                  E
                   $




                                                        I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (15)




    Para [P, v ], produção 8: P → v


                 Pilha                Lista de tokens
                                       v   $
                  v
                  M
                  E
                   $




                                                        I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (16)


    Árvore sintática
                             E


                 M                     E

             P       M

             v       ε   +             M           E

                                   P       M

                                   v   ×   P   M

                                           v
                                                       I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (17)




    Mesmo símbolo no topo da pilha e início da lista: consumi-los


                 Pilha               Lista de tokens
                                       $
                  M
                  E
                   $




                                                        I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (18)




    Para [M , $ ], produção 6: M → ε


                 Pilha                 Lista de tokens
                                        $
                   E
                   $




                                                         I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (19)


    Árvore sintática
                             E


                 M                     E

             P       M

             v       ε   +             M           E

                                   P       M

                                   v   ×   P   M

                                           v   ε
                                                       I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (20)



    Para [E , $ ], produção 3: E → ε


                 Pilha                 Lista de tokens
                                        $
                   $

    Condição de aceitação

    Símbolo delimitador de sentença $ no topo da pilha e no
    início da lista de tokens



                                                         I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentenças
Exemplo: sentença v + v × v (21)


    Árvore sintática final
                             E


                 M                     E

             P       M

             v       ε   +             M           E

                                   P       M       ε

                                   v   ×   P   M

                                           v   ε
                                                       I NTRODUÇÃO À COMPILAÇÃO
Analisador sintático preditivo




      Construção da árvore sintática é descendente
          Começa com o símbolo sentencial (conteúdo inicial da
          pilha)
          Cada vez que uma produção é selecionada para aplicação,
          o nó não terminal mais à esquerda da árvore é expandido
          em uma subárvore com o lado direito da produção
          Quando símbolo mais à esquerda da árvore é terminal, se
          for igual ao próximo símbolo da sentença há continuidade




                                                       I NTRODUÇÃO À COMPILAÇÃO
Analisador de precedência fraca



      Analisador baseado na técnica de construção ascendente
          Sentença é reconhecida quanto todos os símbolos da
          sentença são lidos e na forma sentencial resta apenas o
          símbolo sentencial
      Corresponde à criação da árvore sintática das folhas para
      a raiz
          Sentença reconhecida quando todos os símbolos da
          sentença estão associados às folhas da árvore sintática e a
          raiz é o símbolo sentencial




                                                         I NTRODUÇÃO À COMPILAÇÃO
Gramáticas de precedência fraca



      A gramática deve ser de precedência fraca para que o
      correspondente analisador de precedência fraca seja
      determinístico
          Sem produções com string vazia no lado direito
          Unicamente inversível (sem duas produções com mesmo
          lado direito)
          Livre de ciclos
          Se X Y ou X ≈ Y , então X Y não ocorre
              Que relações são estas?




                                                    I NTRODUÇÃO À COMPILAÇÃO
Relações de Wirth-Weber




   1. X ≈ Y se existe pelo menos uma produção em G cujo
      lado direito tenha X imediatamente antes de Y ,

                           A → αXY β

     sendo α e β quaisquer strings em G.




                                                 I NTRODUÇÃO À COMPILAÇÃO
Relações de Wirth-Weber



   2. X   Y se existe um símbolo não terminal Z ∈ VN tal que

                      X ≈ Z e Y ∈ ESQ(Z )



  Definição auxiliar

                               +
    ESQ(X ) = {Y ∈ VT ∪ VN |X ⇒ Y α, para α ∈ (VT ∪ VN )∗}




                                                   I NTRODUÇÃO À COMPILAÇÃO
Relações de Wirth-Weber

   3. X   a, a ∈ VT , se uma das duas condições é verdadeira:
          Existe um símbolo não-terminal Z ∈ VN tal que

                            Z ≈ a e X ∈ DIR(Z )

          ou
          Existem símbolos não-terminais Z1 , Z2 ∈ VN tal que

                 Z1 ≈ Z2 e X ∈ DIR(Z1 ) e a ∈ ESQ(Z2 )



  Definição auxiliar

                                  +
    DIR(X ) = {Y ∈ VT ∪ VN |X ⇒ αY , para α ∈ (VT ∪ VN )∗}


                                                          I NTRODUÇÃO À COMPILAÇÃO
Condições para construção do analisador



  Além das já apresentadas:
      Se duas produções terminam com mesma seqüência de
      símbolos β
                            A → αX β
      e
                               B→β
      O par de símbolos X , B não pode estar associado por
      nenhuma das relações de Wirth-Weber




                                                    I NTRODUÇÃO À COMPILAÇÃO
Relações de Wirth-Weber
Gramática de expressões




     E    →    E +M       1
     E    →    M          2
     M    →    M ×P       3
     M    →    P          4
     P    →    (E)        5
     P    →    v          6




                              I NTRODUÇÃO À COMPILAÇÃO
Conjuntos DIR e ESQ
Gramática de expressões




      ESQ(E) = {E, M, P, (, v }   DIR(E) = {M, P, ), v }
      ESQ(M) = {M, P, (, v }      DIR(M) = {P, ), v }
      ESQ(P) = {(, v }            DIR(P) = {), v }




                                              I NTRODUÇÃO À COMPILAÇÃO
Tabela das relações de Wirth-Weber
Gramática de expressões




                          E   M   P   +   ×   (   )   v
                E                     ≈           ≈
                M                         ≈
                P
                +             ≈
                ×                 ≈
                (     ≈
                )
                v




                                                          I NTRODUÇÃO À COMPILAÇÃO
Construção da tabela de deslocamento e redução



      Analisador utiliza uma tabela para decidir que ação tomar
      durante o reconhecimento de uma sentença
         deslocar realizar a leitura do próximo símbolo da
                   sentença
           reduzir substituir, na forma sentencial, símbolo(s)
                   corrente(s) pelo lado esquerdo de uma
                   produção
      Construção da Tabela DR pela análise de relações obtidas
      pela análise das produções da gramática




                                                     I NTRODUÇÃO À COMPILAÇÃO
Tabela DR



     Duas regras adicionais são consideradas para obter
     relações que envolvem o símbolo delimitador de sentença,
      $ e o símbolo sentencial S:
            $   X para cada símbolo X ∈ ESQ(S)
         X      $ para cada símbolo X ∈ DIR(S)
     Para um símbolo qualquer X e um símbolo terminal t:
         X      t ou X ≈ t: Deslocar (D)
         X      t: Reduzir (R)




                                                   I NTRODUÇÃO À COMPILAÇÃO
Tabela DR para a gramática de expressões
Relações adicionais




    ESQ(E) = {E, M, P, (, v }
                                DIR(E) = {M, P, ), v }
                      $   E
                                       M     $
                      $   M
                                        P    $
                      $   P
                                        )    $
                      $   (
                                        v    $
                      $   v



                                             I NTRODUÇÃO À COMPILAÇÃO
Tabela DR para a gramática de expressões


                   +   ×   (   )   v   $
               E   D           D
               M   R   D       R       R
               P   R   R       R       R
               +           D       D
               ×           D       D
               (           D       D
               )   R   R       R   R   R
               v   R   R       R   R   R
               $           D       D



                                           I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Estruturas auxiliares




     Como o analisador preditivo, trabalha com duas estruturas
     auxiliares:
          Pilha para a forma sentencial, inicialmente apenas com o
          delimitador de sentença $
          Lista com os símbolos da sentença, com o delimitador $
          ao final




                                                         I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Procedimento




    Analisador verifica topo da pilha (linha na tabela DR) e próximo
    símbolo da sentença (coluna na tabela DR) para decidir qual
    próxima ação
               D Empilha o próximo símbolo da sentença
               R Os símbolos no topo da pilha correspondem ao
                 lado direito de alguma produção, substituir pelo
                 correspondente lado esquerdo
    Se não houver ação D ou R na linha e coluna indicada, então
    há uma situação de erro.




                                                         I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (1): Estado inicial




     Para reconhecer sentença v + v × v da gramática de
     expressões, o estado inicial é:


                Pilha            Lista de tokens
                                   v   +v × v $
                   $




                                                      I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (2)




    Para [ $ , v ], ação indicada é deslocar:


    Pilha      Lista de tokens           Árvore sintática
                +    v × v $                         v
      v
      $




                                                            I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (3)




    Para [v , +], ação indicada é reduzir (P → v ):


    Pilha      Lista de tokens           Árvore sintática
                +    v × v $                      P
      P
      $                                           v




                                                            I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (4)




    Para [P, +], reduzir (M → P):


    Pilha     Lista de tokens       Árvore sintática
               +    v × v $                 M
     M
      $                                     P

                                            v




                                                       I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (5)




    Para [M, +], reduzir (E → M):


    Pilha     Lista de tokens       Árvore sintática
               +   v × v $                  E
     E
      $                                     M

                                            P

                                            v



                                                       I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (6)




    Para [E, +], deslocar:


    Pilha      Lista de tokens   Árvore sintática
                v   ×v $                   E   +
     +
     E                                     M
      $
                                           P

                                           v



                                                    I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (7)




    Para [+, v ], deslocar:


    Pilha      Lista de tokens   Árvore sintática
                 ×   v $                 E   +      v
     v
     +                                   M
     E
                                         P
      $
                                         v



                                                    I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (8)




    Para [v , ×], reduzir (P → v ):


    Pilha      Lista de tokens        Árvore sintática
                 ×   v $                      E   +      P
     P
     +                                        M          v
     E
                                              P
      $
                                              v



                                                         I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (9)




    Para [P, ×], reduzir (M → P):


    Pilha     Lista de tokens       Árvore sintática
               ×    v $                     E   +      M
     M
     +                                      M          P
     E
                                            P          v
      $
                                            v



                                                       I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (10)




    Para [M, ×], deslocar:


    Pilha      Lista de tokens   Árvore sintática
                v   $                  E   +   M       ×
     ×
     M                                 M       P
     +
     E                                 P       v
      $
                                       v



                                                    I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (11)



    Para [×, v ], deslocar:


    Pilha      Lista de tokens   Árvore sintática
                 $                   E   +   M      ×      v
     v
     ×                               M       P
     M
     +                               P        v
     E
                                     v
      $



                                                    I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (12)



    Para [v , $ ], reduzir (P → v ):


    Pilha      Lista de tokens         Árvore sintática
                  $                        E   +   M      ×      P
     P
     ×                                     M       P             v
     M
     +                                     P       v
     E
                                           v
      $



                                                          I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (13)




    Para [P, $ ], reduzir (M → M × P):


    Pilha      Lista de tokens           Árvore sintática
                $                            E   +          M
     M
     +                                       M       M      ×      P
     E
                                             P       P             v
      $
                                             v       v



                                                            I NTRODUÇÃO À COMPILAÇÃO
Reconhecimento de sentença
Exemplo (14)


    Para [M, $ ], reduzir (E → E + M):

  Pilha        Lista de tokens      Árvore sintática
                $                              E
    E
    $
                                         E     +        M

    Condição de aceitação                M         M     ×     P
    Todos os tokens
    consumidos e apenas                  P         P            v
    símbolo sentencial na
    pilha                                v         v


                                                       I NTRODUÇÃO À COMPILAÇÃO
Analisador de deslocamento e redução




      Construção ascendente da árvore sintática
      Para construção de uma tabela DR sem conflitos (duas
      possíveis ações numa mesma linha e coluna), gramática
      deve ser uma gramática de operadores
          Nenhuma produção com dois símbolos não-terminais
          juntos no lado direito
          Nenhuma produção com ε do lado direito




                                                     I NTRODUÇÃO À COMPILAÇÃO
Analisador de deslocamento e redução



      É um analisador LR(1)
           L Varredura da sentença da esquerda para a direita
             (Left to right)
           R Derivação canônica mais à direita é utilizada para
             o reconhecimento (Rightmost derivation)
          (1) Um símbolo da sentença analisado por vez para
              decidir a ação a ser tomada




                                                     I NTRODUÇÃO À COMPILAÇÃO
Geradores de analisadores sintáticos




      Como para análise léxica, procedimentos para construção
      dos analisadores léxicos são sistemáticos
      Podem ser automatizados
      Papel das ferramentas para gerar analisadores sintáticos
          Operam conjuntamente com analisadores léxicos




                                                     I NTRODUÇÃO À COMPILAÇÃO
Gerador de analisador sintático
Yacc




       Yet Another Compiler-Compiler
           Programa original do ambiente Unix, desenvolvido para
           trabalhar juntamente com o lex
           Gera uma função C que implementa um analisador
           sintático LR(1) a partir de uma especificação de gramática
           Como lex, deu origem a vários programas similares
               Outras implemetações e outras linguagens




                                                          I NTRODUÇÃO À COMPILAÇÃO
Especificação do analisador
Formato yacc




    Como arquivo lex, três seções separadas por %%:
      1. Definições e declarações
      2. Regras da gramática e ações associadas
      3. Código complementar




                                                      I NTRODUÇÃO À COMPILAÇÃO
Especificação da gramática



  Notação estilo BNF:
  símbolo     :      expansão      ;

     símbolo lado esquerdo da produção, um símbolo
             não-terminal
    expansão lado direito da produção, a expansão de símbolo
             em termos de outros símbolos, sejam eles
             terminais ou não-terminais (definidos em outra
             produção da gramática)




                                                   I NTRODUÇÃO À COMPILAÇÃO
Produções




     Símbolo sentencial: declaração %start
         Na ausência da declaração, lado esquerdo da primeira
         produção é considerado o símbolo sentencial
     Se produção é recursiva, recursão à esquerda é preferível
     Expansões alternativas podem ser separadas com o
     símbolo |




                                                      I NTRODUÇÃO À COMPILAÇÃO
Tokens




  Os símbolos terminais das produções podem ser
  representados de duas formas:
      nomes simbólicos, declarados com o comando %token,
      ou
      representação direta com notação de caracteres de C, se
      for um único caráter




                                                    I NTRODUÇÃO À COMPILAÇÃO
Tokens
Operadores



    Símbolos terminais para operadores podem usar, ao invés de
    token, declaração com associatividade explícita:
             %left operador com associatividade à esquerda
         %right operador com associatividade à direita
    %nonassoc operador não-associativo

    Estratégia para eliminar ambigüidade
        Operadores declarados na mesma linha têm mesma
        precedência
        Operadores declarados na última linha têm maior
        precedência


                                                         I NTRODUÇÃO À COMPILAÇÃO
Manipulação das sentenças reconhecidas
Ação semântica



         Código C cuja execução está associada à aplicação da
         produção
         Especificado entre chaves após a expansão da produção
         Pode referenciar o valor semântico de um token da
         expansão
             Notação posicional: $1 é o primeiro token, $2 o segundo. . .
             Para tokens, analisador léxico deve definir esse valor por
             meio da variável yylval
             Um valor semântico pode ser associado ao lado esquerdo
             ($$), para uso em outras expansões
             Tipo padrão do valor semântico é int, mas pode ser
             alterado com a redefinição da string YYSTYPE



                                                             I NTRODUÇÃO À COMPILAÇÃO
Tratamento de erros



        error símbolo não-terminal pré-definido que está
              associado a sentenças não reconhecidas pela
              gramática especificada
      yyerrok macro definida em C que limpa a entrada de
              caracteres para que a análise possa prosseguir
     yyerror() função definida pelo usuário, invocada pelo
               analisador para apresentação de mensagens de
               erro




                                                    I NTRODUÇÃO À COMPILAÇÃO
Desenvolvimento de uma aplicação




  A gramática de expressões (soma ou multiplicação) é usada
  neste exemplo como a semente para uma calculadora:
                        E   →    E +E
                        E   →    E ×E
                        E   →    (E)
                        E   →    v




                                                   I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Primeira seção: declarações C/C++ (1)


    %{
    #include <iostream>
    using namespace std;
        extern "C"
        {
                int yyparse(void);
                int yylex(void);
                int yywrap() {
                        return 1;
                }

        }
    void yyerror(char *);
    %}
                                        I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Primeira seção: declarações yacc (2)




    %start       entrada
    %token       VALOR FIMLIN
    %left        SOMA
    %left        MULT
    %token       ABRPAR FECPAR
    %%




                                       I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Segunda seção: produções e ações (3)




    expr :      expr SOMA expr     {   $$ = $1 + $3; }
         |      expr MULT expr     {   $$ = $1 * $3; }
         |      ABRPAR expr FECPAR      { $$ = $2; }
         |      VALOR
         ;




                                               I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Segunda seção: produções e ações (4)




    entrada : /* vazia */
            | entrada result
            ;
    result : FIMLIN
           | expr FIMLIN
              { cout << "Resposta: " << $1 << endl; }
           | error FIMLIN { yyerrok; }
           ;




                                          I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Terceira seção: código C (5)




    %%
    void yyerror(char* msg) {
       extern char* yytext;
       cout << msg << ": " << yytext << endl;
    }




                                          I NTRODUÇÃO À COMPILAÇÃO
Integração com lex



      Arquivo de cabeçalho produzido com opção -d
      Definições de valores para os nomes simbólicos
      associados aos tokens, declarados na primeira seção do
      arquivo de especificação de yacc (acumuly.y)
      Execução com bison (implementação Gnu de yacc)

  > bison -d acumuly.y




                                                    I NTRODUÇÃO À COMPILAÇÃO
Integração lex-yacc


             Entrada sintaticamente correta?
    main()
                          yyparse()       Próximo token?
                 0: ok                                      Próximo caractere?
                 1: não                           yylex()
                                      token
                                                                   Arquivo de
                                                                   entrada

                                yylval
                                         yytext

                               yyin
                                      yyout
                              Variáveis globais




                                                                     I NTRODUÇÃO À COMPILAÇÃO
Integração com lex
Exemplo: arquivo acumuly.l (6)


    %{
    #include "acumuly.tab.h"
    extern YYSTYPE yylval;
    %}
    %%
    [0-9]+ { yylval = atoi(yytext);
              return VALOR;
           }
    +     { return SOMA; }
    *     { return MULT; }
    (     { return ABRPAR; }
    )     { return FECPAR; }
    n     { return FIMLIN; }
    %%
                                      I NTRODUÇÃO À COMPILAÇÃO
Geração da aplicação




     Analisador léxico é um programa C, produzido com flex
     > flex acumuly.l
     > gcc -c lex.yy.c
     Compilação do analisador sintático
     > g++ -o acc lex.yy.o acumuly.tab.c -ly -lfl




                                                 I NTRODUÇÃO À COMPILAÇÃO
Exemplo
Execução (7)




    > ./acc
    1+2+4*5
    Resposta: 23
    2+2
    Resposta: 4
    1=2+3+4
    =syntax error: 2
    1+2
    Resposta: 3
    [^d]
    >



                       I NTRODUÇÃO À COMPILAÇÃO
Sugestões de leitura (Web)




      Bison: Gnu parser generator
      http://www.gnu.org/software/bison/




                                           I NTRODUÇÃO À COMPILAÇÃO

More Related Content

What's hot

Hormonios vegetal
Hormonios vegetalHormonios vegetal
Hormonios vegetalURCA
 
Tabela de identidades trigonometricas
Tabela de identidades trigonometricasTabela de identidades trigonometricas
Tabela de identidades trigonometricasSixto Guterres
 
Morfologia vegetal da inflorescência
Morfologia vegetal da inflorescênciaMorfologia vegetal da inflorescência
Morfologia vegetal da inflorescênciaJoseanny Pereira
 
Revisão em -funções - calculo 1
Revisão   em -funções - calculo 1Revisão   em -funções - calculo 1
Revisão em -funções - calculo 1Eduardo Soares
 
Serie trigonometrica e exponencial de fourier
Serie trigonometrica e exponencial de fourierSerie trigonometrica e exponencial de fourier
Serie trigonometrica e exponencial de fourierWigor Almeida
 
18 series de taylor e de maclaurin
18 series de taylor e de maclaurin18 series de taylor e de maclaurin
18 series de taylor e de maclaurinGabriela Cristina
 
Classificação das equações do 1º grau com uma
Classificação das equações do 1º grau com umaClassificação das equações do 1º grau com uma
Classificação das equações do 1º grau com umaAlexandre Cirqueira
 
Frutos e sementes
Frutos e sementesFrutos e sementes
Frutos e sementesUERGS
 
Calculo vetorial
Calculo vetorialCalculo vetorial
Calculo vetorialtooonks
 
Geometria analítica II
Geometria analítica IIGeometria analítica II
Geometria analítica IIEverton Moraes
 
Tabela de identidades trigonometricas
Tabela de identidades trigonometricasTabela de identidades trigonometricas
Tabela de identidades trigonometricasRodrigo Sócrate
 
Fórmulas e nomenclaturas de matemática financeira
Fórmulas e nomenclaturas de matemática financeiraFórmulas e nomenclaturas de matemática financeira
Fórmulas e nomenclaturas de matemática financeiramarioferreiraneto
 
Aula nomenclatura botânica
Aula nomenclatura botânicaAula nomenclatura botânica
Aula nomenclatura botânicaMaria Betânia
 
Cálculo diferencial e integral de várias variáveis unid iii
Cálculo diferencial e integral de várias variáveis   unid iiiCálculo diferencial e integral de várias variáveis   unid iii
Cálculo diferencial e integral de várias variáveis unid iiiBruno Luz
 

What's hot (20)

Hormonios vegetal
Hormonios vegetalHormonios vegetal
Hormonios vegetal
 
Tabela de Integrais
Tabela de  IntegraisTabela de  Integrais
Tabela de Integrais
 
Tabela de identidades trigonometricas
Tabela de identidades trigonometricasTabela de identidades trigonometricas
Tabela de identidades trigonometricas
 
Morfologia vegetal da inflorescência
Morfologia vegetal da inflorescênciaMorfologia vegetal da inflorescência
Morfologia vegetal da inflorescência
 
Revisão em -funções - calculo 1
Revisão   em -funções - calculo 1Revisão   em -funções - calculo 1
Revisão em -funções - calculo 1
 
Serie trigonometrica e exponencial de fourier
Serie trigonometrica e exponencial de fourierSerie trigonometrica e exponencial de fourier
Serie trigonometrica e exponencial de fourier
 
18 series de taylor e de maclaurin
18 series de taylor e de maclaurin18 series de taylor e de maclaurin
18 series de taylor e de maclaurin
 
[David halliday; robert_resnick;_jearl_walker]_fun(book_zz.org)
[David halliday; robert_resnick;_jearl_walker]_fun(book_zz.org)[David halliday; robert_resnick;_jearl_walker]_fun(book_zz.org)
[David halliday; robert_resnick;_jearl_walker]_fun(book_zz.org)
 
Classificação das equações do 1º grau com uma
Classificação das equações do 1º grau com umaClassificação das equações do 1º grau com uma
Classificação das equações do 1º grau com uma
 
Lista de derivadas matematica
Lista de derivadas matematicaLista de derivadas matematica
Lista de derivadas matematica
 
Frutos e sementes
Frutos e sementesFrutos e sementes
Frutos e sementes
 
Calculo vetorial
Calculo vetorialCalculo vetorial
Calculo vetorial
 
Geometria analítica II
Geometria analítica IIGeometria analítica II
Geometria analítica II
 
Tabela derivadas e integrais
Tabela derivadas e integraisTabela derivadas e integrais
Tabela derivadas e integrais
 
Tabela de identidades trigonometricas
Tabela de identidades trigonometricasTabela de identidades trigonometricas
Tabela de identidades trigonometricas
 
Fórmulas e nomenclaturas de matemática financeira
Fórmulas e nomenclaturas de matemática financeiraFórmulas e nomenclaturas de matemática financeira
Fórmulas e nomenclaturas de matemática financeira
 
Aula nomenclatura botânica
Aula nomenclatura botânicaAula nomenclatura botânica
Aula nomenclatura botânica
 
Função
FunçãoFunção
Função
 
Fruto
FrutoFruto
Fruto
 
Cálculo diferencial e integral de várias variáveis unid iii
Cálculo diferencial e integral de várias variáveis   unid iiiCálculo diferencial e integral de várias variáveis   unid iii
Cálculo diferencial e integral de várias variáveis unid iii
 

Viewers also liked

Como Construir um Compilador cap-1
Como Construir um Compilador cap-1Como Construir um Compilador cap-1
Como Construir um Compilador cap-1Maellson Marques
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresAnderson Favaro
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadoresLCCIMETRO
 
Uma DSL para declarar a Ordem de Execução de Aspectos
Uma DSL para declarar a Ordem de Execução de AspectosUma DSL para declarar a Ordem de Execução de Aspectos
Uma DSL para declarar a Ordem de Execução de AspectosGPrimola
 
Trabalho de Inteligencia Artificial
Trabalho de Inteligencia ArtificialTrabalho de Inteligencia Artificial
Trabalho de Inteligencia Artificialnohs4
 
Compilador analise lexica
Compilador analise lexicaCompilador analise lexica
Compilador analise lexicaAdilmar Dantas
 
Inteligência Artificial - Inferência Ascendente e Descendente
Inteligência Artificial - Inferência Ascendente e DescendenteInteligência Artificial - Inferência Ascendente e Descendente
Inteligência Artificial - Inferência Ascendente e DescendenteAldisio Medeiros
 
Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C Aldisio Medeiros
 
Teoria Lista Exercicios 1.0
Teoria Lista Exercicios 1.0Teoria Lista Exercicios 1.0
Teoria Lista Exercicios 1.0Thayse
 
Analise sintatica
Analise sintaticaAnalise sintatica
Analise sintaticaRebeca Kaus
 
Python - Guia de bolso
Python - Guia de bolsoPython - Guia de bolso
Python - Guia de bolsoJean Lopes
 
Python para iniciantes
Python para iniciantesPython para iniciantes
Python para iniciantesrichardsonlima
 
Inteligência Artificial
Inteligência ArtificialInteligência Artificial
Inteligência ArtificialNEO Empresarial
 
Análise sintática
Análise sintáticaAnálise sintática
Análise sintáticaKarla Costa
 
The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...
The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...
The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...Capgemini
 

Viewers also liked (18)

Análise sintática
Análise sintáticaAnálise sintática
Análise sintática
 
Como Construir um Compilador cap-1
Como Construir um Compilador cap-1Como Construir um Compilador cap-1
Como Construir um Compilador cap-1
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - Compiladores
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadores
 
Uma DSL para declarar a Ordem de Execução de Aspectos
Uma DSL para declarar a Ordem de Execução de AspectosUma DSL para declarar a Ordem de Execução de Aspectos
Uma DSL para declarar a Ordem de Execução de Aspectos
 
Trabalho de Inteligencia Artificial
Trabalho de Inteligencia ArtificialTrabalho de Inteligencia Artificial
Trabalho de Inteligencia Artificial
 
Compilador analise lexica
Compilador analise lexicaCompilador analise lexica
Compilador analise lexica
 
Gcc
GccGcc
Gcc
 
Inteligência Artificial - Inferência Ascendente e Descendente
Inteligência Artificial - Inferência Ascendente e DescendenteInteligência Artificial - Inferência Ascendente e Descendente
Inteligência Artificial - Inferência Ascendente e Descendente
 
Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C
 
Teoria Lista Exercicios 1.0
Teoria Lista Exercicios 1.0Teoria Lista Exercicios 1.0
Teoria Lista Exercicios 1.0
 
Analise sintatica
Analise sintaticaAnalise sintatica
Analise sintatica
 
Python - Guia de bolso
Python - Guia de bolsoPython - Guia de bolso
Python - Guia de bolso
 
Apostila C++
Apostila C++ Apostila C++
Apostila C++
 
Python para iniciantes
Python para iniciantesPython para iniciantes
Python para iniciantes
 
Inteligência Artificial
Inteligência ArtificialInteligência Artificial
Inteligência Artificial
 
Análise sintática
Análise sintáticaAnálise sintática
Análise sintática
 
The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...
The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...
The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...
 

More from Ivan Ricarte

Aula catalogo de refatoracoes
Aula   catalogo de refatoracoesAula   catalogo de refatoracoes
Aula catalogo de refatoracoesIvan Ricarte
 
Testes de unidade em Java: JUnit
Testes de unidade em Java: JUnitTestes de unidade em Java: JUnit
Testes de unidade em Java: JUnitIvan Ricarte
 
Refatoração: Code smells
Refatoração: Code smellsRefatoração: Code smells
Refatoração: Code smellsIvan Ricarte
 
Aplicacoes web semantica saude
Aplicacoes web semantica saudeAplicacoes web semantica saude
Aplicacoes web semantica saudeIvan Ricarte
 
R - Software Estatistico
R - Software EstatisticoR - Software Estatistico
R - Software EstatisticoIvan Ricarte
 
Aula revisão de java e junit
Aula   revisão de java e junitAula   revisão de java e junit
Aula revisão de java e junitIvan Ricarte
 
Introducao a refatoracao
Introducao a refatoracaoIntroducao a refatoracao
Introducao a refatoracaoIvan Ricarte
 
C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1Ivan Ricarte
 
Membros de classes C++
Membros de classes C++Membros de classes C++
Membros de classes C++Ivan Ricarte
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Ivan Ricarte
 
Problemas no desenvolvimento do software
Problemas no desenvolvimento do softwareProblemas no desenvolvimento do software
Problemas no desenvolvimento do softwareIvan Ricarte
 
Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Ivan Ricarte
 
SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)Ivan Ricarte
 
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeO Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeIvan Ricarte
 

More from Ivan Ricarte (20)

Aula catalogo de refatoracoes
Aula   catalogo de refatoracoesAula   catalogo de refatoracoes
Aula catalogo de refatoracoes
 
Testes de unidade em Java: JUnit
Testes de unidade em Java: JUnitTestes de unidade em Java: JUnit
Testes de unidade em Java: JUnit
 
Refatoração: Code smells
Refatoração: Code smellsRefatoração: Code smells
Refatoração: Code smells
 
Aplicacoes web semantica saude
Aplicacoes web semantica saudeAplicacoes web semantica saude
Aplicacoes web semantica saude
 
R - Software Estatistico
R - Software EstatisticoR - Software Estatistico
R - Software Estatistico
 
Aula UML e Java
Aula UML e JavaAula UML e Java
Aula UML e Java
 
Aula revisão de java e junit
Aula   revisão de java e junitAula   revisão de java e junit
Aula revisão de java e junit
 
Introducao a refatoracao
Introducao a refatoracaoIntroducao a refatoracao
Introducao a refatoracao
 
C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1
 
c++ construtores
c++ construtoresc++ construtores
c++ construtores
 
Padroes
PadroesPadroes
Padroes
 
C++ Sobrecarga
C++ SobrecargaC++ Sobrecarga
C++ Sobrecarga
 
Membros de classes C++
Membros de classes C++Membros de classes C++
Membros de classes C++
 
UML e POO
UML e POOUML e POO
UML e POO
 
Antipadroes
AntipadroesAntipadroes
Antipadroes
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++
 
Problemas no desenvolvimento do software
Problemas no desenvolvimento do softwareProblemas no desenvolvimento do software
Problemas no desenvolvimento do software
 
Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)
 
SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)
 
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeO Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
 

Análise Sintática e Compilação

  • 1. Análise sintática Ivan Ricarte 2008 I NTRODUÇÃO À COMPILAÇÃO
  • 2. Sumário Reconhecimento de sentenças Derivações canônicas Árvores sintáticas Gramáticas ambíguas Analisadores sintáticos Autômato de pilha Analisador sintático preditivo Analisador de precedência fraca Geradores de analisadores sintáticos Especificação da gramática Manipulação das sentenças reconhecidas Desenvolvimento de uma aplicação I NTRODUÇÃO À COMPILAÇÃO
  • 3. Análise sintática Arquivo de análise Arquivo de ... síntese destino origem léxica análise sintática análise Estruturas Gramáticas internas I NTRODUÇÃO À COMPILAÇÃO
  • 4. Reconhecimento de sentenças O reconhecimento de sentenças, ou parsing, é o procedimento que verifica se uma dada sentença pertence à linguagem gerada por uma gramática. Gramáticas tipo 2, ou gramáticas livres de contexto, são adequadas para representar boa parte das características de linguagens de programação. I NTRODUÇÃO À COMPILAÇÃO
  • 5. Validação de uma sentença Há duas formas de validar uma sentença: Top-down ou descendente: a partir do símbolo sentencial, selecionar uma seqüência de aplicação de regras e aplicá-las, substituindo o lado esquerdo pelo lado direito, até que se obtenha a sentença sob análise; ou Bottom-up ou ascendente: a partir da sentença, selecionar uma seqüência de aplicação de regras e aplicá-las, substituindo o lado direito pelo lado esquerdo, até que reste apenas o símbolo sentencial. I NTRODUÇÃO À COMPILAÇÃO
  • 6. Reconhecimento de sentenças Exemplo: uma gramática para expressões Para reconhecer expressões (E): E → E +E 1 E → E ×E 2 E → (E) 3 E → v 4 A expressão (v + v ) × v faz parte dessa gramática? I NTRODUÇÃO À COMPILAÇÃO
  • 7. Estratégias de validação Há duas formas de responder a essa questão: Validação descendente A partir do símbolo sentencial E, procura aplicar produções da gramática substituindo o lado esquerdo pelo lado direito até que a sentença (v + v ) × v seja derivada Validação ascendente A partir da sentença (v + v ) × v , procura aplicar produções da gramática substituindo o lado direito pelo lado esquerdo até que reste apenas o símbolo sentencial E I NTRODUÇÃO À COMPILAÇÃO
  • 8. Validação descendente Produções Derivações E → E +E 1 E → E ×E 2 2 E =⇒ E × E E → (E) 3 3 E → v 4 =⇒ (E) × E 1 =⇒ (E + E) × E 4 =⇒ (v + E) × E 4 =⇒ (v + v ) × E 4 =⇒ (v + v ) × v Seqüência 2, 3, 1, 4, 4, 4 I NTRODUÇÃO À COMPILAÇÃO
  • 9. Validação descendente Outras seqüências de reconhecimento podem ser obtidas para essa mesma estratégia: 2, 3, 4, 1, 4, 4 2 3 4 E =⇒ E × E =⇒ (E) × E =⇒ (E) × v 1 4 4 =⇒ (E + E) × v =⇒ (E + v ) × v =⇒ (v + v ) × v 2, 4, 3, 1, 4, 4 2 4 3 E =⇒ E × E =⇒ E × v =⇒ (E) × v 1 4 4 =⇒ (E + E) × v =⇒ (E + v ) × v =⇒ (v + v ) × v I NTRODUÇÃO À COMPILAÇÃO
  • 10. Validação ascendente Produções Derivações E → E +E 1 E → E ×E 2 4 (v + v ) × v ⇐= (E + v ) × v E → (E) 3 4 E → v 4 ⇐= (E + E) × v 4 ⇐= (E + E) × E 1 ⇐= (E) × E 3 ⇐= E × E 2 ⇐= E Seqüência de reconhecimento 4, 4, 4, 1, 3, 2 Também há outras seqüências I NTRODUÇÃO À COMPILAÇÃO
  • 11. Derivações canônicas Forma sistemática de selecionar qual símbolo da forma sentencial será substituído na próxima derivação Duas formas Derivação canônica mais à esquerda (leftmost derivation) Derivação canônica mais à direita (rightmost derivation) Para uma derivação canônica, a seqüência de reconhecimento é única I NTRODUÇÃO À COMPILAÇÃO
  • 12. Derivações canônicas Derivação canônica mais à esquerda Derivação canônica mais à esquerda aplica uma produção da gramática para substituir o símbolo não-terminal mais à esquerda da forma sentencial A seqüência de produções aplicadas desde o símbolo sentencial até a sentença é denominada a seqüência de reconhecimento mais à esquerda, ou leftmost parse I NTRODUÇÃO À COMPILAÇÃO
  • 13. Derivações canônicas Derivação canônica mais à direita Derivação canônica mais à direita símbolo não-terminal mais à direita da forma sentencial é selecionado para ser substituído pela aplicação de uma produção da gramática A seqüência de reconhecimento mais à direita, ou rightmost parse, é dada pelo reverso da seqüência de produções associada à derivação É a seqüência de aplicação de produções para partir da sentença e alcançar o símbolo sentencial I NTRODUÇÃO À COMPILAÇÃO
  • 14. Derivações canônicas Exemplo Produções E → E +E 1 E → E ×E 2 E → (E) 3 E → v 4 Derivações canônicas para (v + v ) × v Seqüência de reconhecimento mais à esquerda: 2, 3, 1, 4, 4, 4 Seqüência de reconhecimento mais à direita: 4, 4, 1, 3, 4, 2 I NTRODUÇÃO À COMPILAÇÃO
  • 15. Árvores sintáticas Representação das derivações utilizadas no reconhecimento de uma sentença através de uma estrutura de árvore Em uma árvore sintática: 1. a raiz da árvore é um nó com o símbolo sentencial; 2. as folhas da árvore são símbolos terminais, na mesma seqüência em que estes ocorrem na sentença analisada; e 3. os nós intermediários da árvore correspondem a símbolos não terminais, onde um nó cujo rótulo é P com filhos s1 , s2 , . . . , sn pode ocorrer apenas se houver uma regra P → s1 s2 . . . sn na gramática. I NTRODUÇÃO À COMPILAÇÃO
  • 16. Árvores sintáticas Subárvores para a gramática de expressões E →E ×E E →E +E E E E × E E + E E →v E → (E) E ( E ) v I NTRODUÇÃO À COMPILAÇÃO
  • 17. Árvore sintática para (v + v ) × v E E × E v ( E ) E + E v v I NTRODUÇÃO À COMPILAÇÃO
  • 18. Árvores sintáticas Relação com derivações canônicas Estrutura da árvore sintática independe da seqüência de derivações utilizada para reconhecimento Uma derivação canônica está associada à estratégia utilizada para percorrer seqüencialmente os elementos da árvore pré-ordem raiz antes das folhas, folhas da esquerda para a direita seqüência de reconhecimento mais à esquerda pós-ordem folhas da esquerda para a direita, raiz depois das folhas seqüência de reconhecimento mais à direita I NTRODUÇÃO À COMPILAÇÃO
  • 19. Gramáticas ambíguas Gramática é ambígua se for possível obter, para uma sentença, mais de uma árvore sintática De modo equivalente, é ambígua se houver mais que uma seqüência de reconhecimento mais à direita Ou mais de uma seqüência de reconhecimento mais à esquerda Ou ainda, mais de uma derivação canônica mais à esquerda Ou mais de uma derivação canônica mais à direita I NTRODUÇÃO À COMPILAÇÃO
  • 20. Gramáticas ambíguas Exemplo Considere a sentença v + v × v em E → E +E 1 E → E ×E 2 E → (E) 3 E → v 4 I NTRODUÇÃO À COMPILAÇÃO
  • 21. Gramáticas ambíguas Exemplo: árvore 1 E E + E v E × E v v seqüência de reconhecimento mais à esquerda 1, 4, 2, 4, 4 seqüência de reconhecimento mais à direita 4, 4, 4, 2, 1 I NTRODUÇÃO À COMPILAÇÃO
  • 22. Gramáticas ambíguas Exemplo: árvore 2 E E × E E + E v v v seqüência de reconhecimento mais à esquerda 2, 1, 4, 4, 4 seqüência de reconhecimento mais à direita 4, 4, 1, 4, 2 I NTRODUÇÃO À COMPILAÇÃO
  • 23. Versão não-ambígua da gramática de expressões E → E +M 1 E → M 2 M → M ×P 3 M → P 4 P → (E) 5 P → v 6 I NTRODUÇÃO À COMPILAÇÃO
  • 24. Mesma sentença, na gramática revista Única interpretação possível para v + v × v Por exemplo, para o reconhecimento descendente: E 1 2 E ⇒E +M ⇒M +M 4 6 E + M ⇒P +M ⇒v +M 3 4 M M × P ⇒v +M ×P ⇒v +P ×P 6 6 ⇒v +v ×P ⇒v +v ×v P P v v v I NTRODUÇÃO À COMPILAÇÃO
  • 25. Analisadores sintáticos Programas que reconhecem automaticamente sentenças de uma dada gramática livre de contexto Como para analisadores léxicos, um autômato é uma representação abstrata para o analisador No entanto, para o analisador sintático o autômato precisa de uma memória auxiliar: Pilha estrutura linear com política de acesso LIFO (Last In, First Out) I NTRODUÇÃO À COMPILAÇÃO
  • 26. Autômato de pilha Definição formal Sêxtupla M = (K , Σ, Γ, δ, s, F ), na qual os elementos são: 1. o conjunto finito de estados, K ; 2. o alfabeto de entrada finito, Σ; 3. o alfabeto de pilha finito, Γ; 4. a função de transição, δ : K × Σ × Γ → K × Γ; 5. o estado inicial, s, s ∈ K ; e 6. o conjunto de estados finais, F , com F ⊆ K . I NTRODUÇÃO À COMPILAÇÃO
  • 27. Analisadores sintáticos Analisadores utilizam o autômato de pilha para reconhecer sentenças de uma linguagem livre de contexto Podem usar a técnica de construção descendente ou ascendente Descendente Pilha começa com símbolo sentencial Ascendente Pilha começa vazia Exemplos de analisadores Analisador sintático preditivo construção descendente Analisador de precedência fraca construção ascendente I NTRODUÇÃO À COMPILAÇÃO
  • 28. Analisador sintático preditivo Analisador apropriado para gramáticas LL(1) Varredura da sentença ocorre da esquerda para a direita (Left-to-right) Derivação canônica mais à esquerda (Leftmost derivation) Um único símbolo da sentença (lookahead) analisado a cada passo I NTRODUÇÃO À COMPILAÇÃO
  • 29. Analisador sintático preditivo Gramáticas LL(1) Gramática com produções A → α e A → β é LL(1) se: 1. α e β não iniciam com o mesmo símbolo terminal Ou com símbolos não-terminais cujas expansões iniciem com o mesmo símbolo terminal 2. Só α ou só β tem expansões que levam à string vazia 3. Se α leva à string vazia, β não inicia expansão com símbolo terminal que possa ocorrer imediatamente à direita de A I NTRODUÇÃO À COMPILAÇÃO
  • 30. Analisador sintático preditivo Conversão de produções recursivas Técnica de construção descendente não pode ser aplicada a gramáticas com produções recursivas à esquerda Se houver produção dessa forma, é necessário convertê-la: Para De A→δA A→Aβ A →βA A→δ A →ε I NTRODUÇÃO À COMPILAÇÃO
  • 31. Construção do analisador sintático preditivo Uma tabela sintática representa as operações possíveis para o autômato associado ao analisador Construção dessa tabela é feita pela análise de cada produção Para cada par símbolo não-terminal, símbolo terminal, a tabela indica qual produção deve ser aplicada, se possível Símbolo terminal é o próximo símbolo da sentença Símbolo não-terminal é o símbolo no topo da pilha Além dos símbolos terminais, um delimitador de sentença (denotado aqui por $ ) é uma entrada reconhecida pela tabela I NTRODUÇÃO À COMPILAÇÃO
  • 32. Construção da tabela sintática Para cada produção A → B na gramática, Insira a produção na tabela sintática na linha A, coluna t, para cada símbolo terminal t que pode iniciar a expansão de B Se B = ε, então insira a produção na tabela sintática na linha A, coluna t para cada símbolo terminal t que pode ocorrer à direita de A, sendo que: O delimitador $ pode estar à direita do símbolo sentencial; t pode ser um símbolo terminal que inicia a expansão de um símbolo não-terminal que ocorre à direita de A em alguma produção Para cada produção na forma A → . . . B, os símbolos que podem ocorrer à direita de A também podem ocorrer à direita de B I NTRODUÇÃO À COMPILAÇÃO
  • 33. Construção da tabela sintática Exemplo Considere a construção do analisador sintático preditivo para a seguinte gramática de expressões: Gramática original E → E +M 1 E → M 2 M → M ×P 3 M → P 4 P → (E) 5 P → v 6 I NTRODUÇÃO À COMPILAÇÃO
  • 34. Construção da tabela sintática Conversão da gramática Inicialmente, é preciso eliminar das produções da gramática qualquer recursão à esquerda: Gramática equivalente sem recursão à esquerda E → ME (1) E → +ME (2) E →ε (3) M → PM (4) M → ×PM (5) M →ε (6) P → (E) (7) P→v (8) I NTRODUÇÃO À COMPILAÇÃO
  • 35. Construção da tabela sintática Análise das produções (1) A seguir, cada produção é analisada para obter as entradas na tabela: Produção 1: E → ME Os símbolos terminais que podem iniciar a expansão de E são aqueles que iniciam a expansão de M Por sua vez, M → PM — expansão de P Como P → (E) e P → v , os símbolos terminais que podem iniciar essa expansão são ( e v ... ( ... v ... E P1 P1 I NTRODUÇÃO À COMPILAÇÃO
  • 36. Construção da tabela sintática Análise das produções (2) Produção 2: E → +ME Um símbolo terminal pode iniciar a expansão de E por essa produção: + ... + ... ... ... E P2 I NTRODUÇÃO À COMPILAÇÃO
  • 37. Construção da tabela sintática Análise das produções (3) Produção 3: E → ε Não há expansão, a segunda regra deve ser usada Se A → ε, então insira a produção na tabela sintática na linha A, coluna t para cada símbolo terminal t que pode ocorrer à direita de A Pelas produções, não há nenhum símbolo que ocorra diretamente à direita de E Como E → ME , o que pode ocorrer à direita de E também pode indiretamente ocorrer à direita de E $ (E é o símbolo sentencial) e ) (pela produção P → (E)) ... ) ... $ ... E P3 P3 I NTRODUÇÃO À COMPILAÇÃO
  • 38. Construção da tabela sintática Análise das produções (4) Produção 4: M → PM Os símbolos terminais que podem iniciar a expansão de M são aqueles que iniciam a expansão de P Como P → (E) e P → v , os símbolos terminais que podem iniciar essa expansão são ( e v ... ( ... v ... M P4 P4 I NTRODUÇÃO À COMPILAÇÃO
  • 39. Construção da tabela sintática Análise das produções (5) Produção 5: M → ×PM Um símbolo terminal pode iniciar a expansão de M por essa produção: × ... × ... ... ... M P5 I NTRODUÇÃO À COMPILAÇÃO
  • 40. Construção da tabela sintática Análise das produções (6) Produção 6: M → ε Não há expansão, a segunda regra deve ser usada Pelas produções, não há nenhum símbolo que ocorra diretamente à direita de M Como M → PM , o que pode ocorrer à direita de M também pode indiretamente ocorrer à direita de M Pelas produções 1 e 2, E aparece à direita de M; a expansão de E pode iniciar com + Como E → ε pela produção 3, é preciso incluir também os símbolos que podem ocorrer à direita de E, pois E → ME : $ e) ... ) + $ ... M P6 P6 P6 I NTRODUÇÃO À COMPILAÇÃO
  • 41. Construção da tabela sintática Análise das produções (7) Produção 7: P → (E) Um símbolo terminal pode iniciar a expansão de P por essa produção: ( ... ( ... ... ... P P7 I NTRODUÇÃO À COMPILAÇÃO
  • 42. Construção da tabela sintática Análise das produções (8) Produção 8: P → v Um símbolo terminal pode iniciar a expansão de P por essa produção: v ... v ... ... ... P P8 I NTRODUÇÃO À COMPILAÇÃO
  • 43. Construção da tabela sintática Resultado Tabela sintática derivada das produções + × ( ) v $ E P1 P1 E P2 P3 P3 M P4 P4 M P6 P5 P6 P6 P P7 P8 I NTRODUÇÃO À COMPILAÇÃO
  • 44. Reconhecimento de sentenças O reconhecimento da sentença com o analisador preditivo utiliza duas estruturas auxiliares 1. Uma pilha com a forma sentencial resultante da aplicação das produções, inicialmente com o símbolo sentencial (precedido do delimitador de sentença, $ ) 2. Uma lista com os símbolos terminais que compõem a sentença, com o delimitador de sentença $ ao final Quando o topo da pilha e o início da sentença têm o mesmo símbolo, ambos são retirados Condição de reconhecimento ocorre quando a pilha de símbolos e a sentença tornam-se vazias I NTRODUÇÃO À COMPILAÇÃO
  • 45. Reconhecimento de sentenças Exemplo: sentença v + v × v (1) Estado inicial: Pilha Lista de tokens Árvore sintática v +v × v $ E E $ I NTRODUÇÃO À COMPILAÇÃO
  • 46. Reconhecimento de sentenças Exemplo: sentença v + v × v (2) Para [E, v ], tabela indica aplicação da produção 1: E → ME Pilha Lista de tokens Árvore sintática v +v × v $ E M E M E $ I NTRODUÇÃO À COMPILAÇÃO
  • 47. Reconhecimento de sentenças Exemplo: sentença v + v × v (3) Para [M, v ], tabela indica aplicação da produção 4: M → PM Pilha Lista de tokens Árvore sintática v +v × v $ E P M M E E P M $ I NTRODUÇÃO À COMPILAÇÃO
  • 48. Reconhecimento de sentenças Exemplo: sentença v + v × v (4) Para [P, v ], tabela indica aplicação da produção 8: P → v Pilha Lista de tokens Árvore sintática v +v × v $ E v M M E E P M $ v I NTRODUÇÃO À COMPILAÇÃO
  • 49. Reconhecimento de sentenças Exemplo: sentença v + v × v (5) Mesmo símbolo no topo da pilha e no início da lista: consumi-los Pilha Lista de tokens Árvore sintática + v ×v $ E M E M E $ P M v I NTRODUÇÃO À COMPILAÇÃO
  • 50. Reconhecimento de sentenças Exemplo: sentença v + v × v (6) Para [M , +], tabela indica aplicação da produção 6: M → ε Pilha Lista de tokens Árvore sintática + v ×v $ E E M E $ P M v ε I NTRODUÇÃO À COMPILAÇÃO
  • 51. Reconhecimento de sentenças Exemplo: sentença v + v × v (7) Para [E , +], produção 2: E → +ME Pilha Lista de tokens Árvore sintática + v ×v $ E + M M E E P M + M E $ v ε I NTRODUÇÃO À COMPILAÇÃO
  • 52. Reconhecimento de sentenças Exemplo: sentença v + v × v (8) Mesmo símbolo no topo da pilha e início da lista: consumi-los Pilha Lista de tokens Árvore sintática v ×v $ E M E M E $ P M + M E v ε I NTRODUÇÃO À COMPILAÇÃO
  • 53. Reconhecimento de sentenças Exemplo: sentença v + v × v (9) Para [M, v ], produção 4: M → PM Pilha Lista de tokens Árvore sintática v ×v $ E P M M E E $ P M + M E v ε P M I NTRODUÇÃO À COMPILAÇÃO
  • 54. Reconhecimento de sentenças Exemplo: sentença v + v × v (10) Para [P, v ], produção 8: P → v Pilha Lista de tokens Árvore sintática v ×v $ E v M M E E $ P M + M E v ε P M v I NTRODUÇÃO À COMPILAÇÃO
  • 55. Reconhecimento de sentenças Exemplo: sentença v + v × v (11) Mesmo símbolo no topo da pilha e início da lista: consumi-los Pilha Lista de tokens Árvore sintática × v $ E M E M E $ P M + M E v ε P M v I NTRODUÇÃO À COMPILAÇÃO
  • 56. Reconhecimento de sentenças Exemplo: sentença v + v × v (12) Para [M , ×], produção 5: M → ×PM Pilha Lista de tokens × v $ × P M E $ I NTRODUÇÃO À COMPILAÇÃO
  • 57. Reconhecimento de sentenças Exemplo: sentença v + v × v (13) Árvore sintática E M E P M v ε + M E P M v × P M I NTRODUÇÃO À COMPILAÇÃO
  • 58. Reconhecimento de sentenças Exemplo: sentença v + v × v (14) Mesmo símbolo no topo da pilha e início da lista: consumi-los Pilha Lista de tokens v $ P M E $ I NTRODUÇÃO À COMPILAÇÃO
  • 59. Reconhecimento de sentenças Exemplo: sentença v + v × v (15) Para [P, v ], produção 8: P → v Pilha Lista de tokens v $ v M E $ I NTRODUÇÃO À COMPILAÇÃO
  • 60. Reconhecimento de sentenças Exemplo: sentença v + v × v (16) Árvore sintática E M E P M v ε + M E P M v × P M v I NTRODUÇÃO À COMPILAÇÃO
  • 61. Reconhecimento de sentenças Exemplo: sentença v + v × v (17) Mesmo símbolo no topo da pilha e início da lista: consumi-los Pilha Lista de tokens $ M E $ I NTRODUÇÃO À COMPILAÇÃO
  • 62. Reconhecimento de sentenças Exemplo: sentença v + v × v (18) Para [M , $ ], produção 6: M → ε Pilha Lista de tokens $ E $ I NTRODUÇÃO À COMPILAÇÃO
  • 63. Reconhecimento de sentenças Exemplo: sentença v + v × v (19) Árvore sintática E M E P M v ε + M E P M v × P M v ε I NTRODUÇÃO À COMPILAÇÃO
  • 64. Reconhecimento de sentenças Exemplo: sentença v + v × v (20) Para [E , $ ], produção 3: E → ε Pilha Lista de tokens $ $ Condição de aceitação Símbolo delimitador de sentença $ no topo da pilha e no início da lista de tokens I NTRODUÇÃO À COMPILAÇÃO
  • 65. Reconhecimento de sentenças Exemplo: sentença v + v × v (21) Árvore sintática final E M E P M v ε + M E P M ε v × P M v ε I NTRODUÇÃO À COMPILAÇÃO
  • 66. Analisador sintático preditivo Construção da árvore sintática é descendente Começa com o símbolo sentencial (conteúdo inicial da pilha) Cada vez que uma produção é selecionada para aplicação, o nó não terminal mais à esquerda da árvore é expandido em uma subárvore com o lado direito da produção Quando símbolo mais à esquerda da árvore é terminal, se for igual ao próximo símbolo da sentença há continuidade I NTRODUÇÃO À COMPILAÇÃO
  • 67. Analisador de precedência fraca Analisador baseado na técnica de construção ascendente Sentença é reconhecida quanto todos os símbolos da sentença são lidos e na forma sentencial resta apenas o símbolo sentencial Corresponde à criação da árvore sintática das folhas para a raiz Sentença reconhecida quando todos os símbolos da sentença estão associados às folhas da árvore sintática e a raiz é o símbolo sentencial I NTRODUÇÃO À COMPILAÇÃO
  • 68. Gramáticas de precedência fraca A gramática deve ser de precedência fraca para que o correspondente analisador de precedência fraca seja determinístico Sem produções com string vazia no lado direito Unicamente inversível (sem duas produções com mesmo lado direito) Livre de ciclos Se X Y ou X ≈ Y , então X Y não ocorre Que relações são estas? I NTRODUÇÃO À COMPILAÇÃO
  • 69. Relações de Wirth-Weber 1. X ≈ Y se existe pelo menos uma produção em G cujo lado direito tenha X imediatamente antes de Y , A → αXY β sendo α e β quaisquer strings em G. I NTRODUÇÃO À COMPILAÇÃO
  • 70. Relações de Wirth-Weber 2. X Y se existe um símbolo não terminal Z ∈ VN tal que X ≈ Z e Y ∈ ESQ(Z ) Definição auxiliar + ESQ(X ) = {Y ∈ VT ∪ VN |X ⇒ Y α, para α ∈ (VT ∪ VN )∗} I NTRODUÇÃO À COMPILAÇÃO
  • 71. Relações de Wirth-Weber 3. X a, a ∈ VT , se uma das duas condições é verdadeira: Existe um símbolo não-terminal Z ∈ VN tal que Z ≈ a e X ∈ DIR(Z ) ou Existem símbolos não-terminais Z1 , Z2 ∈ VN tal que Z1 ≈ Z2 e X ∈ DIR(Z1 ) e a ∈ ESQ(Z2 ) Definição auxiliar + DIR(X ) = {Y ∈ VT ∪ VN |X ⇒ αY , para α ∈ (VT ∪ VN )∗} I NTRODUÇÃO À COMPILAÇÃO
  • 72. Condições para construção do analisador Além das já apresentadas: Se duas produções terminam com mesma seqüência de símbolos β A → αX β e B→β O par de símbolos X , B não pode estar associado por nenhuma das relações de Wirth-Weber I NTRODUÇÃO À COMPILAÇÃO
  • 73. Relações de Wirth-Weber Gramática de expressões E → E +M 1 E → M 2 M → M ×P 3 M → P 4 P → (E) 5 P → v 6 I NTRODUÇÃO À COMPILAÇÃO
  • 74. Conjuntos DIR e ESQ Gramática de expressões ESQ(E) = {E, M, P, (, v } DIR(E) = {M, P, ), v } ESQ(M) = {M, P, (, v } DIR(M) = {P, ), v } ESQ(P) = {(, v } DIR(P) = {), v } I NTRODUÇÃO À COMPILAÇÃO
  • 75. Tabela das relações de Wirth-Weber Gramática de expressões E M P + × ( ) v E ≈ ≈ M ≈ P + ≈ × ≈ ( ≈ ) v I NTRODUÇÃO À COMPILAÇÃO
  • 76. Construção da tabela de deslocamento e redução Analisador utiliza uma tabela para decidir que ação tomar durante o reconhecimento de uma sentença deslocar realizar a leitura do próximo símbolo da sentença reduzir substituir, na forma sentencial, símbolo(s) corrente(s) pelo lado esquerdo de uma produção Construção da Tabela DR pela análise de relações obtidas pela análise das produções da gramática I NTRODUÇÃO À COMPILAÇÃO
  • 77. Tabela DR Duas regras adicionais são consideradas para obter relações que envolvem o símbolo delimitador de sentença, $ e o símbolo sentencial S: $ X para cada símbolo X ∈ ESQ(S) X $ para cada símbolo X ∈ DIR(S) Para um símbolo qualquer X e um símbolo terminal t: X t ou X ≈ t: Deslocar (D) X t: Reduzir (R) I NTRODUÇÃO À COMPILAÇÃO
  • 78. Tabela DR para a gramática de expressões Relações adicionais ESQ(E) = {E, M, P, (, v } DIR(E) = {M, P, ), v } $ E M $ $ M P $ $ P ) $ $ ( v $ $ v I NTRODUÇÃO À COMPILAÇÃO
  • 79. Tabela DR para a gramática de expressões + × ( ) v $ E D D M R D R R P R R R R + D D × D D ( D D ) R R R R R v R R R R R $ D D I NTRODUÇÃO À COMPILAÇÃO
  • 80. Reconhecimento de sentença Estruturas auxiliares Como o analisador preditivo, trabalha com duas estruturas auxiliares: Pilha para a forma sentencial, inicialmente apenas com o delimitador de sentença $ Lista com os símbolos da sentença, com o delimitador $ ao final I NTRODUÇÃO À COMPILAÇÃO
  • 81. Reconhecimento de sentença Procedimento Analisador verifica topo da pilha (linha na tabela DR) e próximo símbolo da sentença (coluna na tabela DR) para decidir qual próxima ação D Empilha o próximo símbolo da sentença R Os símbolos no topo da pilha correspondem ao lado direito de alguma produção, substituir pelo correspondente lado esquerdo Se não houver ação D ou R na linha e coluna indicada, então há uma situação de erro. I NTRODUÇÃO À COMPILAÇÃO
  • 82. Reconhecimento de sentença Exemplo (1): Estado inicial Para reconhecer sentença v + v × v da gramática de expressões, o estado inicial é: Pilha Lista de tokens v +v × v $ $ I NTRODUÇÃO À COMPILAÇÃO
  • 83. Reconhecimento de sentença Exemplo (2) Para [ $ , v ], ação indicada é deslocar: Pilha Lista de tokens Árvore sintática + v × v $ v v $ I NTRODUÇÃO À COMPILAÇÃO
  • 84. Reconhecimento de sentença Exemplo (3) Para [v , +], ação indicada é reduzir (P → v ): Pilha Lista de tokens Árvore sintática + v × v $ P P $ v I NTRODUÇÃO À COMPILAÇÃO
  • 85. Reconhecimento de sentença Exemplo (4) Para [P, +], reduzir (M → P): Pilha Lista de tokens Árvore sintática + v × v $ M M $ P v I NTRODUÇÃO À COMPILAÇÃO
  • 86. Reconhecimento de sentença Exemplo (5) Para [M, +], reduzir (E → M): Pilha Lista de tokens Árvore sintática + v × v $ E E $ M P v I NTRODUÇÃO À COMPILAÇÃO
  • 87. Reconhecimento de sentença Exemplo (6) Para [E, +], deslocar: Pilha Lista de tokens Árvore sintática v ×v $ E + + E M $ P v I NTRODUÇÃO À COMPILAÇÃO
  • 88. Reconhecimento de sentença Exemplo (7) Para [+, v ], deslocar: Pilha Lista de tokens Árvore sintática × v $ E + v v + M E P $ v I NTRODUÇÃO À COMPILAÇÃO
  • 89. Reconhecimento de sentença Exemplo (8) Para [v , ×], reduzir (P → v ): Pilha Lista de tokens Árvore sintática × v $ E + P P + M v E P $ v I NTRODUÇÃO À COMPILAÇÃO
  • 90. Reconhecimento de sentença Exemplo (9) Para [P, ×], reduzir (M → P): Pilha Lista de tokens Árvore sintática × v $ E + M M + M P E P v $ v I NTRODUÇÃO À COMPILAÇÃO
  • 91. Reconhecimento de sentença Exemplo (10) Para [M, ×], deslocar: Pilha Lista de tokens Árvore sintática v $ E + M × × M M P + E P v $ v I NTRODUÇÃO À COMPILAÇÃO
  • 92. Reconhecimento de sentença Exemplo (11) Para [×, v ], deslocar: Pilha Lista de tokens Árvore sintática $ E + M × v v × M P M + P v E v $ I NTRODUÇÃO À COMPILAÇÃO
  • 93. Reconhecimento de sentença Exemplo (12) Para [v , $ ], reduzir (P → v ): Pilha Lista de tokens Árvore sintática $ E + M × P P × M P v M + P v E v $ I NTRODUÇÃO À COMPILAÇÃO
  • 94. Reconhecimento de sentença Exemplo (13) Para [P, $ ], reduzir (M → M × P): Pilha Lista de tokens Árvore sintática $ E + M M + M M × P E P P v $ v v I NTRODUÇÃO À COMPILAÇÃO
  • 95. Reconhecimento de sentença Exemplo (14) Para [M, $ ], reduzir (E → E + M): Pilha Lista de tokens Árvore sintática $ E E $ E + M Condição de aceitação M M × P Todos os tokens consumidos e apenas P P v símbolo sentencial na pilha v v I NTRODUÇÃO À COMPILAÇÃO
  • 96. Analisador de deslocamento e redução Construção ascendente da árvore sintática Para construção de uma tabela DR sem conflitos (duas possíveis ações numa mesma linha e coluna), gramática deve ser uma gramática de operadores Nenhuma produção com dois símbolos não-terminais juntos no lado direito Nenhuma produção com ε do lado direito I NTRODUÇÃO À COMPILAÇÃO
  • 97. Analisador de deslocamento e redução É um analisador LR(1) L Varredura da sentença da esquerda para a direita (Left to right) R Derivação canônica mais à direita é utilizada para o reconhecimento (Rightmost derivation) (1) Um símbolo da sentença analisado por vez para decidir a ação a ser tomada I NTRODUÇÃO À COMPILAÇÃO
  • 98. Geradores de analisadores sintáticos Como para análise léxica, procedimentos para construção dos analisadores léxicos são sistemáticos Podem ser automatizados Papel das ferramentas para gerar analisadores sintáticos Operam conjuntamente com analisadores léxicos I NTRODUÇÃO À COMPILAÇÃO
  • 99. Gerador de analisador sintático Yacc Yet Another Compiler-Compiler Programa original do ambiente Unix, desenvolvido para trabalhar juntamente com o lex Gera uma função C que implementa um analisador sintático LR(1) a partir de uma especificação de gramática Como lex, deu origem a vários programas similares Outras implemetações e outras linguagens I NTRODUÇÃO À COMPILAÇÃO
  • 100. Especificação do analisador Formato yacc Como arquivo lex, três seções separadas por %%: 1. Definições e declarações 2. Regras da gramática e ações associadas 3. Código complementar I NTRODUÇÃO À COMPILAÇÃO
  • 101. Especificação da gramática Notação estilo BNF: símbolo : expansão ; símbolo lado esquerdo da produção, um símbolo não-terminal expansão lado direito da produção, a expansão de símbolo em termos de outros símbolos, sejam eles terminais ou não-terminais (definidos em outra produção da gramática) I NTRODUÇÃO À COMPILAÇÃO
  • 102. Produções Símbolo sentencial: declaração %start Na ausência da declaração, lado esquerdo da primeira produção é considerado o símbolo sentencial Se produção é recursiva, recursão à esquerda é preferível Expansões alternativas podem ser separadas com o símbolo | I NTRODUÇÃO À COMPILAÇÃO
  • 103. Tokens Os símbolos terminais das produções podem ser representados de duas formas: nomes simbólicos, declarados com o comando %token, ou representação direta com notação de caracteres de C, se for um único caráter I NTRODUÇÃO À COMPILAÇÃO
  • 104. Tokens Operadores Símbolos terminais para operadores podem usar, ao invés de token, declaração com associatividade explícita: %left operador com associatividade à esquerda %right operador com associatividade à direita %nonassoc operador não-associativo Estratégia para eliminar ambigüidade Operadores declarados na mesma linha têm mesma precedência Operadores declarados na última linha têm maior precedência I NTRODUÇÃO À COMPILAÇÃO
  • 105. Manipulação das sentenças reconhecidas Ação semântica Código C cuja execução está associada à aplicação da produção Especificado entre chaves após a expansão da produção Pode referenciar o valor semântico de um token da expansão Notação posicional: $1 é o primeiro token, $2 o segundo. . . Para tokens, analisador léxico deve definir esse valor por meio da variável yylval Um valor semântico pode ser associado ao lado esquerdo ($$), para uso em outras expansões Tipo padrão do valor semântico é int, mas pode ser alterado com a redefinição da string YYSTYPE I NTRODUÇÃO À COMPILAÇÃO
  • 106. Tratamento de erros error símbolo não-terminal pré-definido que está associado a sentenças não reconhecidas pela gramática especificada yyerrok macro definida em C que limpa a entrada de caracteres para que a análise possa prosseguir yyerror() função definida pelo usuário, invocada pelo analisador para apresentação de mensagens de erro I NTRODUÇÃO À COMPILAÇÃO
  • 107. Desenvolvimento de uma aplicação A gramática de expressões (soma ou multiplicação) é usada neste exemplo como a semente para uma calculadora: E → E +E E → E ×E E → (E) E → v I NTRODUÇÃO À COMPILAÇÃO
  • 108. Exemplo Primeira seção: declarações C/C++ (1) %{ #include <iostream> using namespace std; extern "C" { int yyparse(void); int yylex(void); int yywrap() { return 1; } } void yyerror(char *); %} I NTRODUÇÃO À COMPILAÇÃO
  • 109. Exemplo Primeira seção: declarações yacc (2) %start entrada %token VALOR FIMLIN %left SOMA %left MULT %token ABRPAR FECPAR %% I NTRODUÇÃO À COMPILAÇÃO
  • 110. Exemplo Segunda seção: produções e ações (3) expr : expr SOMA expr { $$ = $1 + $3; } | expr MULT expr { $$ = $1 * $3; } | ABRPAR expr FECPAR { $$ = $2; } | VALOR ; I NTRODUÇÃO À COMPILAÇÃO
  • 111. Exemplo Segunda seção: produções e ações (4) entrada : /* vazia */ | entrada result ; result : FIMLIN | expr FIMLIN { cout << "Resposta: " << $1 << endl; } | error FIMLIN { yyerrok; } ; I NTRODUÇÃO À COMPILAÇÃO
  • 112. Exemplo Terceira seção: código C (5) %% void yyerror(char* msg) { extern char* yytext; cout << msg << ": " << yytext << endl; } I NTRODUÇÃO À COMPILAÇÃO
  • 113. Integração com lex Arquivo de cabeçalho produzido com opção -d Definições de valores para os nomes simbólicos associados aos tokens, declarados na primeira seção do arquivo de especificação de yacc (acumuly.y) Execução com bison (implementação Gnu de yacc) > bison -d acumuly.y I NTRODUÇÃO À COMPILAÇÃO
  • 114. Integração lex-yacc Entrada sintaticamente correta? main() yyparse() Próximo token? 0: ok Próximo caractere? 1: não yylex() token Arquivo de entrada yylval yytext yyin yyout Variáveis globais I NTRODUÇÃO À COMPILAÇÃO
  • 115. Integração com lex Exemplo: arquivo acumuly.l (6) %{ #include "acumuly.tab.h" extern YYSTYPE yylval; %} %% [0-9]+ { yylval = atoi(yytext); return VALOR; } + { return SOMA; } * { return MULT; } ( { return ABRPAR; } ) { return FECPAR; } n { return FIMLIN; } %% I NTRODUÇÃO À COMPILAÇÃO
  • 116. Geração da aplicação Analisador léxico é um programa C, produzido com flex > flex acumuly.l > gcc -c lex.yy.c Compilação do analisador sintático > g++ -o acc lex.yy.o acumuly.tab.c -ly -lfl I NTRODUÇÃO À COMPILAÇÃO
  • 117. Exemplo Execução (7) > ./acc 1+2+4*5 Resposta: 23 2+2 Resposta: 4 1=2+3+4 =syntax error: 2 1+2 Resposta: 3 [^d] > I NTRODUÇÃO À COMPILAÇÃO
  • 118. Sugestões de leitura (Web) Bison: Gnu parser generator http://www.gnu.org/software/bison/ I NTRODUÇÃO À COMPILAÇÃO