SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler offline
Análise semântica

    Ivan Ricarte


       2008




                    I NTRODUÇÃO À COMPILAÇÃO
Sumário



  Tabela de símbolos
     Aplicação
     Decoração de nomes
     Informação de escopo


  Heurísticas para a análise semântica
    Verificação de tipos
    Verificação de fluxo de controle
    Verificação de unicidade




                                         I NTRODUÇÃO À COMPILAÇÃO
Análise semântica


  Etapa da análise do código apoiada por heurísticas
      Difícil de ser formalizada por meio de gramáticas
      Associada a inter-relacionamentos entre partes distintas
      do código
  Atividades usuais da análise semântica: verificação de. . .
  declarações todas as variáveis usadas foram declaradas?
         tipos o tipo da variável é o correto para o operador?
  fluxo de controle o comando é válido nesse contexto?
    unicidade o identificador (variável, rótulo) é único no
              escopo?



                                                        I NTRODUÇÃO À COMPILAÇÃO
Análise semântica



   Arquivo de       análise            análise
                                                                          Arquivo de
                                                              síntese      destino
     origem          léxica          semântica


                          análise
                         sintática

                         análise


                                                 Estruturas
                Gramáticas                        internas




                                                                        I NTRODUÇÃO À COMPILAÇÃO
Tabela de símbolos




  Estrutura auxiliar utilizada para apoiar análise semântica
      Quais símbolos foram definidos?
      O que o símbolo representa?
      Qual escopo de validade do símbolo?




                                                        I NTRODUÇÃO À COMPILAÇÃO
Aplicação da tabela de símbolos
Variável foi declarada?




     #include <iostream>
     using namespace std;

     int main() {
     a = 10;
     cout << "Valor de a: " << a << endl;
     }

     Mensagem de erro
     ...cpp: In function ’int main()’:
     ...cpp:5: error: ’a’ was not declared in this scope


                                                           I NTRODUÇÃO À COMPILAÇÃO
Aplicação da tabela de símbolos
Tipo da variável está correto?


     #include <iostream>
     using namespace std;

     int main() {
     int a = 9;
     float b = 5;
     cout << "a%b: " << a%b << endl;
     }

     Mensagem de erro
     ...cpp: In function ’int main()’:
     ...cpp:7: error: invalid operands of types ’int’ and ’float’ to binary
     ’operator%’

                                                              I NTRODUÇÃO À COMPILAÇÃO
Aplicação da tabela de símbolos
Escopo da variável está correto?


    #include <iostream>
    using namespace std;
    int main() {
    int a = 9;
    void mostra();
    mostra();
    }
    void mostra() {
    cout << "a: " << a << endl;
    }

    Mensagem de erro
    ...cpp: In function ’void mostra()’:
    ...cpp:11: error: ’a’ was not declared in this scope
                                                           I NTRODUÇÃO À COMPILAÇÃO
Decoração de nomes

     Mecanismo usado pelo compilador para permitir que uma
     função tenha diferentes implementações para diferentes
     tipos de argumentos
     O nome armazenado na Tabela de Símbolos combina
     nome declarado pelo programador com um prefixo para
     identificar a decoração e com um sufixo para identificar os
     tipos dos argumentos

  Exemplos
             Declarado                  Decorado
             mostra()                  H_mostra_v
             mostra(int x)             H_mostra_i
             mostra(double y, int x)   H_mostra_di

                                                     I NTRODUÇÃO À COMPILAÇÃO
Decoração de nomes
Integração com objetos externos




         Como o mecanismo de decoração de nomes é particular
         de cada compilador, é preciso sinalizar quando uma
         aplicação integra código gerado por outros compiladores
         Por exemplo, integração entre C++ e C:
                extern "C"
                {
                        int yyparse(void);
                        int yylex(void);
                        ...
                }



                                                       I NTRODUÇÃO À COMPILAÇÃO
