Compiladores - Autômatos

Documentos relacionados
Compiladores - Análise Ascendente

Compiladores - Análise Ascendente

Reduce: reduz o que está imediatamente à esquerda do foco usando uma produção

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 31. Instituto de C

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

Como construir um compilador utilizando ferramentas Java

Estrutura geral de um compilador programa-fonte

Compiladores - Análise Léxica

Compiladores - Análise Léxica

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)

Compiladores. Análise Léxica

Compiladores Aula 3. Celso Olivete Júnior.

Compiladores - Análise SLR

Compiladores 02 Analise léxica

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

Compiladores - JFlex. Fabio Mascarenhas

Compiladores - JFlex. Fabio Mascarenhas Monday, April 15, 13

Linguagens Formais e Autômatos. Autômatos Finitos Determinísticos (AFD)

Função de um Analisador Léxico (Scanner)

Linguagens Formais e Autômatos

Compiladores. Análise Léxica

AF Não-determinísticos Equivalência entre AFND e AFD AFs e GRs Implementação de AFs

Análise Léxica II. Eduardo Ferreira dos Santos. Setembro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 30

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Compiladores Análise Semântica

Compiladores Análise Semântica

Curso: Ciência da Computação Turma: 6ª Série. Teoria da Computação. Aula 4. Autômatos Finitos

Compiladores. Fabio Mascarenhas

Compiladores 04 Analise léxica Jflex. Prof José Rui

Análise Sintática Bottom-up

Compiladores - Análise LL(1)

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

Número: Nome: 1. (3.0 val.) Considere um analisador lexical contendo a sequência ordenada de

Introdução à Programação

Teoria da Computação. Expressões Regulares e Autômatos Finitos. Thiago Alves

Concurso Público para provimento de cargo efetivo de Docentes. Edital 20/2015 CIÊNCIA DA COMPUTAÇÃO II Campus Rio Pomba

Compiladores Aula 2. Celso Olivete Júnior.

Implementação do Analisador Léxico

Compiladores - Gramáticas

LINGUAGENS FORMAIS E AUTÔMATOS

Análise Sintática. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 18

Programa fonte token padrões lexema Tokens

Papel do analisador léxico: ler o arquivo fonte em busca de unidades significativas (os tokens) instanciadas por lexemas ou átomos.

Compiladores Ambiente de Execução

Prof. Adriano Maranhão COMPILADORES

Análise Léxica. Função de um Analisador Léxico (AL) Erros Léxicos. Métodos para a Especificação e Reconhecimento dos tokens: ER e AF

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Folha 3 - Análise léxica

Linguagens Formais e Autômatos. Apresentação do Plano de Ensino

Linguagens de Programação

Compiladores. Conceitos Básicos

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Conceitos de Linguagens de Programação

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07

Análise Sintática Introdução

Identificadores Nome de variáveis, constantes, métodos, etc...

Compiladores Aula 1. Celso Olivete Júnior.

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 12. Instituto de C

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

Compiladores - Gramáticas

IV.2 Aspectos Léxicos Convencionais

Conceitos de Linguagens de Programação

COMPILADORES. Análise léxica. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Análise Léxica. Sumário

Compiladores - Análise Preditiva

Análise sintática. Análise sintática ascendente. Bottom-up, ascendente ou redutiva. Analisadores de precedência de operadores Analisadores LR

Análise Semântica: Verificação de Tipos

SCC Capítulo 2 Linguagens Livres de Contexto e Autômatos de Pilha (versão 2)

Transcrição:

Compiladores - Autômatos Fabio Mascarenhas 2015.1 http://www.dcc.ufrj.br/~fabiom/comp

Especificação x Implementação Usamos expressões regulares para dar a especificação léxica da linguagem Mas como podemos fazer a implementação do analisador léxico a partir dessa especificação?

Especificação x Implementação Usamos expressões regulares para dar a especificação léxica da linguagem Mas como podemos fazer a implementação do analisador léxico a partir dessa especificação? Autômatos finitos! Algoritmos para converter expressões regulares são conhecidos e podem ser reaproveitados, e autômatos levam a um analisador léxico bastante eficiente

Autômatos Finitos Um autômato finito é formado por: Um alfabeto de entrada Um conjunto de estados Um estado inicial Um conjunto de estados finais rotulados Um conjunto de transições entre estados

