Notes - MIECT
Compiladores
Notes - MIECT
Compiladores
  • Compiladores
  • Compiladores, Linguagens e Gramáticas
    • Enquadramento
    • Compiladores
      • Interpretadores
      • Estrutura de um Compilador
    • Implementação de um Compilador
    • Linguagens: Definição como Conjunto
      • Conceito básicos e terminologia
      • Operações sobre palavras
      • Operações sobre linguagens
    • Introdução às gramáticas
      • Hierarquia de Chomsky
      • Autómatos
  • Introdução, Estrutura, Aplicação
    • Exemplos
      • Expr
      • Exemplo figuras
      • Exemplo visitor
      • Exemplo listener
    • Construção de gramáticas
      • Especificação de gramáticas
    • Estrutura léxica
    • Regras léxicas
      • Padrões léxicos típicos
      • Operador léxico “não ganancioso”
    • Estrutura sintática
      • Secção de Tokens
      • Acções no preâmbulo da gramática
    • Regras sintácticas
      • Padrões sintácticos típicos
      • Precedência
      • Associatividade
      • Herança de gramáticas
    • Outras funcionalidades
      • Tabelas CSV
      • Gramáticas ambíguas
      • Predicados semânticos
      • Separar analisador léxico do analisador sintáctico
      • “Ilhas” lexicais
      • Enviar tokens para canais diferentes
      • Reescrever a entrada
      • Desacoplar código da gramática - ParseTreeProperty
  • Análise Semântica
    • Estrutura de um Compilador
    • Sistema de Tipos
    • Gramáticas de Atributos
    • Tabela de símbolos
    • Instruções restringidas por contexto
    • ANTLR4: gestão de erros
  • Síntese
    • Síntese: Geração de código
    • String Template
    • Síntese: geração de código intermédio
  • Análise Lexical
    • Análise Lexical: Estrutura de um Compilador
    • Linguagens regulares
    • Gramáticas regulares
    • Expressões regulares
    • Conversão entre ER e GR
    • Reconhecimento de tokens
    • Autómatos finitos
    • Autómato finito não determinista
    • Autómato finito determinista
      • Projecto de autómato finito determinista
    • Conversão de AFND em AFD
    • Conversão de uma expressão regular num AFND
    • Autómato finito generalizado (AFG)
  • Gramática de Atributos
    • Conteúdo semântico
    • Gramática de atributos
    • Avaliação Dirigida pela Sintaxe
  • Análise Sintática Descendente
    • Análise Sintática
    • Análise Sintática Descendente
    • Analisador (parser) Recursivo-Descendente Preditivo
    • Questões a resolver
    • Fatorização à Esquerda
    • Eliminação de Recursividade á Esquerda
    • Conjuntos predict, first e follow
      • Conjunto first
      • Conjunto follow
    • Reconhecedor Descendente Preditivo
  • Análise Sintática Ascendente
    • Análise Sintática Ascendente
    • Construção de um reconhecedor ascendente
    • Tabela de decisão de um reconhecedor ascendente
    • Reconhecedor Ascendente
    • Tabela de Decisão de um Reconhecedor Ascendente
Powered by GitBook
On this page
  • Avaliação dirigida pela sintaxe
  • Deteção estática ou dinâmica
  1. Análise Semântica

Estrutura de um Compilador

PreviousDesacoplar código da gramática - ParseTreePropertyNextSistema de Tipos

Last updated 3 years ago

No processamento de uma linguagem a análise semântica deve, sempre que possível, garantir que o programa faz sentido.

Erros semânticos comuns:

  • Variável/função não definida.

  • Tipos incompatíveis (ex. atribuir um número real a uma variável inteira).

  • Definir instrução num contexto errado (ex. utilizar em Java a instrução break fora de um ciclo switch).

  • Aplicação sem sentido de instrução (ex. importar um pacote inexistente).

Em alguns casos, estes erros podem ser avaliados ainda durante a análise sintática, em outros casos só é possível fazer essa verificação após uma análise sintática bem sucedida, fazendo uso da informação retirada dessa análise.

Avaliação dirigida pela sintaxe

No processamento de linguagens, a avaliação semântica pode ser feita associando informação e acções às regras sintácticas da gramática (i.e. aos nós da árvore sintáctica).

Este procedimento designa-se por avaliação dirigida pela sintaxe.

Por exemplo, numa gramática para expressões aritméticas podemos associar aos nós da árvore uma variável com o tipo da expressão, e acções que permitam verificar a sua correcção (e não permitir, por exemplo, que se tente somar um booleano com um inteiro).

Em ANTLR4, a associação de atributos e acções à árvore sintáctica, pode ser feita durante a própria análise sintáctica, e/ou posteriormente recorrendo a visitors e/ou listeners.

Deteção estática ou dinâmica

A variação de cada propriedade semântica de uma linguagem pode ser feita em dois tempos distintos:

  • Tempo dinâmico: durante o tempo de execução.

  • Tempo estático: durante o tempo de compilação.

Só os compiladores fazem verificações estáticas de propriedades semânticas.

Em interpretadores as fases de análise e síntese da linguagem são ambas feitas em tempo de execução, pelo que as verificações são sempre dinâmicas.

A verificação estática tem a vantagem de garantir, em tempo de execução, que certos erros nunca vão ocorrer (dispensando a necessidade de proceder à sua depuração e teste).