Informação de escopo

  Qual escopo de cada variável no seguinte fragmento?

  int a, b;
  ... // escopo 1
  void f() {
     float a, c;
     ... // escopo 2
  }
  ... // escopo 1
  void g() {
     int c, d;
  ... // escopo 3
  }



                                                   I NTRODUÇÃO À COMPILAÇÃO
Informação de escopo




  Estratégias para manter informação de escopo na tabela de
  símbolos:
  Múltiplas tabelas uma tabela de símbolos para cada escopo
  Pilha de tabelas a cada novo escopo, um novo fragmento de
               tabela é empilhado na tabela geral e
               desempilhado ao encerrar o escopo




                                                    I NTRODUÇÃO À COMPILAÇÃO
Heurísticas para a análise semântica



   Compilador realiza verificação estática de código
       Aquela que pode ser realizada pela análise do
       código-fonte
       Por meio da aplicação de heurísticas relacionando
       fragmentos do código
   Há situações nas quais problemas só podem ser detectados
   durante a execução do programa
       Dependem da verificação dinâmica do código




                                                       I NTRODUÇÃO À COMPILAÇÃO
Verificação de tipos



     Objetivo Verificar coerência entre declaração de variável e
              seu uso

   Exemplos de situações com erros em C++
      Operando real para operador %
      Conflito entre variável escalar e variável ponteiro
      Conflito na conversão de variável para outro tipo




                                                       I NTRODUÇÃO À COMPILAÇÃO
Verificação de fluxo de controle




     Objetivo Detectar se comandos que controlam o fluxo da
              execução são usados de forma correta

  Exemplos de situações com erros em C++
      Uso inadequado do comando break
      Uso inadequado do comando continue




                                                  I NTRODUÇÃO À COMPILAÇÃO
Verificação de unicidade



     Objetivo Detectar se identificadores são únicos dentro de
              um mesmo escopo

  Exemplos de situações com erros em C++
      Nome de variável duplicado
      Nome de função com mesma decoração resultante
      Rótulo duplicado




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




  Artigos na Wikipedia sobre
      Tabela de símbolos:
      http://en.wikipedia.org/wiki/Symbol_table
      Decoração de nomes:
      http://en.wikipedia.org/wiki/Name_mangling




                                         I NTRODUÇÃO À COMPILAÇÃO

Mais conteúdo relacionado

Mais procurados

Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhanyKaren Costa
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem cJefferson Bessa
 
Introdução ao c++
Introdução ao c++Introdução ao c++
Introdução ao c++Jonas Silva
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducaommind
 
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Kratos879
 
Aula01 introducao operacoes
Aula01   introducao operacoesAula01   introducao operacoes
Aula01 introducao operacoesYuri Passos
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cppRUI VIEIRA
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresAnderson Favaro
 

Mais procurados (20)

Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Introducao a LPC
Introducao a LPCIntroducao a LPC
Introducao a LPC
 
Linguagem C clecioamerico
Linguagem C clecioamericoLinguagem C clecioamerico
Linguagem C clecioamerico
 
Introdução a linguagem c karen lowhany
Introdução a linguagem c   karen lowhanyIntrodução a linguagem c   karen lowhany
Introdução a linguagem c karen lowhany
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
 
Introdução à Linguagem C
Introdução à Linguagem CIntrodução à Linguagem C
Introdução à Linguagem C
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Introdução ao c++
Introdução ao c++Introdução ao c++
Introdução ao c++
 
Cet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C IntroducaoCet P Sistemas Linguagem C Introducao
Cet P Sistemas Linguagem C Introducao
 
Linguagem C - Funções
Linguagem C - FunçõesLinguagem C - Funções
Linguagem C - Funções
 
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
Apostila C++ Básico - UNIVERSIDADE ESTADUAL PAULISTA “JÚLIO DE MESQUITA FILHO”
 
Ud2
Ud2Ud2
Ud2
 