Transições Uma transição s1 - a -> s2 quer dizer que se autômato está no estado s1 e o próximo símbolo da entrada é a então ele vai para o estado s2 Se não há mais caracteres na entrada e estamos em um estado final então o autômato aceitou a entrada Se em algum ponto não foi possível tomar nenhuma transição, ou a entrada acabou e não estamos em um estado final, o autômato rejeitou a entrada

Graficamente

Graficamente estado

Graficamente estado inicial estado

Graficamente estado inicial estado estado final

Graficamente estado inicial estado estado final transição

Graficamente estado inicial estado estado final a b c transição

Graficamente (0 1)*00

Transições Uma transição é uma transição que pode ser tomada espontaneamente pelo autômato, sem ler nenhum símbolo da entrada Podemos também construir um autômato que pode tomar mais de uma transição dado um estado e um símbolo Autômatos com transições e múltiplas transições saindo de um mesmo estado para um mesmo caractere são não-determinísticos

DFA vs NFA Um DFA é um autômato determinístico, um NFA é não-determinístico Um DFA, dada uma entrada, toma apenas um caminho através dos seus estados Um NFA toma todos os caminhos possíveis para aquela entrada, e aceita entrada se pelo menos um caminho termina em um estado final

Funcionamento de um NFA Entrada: Estados:

Funcionamento de um NFA Entrada: 1 Estados: { 0 }

Funcionamento de um NFA Entrada: 1 0 Estados: { 0 } { 0, 1 }

Funcionamento de um NFA Entrada: 1 0 0 Estados: { 0 } { 0, 1 } { 0, 1, 2 }

Funcionamento de um NFA Entrada: 1 0 0 Estados: { 0 } { 0, 1 } { 0, 1, 2 } Aceita!

Funcionamento de um NFA Entrada: 0 Estados: { 0, 1 }

Funcionamento de um NFA Entrada: 0 1 Estados: { 0, 1 } { 0 } Não aceita!

Autômatos e linguagens DFAs, NFAs e expressões regulares todos expressam a mesma classe de conjunto de símbolos Linguagens regulares Isso quer dizer que podemos converter de um para outro DFAs são mais rápidos para executar NFAs têm representação mais compacta Expressões regulares são mais fáceis de entender qual conjunto está sendo expresso

Autômatos e linguagens DFAs, NFAs e expressões regulares todos expressam a mesma classe de conjunto de símbolos Linguagens regulares Isso quer dizer que podemos converter de um para outro DFAs são mais rápidos para executar NFAs têm representação mais compacta Por isso usamos expressões regulares para a especificação, e DFAs (ou NFAs) para implementação! Expressões regulares são mais fáceis de entender qual conjunto está sendo expresso

DFA de análise léxica Um DFA de análise léxica tem os estados finais rotulados com tipos de token A ideia é executar o autômato até chegar no final da entrada, ou dar erro por não conseguir fazer uma transição, mantendo uma pilha de estados visitados e o token que está sendo lido Então voltamos atrás, botando símbolos de volta na entrada, até chegar em um estado final, que vai dar o tipo do token

Analisador léxico de tabela // reconhecer palavras estado = s 0 lexema = pilha.limpa() while (!eof && estado erro) do char = lechar() lexema = lexema + char push (estado) estado = trans(estado,char) end; // limpar estado final while (estado S F and!pilha.vazia()) do estado pilha.pop() lexema = lexema.truncaultimo() voltachar() end; if (estado S F ) // rótulo do estado é tipo do token then return <estado.rotulo, lexema> else return erro

Uma otimização Se visitamos um estado final então podemos limpar a pilha, já que vamos parar nele na volta // reconhecer palavras estado = s 0 lexema = pilha.limpa() while (!eof && estado erro) do char = lechar() lexema = lexema + char if estado S F then pilha.limpa() push (estado) estado = trans(estado,char) end; // limpar estado final while (estado S F and!pilha.vazia()) do estado pilha.pop() lexema = lexema.truncaultimo() voltachar() end; if (estado S F ) // rótulo do estado é tipo do token then return <estado.rotulo, lexema> else return erro

Construindo o DFA de análise léxica Passo 1: construir um NFA para cada regra, o estado final desse NFA é rotulado com o tipo do token Construção de Thompson Passo 2: combinar os NFAs em um NFA com um estado inicial que leva aos estados iniciais do NFA de cada regra via uma transição Passo 3: transformar esse NFA em um DFA, estados finais ficam com o rótulo da regra que aparece primeiro Algoritmo de construção de subconjuntos

DFA da linguagem de comandos simples

[+] vs [++]

Juntando ID e palavras reservadas