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
  • Abordagem
  • Itens de uma gramática
  • Exemplo
  1. Análise Sintática Ascendente

Construção de um reconhecedor ascendente

Abordagem

Como determinar de forma sistemática a ação a realizar (deslocamento, redução, aceitação, rejeição) ?

Pilha
Entrada
Próxima ação

i v v ; $

deslocamento

i

v v ; $

redução por T ->i

T

v v ; $

deslocamento

T v

v ; $

rejeição

A ação a realizar em cada passo do procediemnto de reconhecimento - delocamento, redução, aceitação ou rejeição - depende da configuração em cada momento.

Uma configuração é formada pelo conteúdo da pilha mais apertada da entrada ainda não processada.

A pilha é conhecida - na realidade, é preenchida pelo procedimento de reconhecimento.

Da entrada, em cada momento, apenas se conhece o lookahead.

Quantos símbolos da pilha usar ?

Poder-se-á usar apenas um ?

Se se quiser e puder construir um reconhecedor que apenas use o símbolo no topo, uma pilha onde se guardam os símbolos terminais e não terminains tem pouco interesse.

Mas pode definir-se um alfabeto adequado para a pilha.

Os símbolos a colocar na pilha devem representar estados no processo de deslocamento/redução/aceitação.

Por exemplo, um dado símbolo pode significar que, na produção "D -> T L ;", já se processou algum que corresponde ao "T L", faltando o ";"

Itens de uma gramática

O alfabeto da pilha representa assim o conjunto de possíveis estados nesse processo de reconhecimento.

Cada estado representa um conjunto de itens.

Cada item representa o quanto de uma produção já foi processado e o quanto ainda falta processar.

  • Usa-se um ponto (•) ao longo dos símbolos de uma produção para o representar.

A produção A -> B1 B2 B3 produz 4 itens:

  • A -> • B1 B2 B3 A -> B1 • B2 B3 A -> B1 B2 • B3 A -> B1 B2 B3 •

A produção de A -> end produz um único item:

  • A -> •

Exemplo

Considere a gramática

  • S -> E E -> a | ( E )

Reconhecer a palavra u = u1 u2 ... un, significa reduzir u$ a u$, então, o estado inicial no processo de reconhecimento pode ser definido por:

O facto de o ponto (•) se encontrar imediatamente à esquerda de um símbolo significa que para se avançar no processo de reconhecimento é preciso obter esse símbolo.

  • Se o símbolo é terminal, isso corresponde a uma ação de deslocamento.

  • Se o símbolo é não terminal, é preciso dar-se a redução de uma produção que o produza.

  • Isso é considerado juntando ao conjunto os itens iniciais das produções cuja cabeça é o símbolo pretendido:

Se aparecerem novos símbolos não terminais imediatamente à direita de um ponto (•), repete-se o processo. Faz-se o fecho (closure).

Evolução de Z0:

O estado Z0 pode evoluir por ocorrência de um E, um a ou um (, que correspondem aos símbolos que aparecem imediatamente à direita do (•).

Z3 tem de ser estendido pela função de fecho, uma vez que o ponto (•) ficou imediatamente à esquerda de um símbolo não terminal (E).

Z2, apenas possui um item terminal (com o ponto (•) à direita), que representa uma situação passível de redução, neste caso pela produção E -> a.

Evolução de Z1:

Apenas evolui por ocorrência de um $

Se o símbolo inicial da gramática não aparecer no corpo de qualquer produção (como acontece aqui), pode-se considerar Z1 como uma situação de aceitação se o lookahead de $.

Evoluação de Z3:

Pode evoluir por ocorrência de um E, um a ou um (

Evolução de Z4

Apenas evolui por ocorrência de )

Z5

Z5 apenas possui um item terminal, que representa uma situação passível de redução pela regra E -> ( E ).

Pode acontecer que um dado elemento (conjunto de itens) possua itens terminais (associados a reduções ) e não terminais.

Pondo tudo junto

Representado na forma de um autómato, tem-se

Neste autómato, os estados representam o alfabeto da pilha.

As transições represenam operações de push.

As transições etiquetadas com símbolos terminais representam adicionalmente ações de deslocamento (shift).

As ações de redução provocam operações de pop, em número igual ao número de elementos do corpo da produção.

As transições etiquetadas com símbolos não terminais ocorrem após as ações de redução.

Tudo isto representa o funcionamento de um autómato de pilha que permite fazer o reconhecimento da linguagem.

PreviousAnálise Sintática AscendenteNextTabela de decisão de um reconhecedor ascendente

Last updated 2 years ago

que corresponde à situação de aceitação