Apostila da linguagem c
Apostila da linguagem cApostila da linguagem c
Apostila da linguagem c
 
Pged 01
Pged 01Pged 01
Pged 01
 
Aula01 introducao operacoes
Aula01   introducao operacoesAula01   introducao operacoes
Aula01 introducao operacoes
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cpp
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - Compiladores
 
Linguagem c parte 2
Linguagem c parte 2Linguagem c parte 2
Linguagem c parte 2
 
Ud3
Ud3Ud3
Ud3
 
Cap 2
Cap 2Cap 2
Cap 2
 

Destaque

Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]ronaldo ramos
 
Curso de IA - Parte 4 -
Curso de IA - Parte 4 -Curso de IA - Parte 4 -
Curso de IA - Parte 4 -ronaldo ramos
 
Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -ronaldo ramos
 
Curso Inteligência Artificial - Parte 2 -
Curso Inteligência Artificial - Parte 2 -Curso Inteligência Artificial - Parte 2 -
Curso Inteligência Artificial - Parte 2 -ronaldo ramos
 
Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 - Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 - ronaldo ramos
 
Aula 01-filosofia-parte 02 - v3
Aula 01-filosofia-parte 02 - v3Aula 01-filosofia-parte 02 - v3
Aula 01-filosofia-parte 02 - v3Anderson Favaro
 
Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -ronaldo ramos
 

Destaque (8)

Compiladores-aula01
Compiladores-aula01Compiladores-aula01
Compiladores-aula01
 
Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]Inteligência Artificial Parte 6 [IA]
Inteligência Artificial Parte 6 [IA]
 
Curso de IA - Parte 4 -
Curso de IA - Parte 4 -Curso de IA - Parte 4 -
Curso de IA - Parte 4 -
 
Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -Curso de Inteligência Artificial - Parte 3 -
Curso de Inteligência Artificial - Parte 3 -
 
Curso Inteligência Artificial - Parte 2 -
Curso Inteligência Artificial - Parte 2 -Curso Inteligência Artificial - Parte 2 -
Curso Inteligência Artificial - Parte 2 -
 
Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 - Inteligência Artificial - Parte 5 -
Inteligência Artificial - Parte 5 -
 
Aula 01-filosofia-parte 02 - v3
Aula 01-filosofia-parte 02 - v3Aula 01-filosofia-parte 02 - v3
Aula 01-filosofia-parte 02 - v3
 
Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -Curso Inteligência Artificial - Parte 1 -
Curso Inteligência Artificial - Parte 1 -
 

Semelhante a Compiladores 5

Fundamentos do .NET Framework - Parte 2
Fundamentos do .NET Framework - Parte 2Fundamentos do .NET Framework - Parte 2
Fundamentos do .NET Framework - Parte 2Julian Correa
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+cThiago Freitas
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação CJose Augusto Cintra
 
Linguagem C e Dev-C++ Algumas Explicações
Linguagem C e Dev-C++  Algumas ExplicaçõesLinguagem C e Dev-C++  Algumas Explicações
Linguagem C e Dev-C++ Algumas Explicaçõesnataferraz
 
Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem corvel
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Marcos Castro
 
Introdução a linguagem de programação C
Introdução a linguagem de programação CIntrodução a linguagem de programação C
Introdução a linguagem de programação CSchoolByte
 
Apostila de Introdução ao C#.net
Apostila de Introdução ao C#.netApostila de Introdução ao C#.net
Apostila de Introdução ao C#.netAndre Nascimento
 
5. introducao a linguagem c
5. introducao a linguagem c5. introducao a linguagem c
5. introducao a linguagem cEugenio Caetano
 
Community Launch 2010 - Novos recursos C# 4.0
Community Launch 2010 - Novos recursos C# 4.0Community Launch 2010 - Novos recursos C# 4.0
Community Launch 2010 - Novos recursos C# 4.0Felipe Borges
 
Programação em C (2).pdf
Programação em C (2).pdfProgramação em C (2).pdf
Programação em C (2).pdfJoseAlberto78419
 
Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)Marcelo Barros de Almeida
 

Semelhante a Compiladores 5 (20)

Fundamentos do .NET Framework - Parte 2
Fundamentos do .NET Framework - Parte 2Fundamentos do .NET Framework - Parte 2
Fundamentos do .NET Framework - Parte 2
 
Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+c
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Linguagem C e Dev-C++ Algumas Explicações
Linguagem C e Dev-C++  Algumas ExplicaçõesLinguagem C e Dev-C++  Algumas Explicações
Linguagem C e Dev-C++ Algumas Explicações
 
Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem c
 
Aula09 traducaosin110
Aula09 traducaosin110Aula09 traducaosin110
Aula09 traducaosin110
 
Principios e paradigmas_de_computacao2
Principios e paradigmas_de_computacao2Principios e paradigmas_de_computacao2
Principios e paradigmas_de_computacao2
 
Apostila c
Apostila cApostila c
Apostila c
 
Apostila linguagem c
Apostila linguagem cApostila linguagem c
Apostila linguagem c
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)
 
Introdução a linguagem de programação C
Introdução a linguagem de programação CIntrodução a linguagem de programação C
Introdução a linguagem de programação C
 
Apostila de Introdução ao C#.net
Apostila de Introdução ao C#.netApostila de Introdução ao C#.net
Apostila de Introdução ao C#.net
 
5. introducao a linguagem c
5. introducao a linguagem c5. introducao a linguagem c
5. introducao a linguagem c
 
Community Launch 2010 - Novos recursos C# 4.0
Community Launch 2010 - Novos recursos C# 4.0Community Launch 2010 - Novos recursos C# 4.0
Community Launch 2010 - Novos recursos C# 4.0
 
Oc2 cap03
Oc2 cap03Oc2 cap03
Oc2 cap03
 
Programação em C (2).pdf
Programação em C (2).pdfProgramação em C (2).pdf
Programação em C (2).pdf
 
Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)
 
Autômatos
AutômatosAutômatos
Autômatos
 
Aula de C e C++
Aula de C e C++Aula de C e C++
Aula de C e C++
 

Mais de 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
 

Mais de 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
 

Compiladores 5

  • 1. Análise semântica Ivan Ricarte 2008 I NTRODUÇÃO À COMPILAÇÃO
  • 2. Sumário Tabela de símbolos Aplicação Decoração de nomes Informação de escopo Heurísticas para a análise semântica Verificação de tipos Verificação de fluxo de controle Verificação de unicidade I NTRODUÇÃO À COMPILAÇÃO
  • 3. Análise semântica Etapa da análise do código apoiada por heurísticas Difícil de ser formalizada por meio de gramáticas Associada a inter-relacionamentos entre partes distintas do código Atividades usuais da análise semântica: verificação de. . . declarações todas as variáveis usadas foram declaradas? tipos o tipo da variável é o correto para o operador? fluxo de controle o comando é válido nesse contexto? unicidade o identificador (variável, rótulo) é único no escopo? I NTRODUÇÃO À COMPILAÇÃO
  • 4. Análise semântica Arquivo de análise análise Arquivo de síntese destino origem léxica semântica análise sintática análise Estruturas Gramáticas internas I NTRODUÇÃO À COMPILAÇÃO
  • 5. Tabela de símbolos Estrutura auxiliar utilizada para apoiar análise semântica Quais símbolos foram definidos? O que o símbolo representa? Qual escopo de validade do símbolo? I NTRODUÇÃO À COMPILAÇÃO
  • 6. Aplicação da tabela de símbolos Variável foi declarada? #include <iostream> using namespace std; int main() { a = 10; cout << "Valor de a: " << a << endl; } Mensagem de erro ...cpp: In function ’int main()’: ...cpp:5: error: ’a’ was not declared in this scope I NTRODUÇÃO À COMPILAÇÃO
  • 7. Aplicação da tabela de símbolos Tipo da variável está correto? #include <iostream> using namespace std; int main() { int a = 9; float b = 5; cout << "a%b: " << a%b << endl; } Mensagem de erro ...cpp: In function ’int main()’: ...cpp:7: error: invalid operands of types ’int’ and ’float’ to binary ’operator%’ I NTRODUÇÃO À COMPILAÇÃO
  • 8. Aplicação da tabela de símbolos Escopo da variável está correto? #include <iostream> using namespace std; int main() { int a = 9; void mostra(); mostra(); } void mostra() { cout << "a: " << a << endl; } Mensagem de erro ...cpp: In function ’void mostra()’: ...cpp:11: error: ’a’ was not declared in this scope I NTRODUÇÃO À COMPILAÇÃO
  • 9. Decoração de nomes Mecanismo usado pelo compilador para permitir que uma função tenha diferentes implementações para diferentes tipos de argumentos O nome armazenado na Tabela de Símbolos combina nome declarado pelo programador com um prefixo para identificar a decoração e com um sufixo para identificar os tipos dos argumentos Exemplos Declarado Decorado mostra() H_mostra_v mostra(int x) H_mostra_i mostra(double y, int x) H_mostra_di I NTRODUÇÃO À COMPILAÇÃO
  • 10. Decoração de nomes Integração com objetos externos Como o mecanismo de decoração de nomes é particular de cada compilador, é preciso sinalizar quando uma aplicação integra código gerado por outros compiladores Por exemplo, integração entre C++ e C: extern "C" { int yyparse(void); int yylex(void); ... } I NTRODUÇÃO À COMPILAÇÃO
  • 11. Informação de escopo Qual escopo de cada variável no seguinte fragmento? int a, b; ... // escopo 1 void f() { float a, c; ... // escopo 2 } ... // escopo 1 void g() { int c, d; ... // escopo 3 } I NTRODUÇÃO À COMPILAÇÃO
  • 12. Informação de escopo Estratégias para manter informação de escopo na tabela de símbolos: Múltiplas tabelas uma tabela de símbolos para cada escopo Pilha de tabelas a cada novo escopo, um novo fragmento de tabela é empilhado na tabela geral e desempilhado ao encerrar o escopo I NTRODUÇÃO À COMPILAÇÃO
  • 13. Heurísticas para a análise semântica Compilador realiza verificação estática de código Aquela que pode ser realizada pela análise do código-fonte Por meio da aplicação de heurísticas relacionando fragmentos do código Há situações nas quais problemas só podem ser detectados durante a execução do programa Dependem da verificação dinâmica do código I NTRODUÇÃO À COMPILAÇÃO
  • 14. Verificação de tipos Objetivo Verificar coerência entre declaração de variável e seu uso Exemplos de situações com erros em C++ Operando real para operador % Conflito entre variável escalar e variável ponteiro Conflito na conversão de variável para outro tipo I NTRODUÇÃO À COMPILAÇÃO
  • 15. Verificação de fluxo de controle Objetivo Detectar se comandos que controlam o fluxo da execução são usados de forma correta Exemplos de situações com erros em C++ Uso inadequado do comando break Uso inadequado do comando continue I NTRODUÇÃO À COMPILAÇÃO
  • 16. Verificação de unicidade Objetivo Detectar se identificadores são únicos dentro de um mesmo escopo Exemplos de situações com erros em C++ Nome de variável duplicado Nome de função com mesma decoração resultante Rótulo duplicado I NTRODUÇÃO À COMPILAÇÃO
  • 17. Sugestões de leitura (Web) Artigos na Wikipedia sobre Tabela de símbolos: http://en.wikipedia.org/wiki/Symbol_table Decoração de nomes: http://en.wikipedia.org/wiki/Name_mangling I NTRODUÇÃO À COMPILAÇÃO