Como construir um compilador utilizando ferramentas Java

Documentos relacionados
Compiladores. Prof. Bruno Moreno Aula 8 02/05/2011

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

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

Linguagens Formais e Autômatos

Linguagens Formais e Autômatos

Como construir um compilador utilizando ferramentas Java

Linguagens Formais. Aula 01 - Conceitos Básicos. Prof. Othon Batista Mestre em Informática

LFA Aula 07. Equivalência entre AFD e AFND. Equivalência entre ER s e AF s Equivalência entre GR s e AF s. Linguagens Formais e Autômatos

Estrutura geral de um compilador programa-fonte

Compiladores. Análise Léxica

Compiladores - Análise Ascendente

1 Expressões Regulares e Linguagens

Compiladores - Análise Ascendente

LINGUAGENS FORMAIS E AUTÔMATOS

Fundamentos da Teoria da Computação

Análise Léxica. Fundamentos Teóricos. Autômatos Finitos e Conjuntos Regulares (cap. III da apostila de Linguagens Formais e Compiladores)

Como construir um compilador utilizando ferramentas Java

Compiladores - Autômatos

EXPRESSÃO REGULAR PARA UMA FUNÇÃO EQUIVALENTE EM PASCAL, UTILIZANDO DOIS ALGORITMOS BASEADOS NO TEOREMA DE KLEENE RONALD GLATZ

Fundamentos da Teoria da Computação

Editor de Autômatos Finitos. Acadêmica: Josiane Patrícia Morastoni Orientadora: Joyce Martins

Universidade Federal de Alfenas

Compiladores Aula 3. Celso Olivete Júnior.

TRANSFORMAÇÃO DE GRAMÁTICAS LIVRES DO CONTEXTO PARA EXPRESSÕES REGULARES ESTENDIDAS

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

Construção de Compiladores Aula 16 - Análise Sintática

Como construir um compilador utilizando ferramentas Java

SCC Capítulo 1 Linguagens Regulares e Autômatos Finitos

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

INE5317 Linguagens Formais e Compiladores AULA 6: Autômatos Finitos Com S aída

a n Sistemas de Estados Finitos AF Determinísticos

Operações Fechadas sobre LR s Aplicações

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

COMPILADORES. Revisão Linguagens formais Parte 01. Geovane Griesang

LINGUAGENS FORMAIS Definições. Desenvolveram-se na História em função da necessidade dos grupos humanos que as empregavam

INE5317 Linguagens Formais e Compiladores AULA 5: Autômatos Finitos

Compiladores - Análise Léxica

INE5317 Linguagens Formais e Compiladores AULA 6: Propriedades das Linguagens Regulares

Construção de Compiladores Aula 3 - Analisador Sintático

Prof. Adriano Maranhão COMPILADORES

Linguagens de Programação Aula 5

LR's: Lema do Bombeamento e Propriedades de Fechamento

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

Autômatos Finitos Não Determinís5cos (AFN)

Compiladores - Análise Recursiva

LFA Aula 05. AFND: com e sem movimentos 05/12/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior.

a * Expressões Regulares (ER) AF e ER Equivalências entre AFD, AFND, AF-, ER

INCLUSÃO DO ALGORITMO DE TRANSFORMAÇÃO DE UM AUTÔMATO FINITO EM EXPRESSÃO REGULAR NO AMBIENTE EDITOR DE AUTÔMATOS FINITOS

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

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

Compiladores - Análise Léxica

Autômato com pilha. IBM1088 Linguagens Formais e Teoria da Computação. Evandro Eduardo Seron Ruiz

Exercicios. 7.2 Quais das seguintes afirmações são verdadeiras? Justifica. (d) abcd L((a(cd) b) )

Analisador Léxico parte II

SCC-ICMC-USP. Trabalho em Grupo 1 SCC-0205

Linguagens Formais e Autômatos 02/2016. LFA Aula 04 16/11/2016. Celso Olivete Júnior.

UNIVERSIDADE DA BEIRA INTERIOR

Linguagens Formais e Problemas de Decisão

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

Teoria de Linguagens 2 o semestre de 2017 Professor: Newton José Vieira Primeira Lista de Exercícios Data de entrega: 19/9/2017 Valor: 10 pontos

Especificações Gerais do Compilador e Definição de FRANKIE

AF Não-determinísticos Equivalência entre AFDN e AFD Equivalência entre AF e GR (H&U, 1969 e 1979), (H;M;U, 2001) e (Menezes, 2002) 1

Teoria de Linguagens 1 o semestre de 2018 Professor: Newton José Vieira Primeira Lista de Exercícios Data de entrega: 17/4/2018 Valor: 10 pontos

Linguagens Formais e Autômatos

AF Não-determinísticos Equivalência entre AFDN e AFD Equivalência entre AF e GR (H&U, 1969 e 1979), (H;M;U, 2001) e (Menezes, 2002) 1

Conceitos Básicos. Vocabulário Cadeias Linguagens Problema

Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Curso de Ciências de Computação

Sistemas de Estados Finitos AF Determinísticos. (H&U, 1979) e (H;M;U, 2001)

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

Linguagens Regulares. Prof. Daniel Oliveira

Expressões Regulares. Linguagens Formais e Autômatos. Andrei Rimsa Álvares

Compiladores 02 Analise léxica

Tokens, Padroes e Lexemas

Máquinas de Turing - Computabilidade

Familiarização com a ferramenta JavaCC

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

Compiladores - Análise Recursiva

Folha 2 Autómatos e respectivas linguagens

Aula 3: Autômatos Finitos

Programa fonte token padrões lexema Tokens

Linguagens Formais e Autômatos P. Blauth Menezes

Expressões Regulares e Gramáticas Regulares

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

Universidade Federal de Alfenas

Conceitos Básicos. Vocabulário Cadeias Linguagens Expressões Regulares Problema X Linguagem

Universidade Federal de Alfenas

LFA Aula 08. Minimização de AFD Autômatos Finitos com saídas 25/01/2017. Linguagens Formais e Autômatos. Celso Olivete Júnior.

Histórico e motivação

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

Lema do Bombeamento Operações Fechadas sobre LR s Aplicações

Compiladores - Análise SLR

Compiladores. Prof. Bruno Moreno

SCC 205 Teoria da Computação e Linguagens Formais

Teoria de Linguagens 2 o semestre de 2015 Professor: Newton José Vieira Primeira Lista de Exercícios Entrega: até 16:40h de 15/9.

LFA Aula 09. Gramáticas e Linguagens Livres de Contexto 18/01/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior.

Construção de Compiladores Aula 2 - Analisador Léxico

A. (Autómatos finitos determinísticos e não determinísticos AFD e AFND)

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

Alfabeto, Cadeias, Operações e Linguagens

Transcrição:

Como construir um compilador utilizando ferramentas Java p. 1/2 Como construir um compilador utilizando ferramentas Java Aula 4 Análise Léxica Prof. Márcio Delamaro delamaro@icmc.usp.br

Como construir um compilador utilizando ferramentas Java p. 2/2 O que é a tarefa do analisador léxico é quebrar a entrada em símbolos que façam sentido para a definição da linguagem e para o analisador sintático. Para identificarmos quais são esses símbolos, basta olharmos na definição da linguagem sua gramática ou grafo sintático e identificarmos quais são os seus símbolos terminais. No contexto da análise léxica, costumamos chamar esses símbolos de tokens.

Como construir um compilador utilizando ferramentas Java p. 3/2 Linguagens e alfabetos Os símbolos terminais compõem o alfabeto sobre o qual a nossa linguagem é definida. Esse conjunto de símbolos pode ser definido como uma linguagem. Muito mais simples que a linguagem alvo. Modelos simples como AFD e ER.

Como construir um compilador utilizando ferramentas Java p. 4/2 Autômato Finito Determinístico Um autômato finito determinístico (AFD) é um modelo para definição de linguagens regulares composto de cinco elementos Σ,S,s 0,δ,F, onde: Σ é o alfabeto sobre o qual a linguagem é definida; S é um conjunto finito não vazio de estados; s 0 é o estado inicial, s 0 S; δ é a função de transição de estados, δ : S Σ S; F é o conjunto de estados finais, F S.

Como construir um compilador utilizando ferramentas Java p. 5/2 Máquina de reconhecer cadeias Recebe como entrada uma cadeia e diz se ela pertence ou não à linguagem desejada. a b a c d 11111111111111111111111 00000000000000000000000 11111111111111111111111 00000000000000000000000 11111111111111111111111 00000000000000000000000 11111111111111111111111 00000000000000000000000 b 11111111111111111111111 00000000000000000000000 11111111111111111111111 00000000000000000000000 c 00000000000000000000000 11111111111111111111111 11111111111111111111111 Aceita 00000000000000000000000 00000000 11111111 00000000 11111111 00000000 11111111 00000000 11111111 00000000000000000000000 11111111111111111111111 00000000000000000000000 11111111111111111111111 00000000000000000000000 11111111111111111111111 Controle 00000000 11111111 00000000 11111111 00000000000000000000000 11111111111111111111111 11111111111111111111111 Finito de 00000000000000000000000 Não 00000000000000000000000 11111111111111111111111 Aceita Estados 11111111111111111111111 00000000000000000000000 00000000 11111111 00000000 11111111 00000000 11111111 00000000 11111111 00000000 11111111 00000000 11111111 00000000 11111111 00000000 11111111 00000000 11111111 00000000000000000000000 11111111111111111111111 11111111111111111111111 00000000000000000000000 11111111111111111111111 00000000000000000000000

Como construir um compilador utilizando ferramentas Java p. 6/2 Representações δ 0 1 2 3 4 5 6 7 8 9 s 0 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2

Como construir um compilador utilizando ferramentas Java p. 6/2 Representações δ 0 1 2 3 4 5 6 7 8 9 s 0 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 0,3,6,9 0,3,6,9 1,4,7 S 0 2,5,8 S 1 2,5,8 1,4,7 1,4,7 2,5,8 S 2 0,3,6,9

Como construir um compilador utilizando ferramentas Java p. 7/2 Tabela de transição Uma das vantagens de se utilizar um AFD para definir quais são os tokens a serem reconhecidos pelo AL é que é fácil implementar um AL baseado na tabela de transição de estados. Tal analisador deve apenas ler uma letra da entrada e, baseado na tabela, fazer a mudança de estado. Se o estado em que o AFD se encontrar for um estado final, então a cadeia lida até aquele ponto é um token válido.

Como construir um compilador utilizando ferramentas Java p. 8/2 AFD com função parcial δ 0 1 2 3 4 5 6 7 8 9 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 2 s 0 s 1 s 2 s 0 s 1 s 2 s 0 s 1 s 2 3,6,9 0,3,6,9 1,4,7 S 0 2,5,8 S 1 2,5,8 1,4,7 1,4,7 2,5,8 S 2 0,3,6,9

Como construir um compilador utilizando ferramentas Java p. 9/2 Execução do AL Cadeia longa de símbolos.

Como construir um compilador utilizando ferramentas Java p. 9/2 Execução do AL Cadeia longa de símbolos. A cada execução do AFD (analisador léxico), um símbolo é reconhecido.

Como construir um compilador utilizando ferramentas Java p. 9/2 Execução do AL Cadeia longa de símbolos. A cada execução do AFD (analisador léxico), um símbolo é reconhecido. O AFD é executado até que não haja mais nenhuma transição possível

Como construir um compilador utilizando ferramentas Java p. 9/2 Execução do AL Cadeia longa de símbolos. A cada execução do AFD (analisador léxico), um símbolo é reconhecido. O AFD é executado até que não haja mais nenhuma transição possível Se o último estado for final, o símbolo é válido.

Como construir um compilador utilizando ferramentas Java p. 9/2 Execução do AL Cadeia longa de símbolos. A cada execução do AFD (analisador léxico), um símbolo é reconhecido. O AFD é executado até que não haja mais nenhuma transição possível Se o último estado for final, o símbolo é válido. Se não, um erro ocorreu.

Como construir um compilador utilizando ferramentas Java p. 10/2 Exemplo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra,

Como construir um compilador utilizando ferramentas Java p. 10/2 Exemplo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra, i f 1234

Como construir um compilador utilizando ferramentas Java p. 10/2 Exemplo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra, i f 1234 if 1234

Como construir um compilador utilizando ferramentas Java p. 10/2 Exemplo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra, i f 1234 if 1234 if1234

Como construir um compilador utilizando ferramentas Java p. 10/2 Exemplo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra, i f 1234 if 1234 if1234 1234if1234

Como construir um compilador utilizando ferramentas Java p. 11/2 Tipo de símbolo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra, Associar a cada nó um tipo de token.

Como construir um compilador utilizando ferramentas Java p. 11/2 Tipo de símbolo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra, Associar a cada nó um tipo de token. Se execução termina no estado 2, um número foi reconhecido.

Como construir um compilador utilizando ferramentas Java p. 11/2 Tipo de símbolo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra, Associar a cada nó um tipo de token. Se execução termina no estado 2, um número foi reconhecido. Se termina nos estados 3 ou 5, um identificador foi reconhecido

Como construir um compilador utilizando ferramentas Java p. 11/2 Tipo de símbolo branco 2 1 i f 3 4 letra - {f}, letra - {i} 5 letra, letra, Associar a cada nó um tipo de token. Se execução termina no estado 2, um número foi reconhecido. Se termina nos estados 3 ou 5, um identificador foi reconhecido Se termina no estado 4, um if foi reconhecido

Como construir um compilador utilizando ferramentas Java p. 12/2 Tabela de transição Estado Letra: próximo estado Tipo 1 branco:1 digito:2 i:3 letra-{i}:5 ERRO 2 digito:2 NÚMERO 3 f:4 letra:5 digito:5 IDENT 4 letra:5 digito:5 IF 5 letra:5 digito:5 IDENT Ver programa 3.1 pag 43

Como construir um compilador utilizando ferramentas Java p. 13/2 Complexidade de um AFD Na linguagem X ++, que é bastante simples, temos nada menos que 39 símbolos terminais. A construção do AFD pode se tornar bastante complexa. Uma das maneiras de diminuir essa dificuldade é utilizando um autômato finito não determinístico (AFND)

Como construir um compilador utilizando ferramentas Java p. 14/2 Autômato finito não determinístico A função de transição de estados é definida δ : S Σ conjunto de subconjuntos finitos de ρ(s) Pode existir mais de uma transição saindo de um estado para a mesma letra do alfabeto.

Como construir um compilador utilizando ferramentas Java p. 15/2 Exemplo de autômato finito não determinísti branco 2 1 i f 3 4 letra 5 letra, if12 {1} i {3, 5} f {4, 5} 1 {5} 2 {5} if {1} i {3, 5} f {4, 5}

Como construir um compilador utilizando ferramentas Java p. 16/2 AFND com estados vários iniciais Um AFND pode também ter diversos estados iniciais branco 1 2 branco i f 3 4 5 branco letra 6 7 letra, if12 {1, 3, 6} i {4, 7} f {5, 7} 1 {7} 2 {7} if {1, 3, 6} i {4, 7} f {5, 7}

Como construir um compilador utilizando ferramentas Java p. 17/2 Observações AFND facilita a descrição da linguagem reconhecida pelo analisador léxico.

Como construir um compilador utilizando ferramentas Java p. 17/2 Observações AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar.

Como construir um compilador utilizando ferramentas Java p. 17/2 Observações AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar. Não adiciona nenhum poder extra aos AFDs

Como construir um compilador utilizando ferramentas Java p. 17/2 Observações AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar. Não adiciona nenhum poder extra aos AFDs Portanto podemos sempre transformar um AFND em um AFD.

Como construir um compilador utilizando ferramentas Java p. 18/2 Expressões regulares Usa operadores para combinar as letras do alfabeto e formar linguagens.

Como construir um compilador utilizando ferramentas Java p. 18/2 Expressões regulares Usa operadores para combinar as letras do alfabeto e formar linguagens. União ( ): dadas as linguagens L 1 e L 2, sobre o alfabeto Σ, define-se L 1 L 2 como {x Σ x L 1 x L 2 };

Como construir um compilador utilizando ferramentas Java p. 18/2 Expressões regulares Usa operadores para combinar as letras do alfabeto e formar linguagens. União ( ): dadas as linguagens L 1 e L 2, sobre o alfabeto Σ, define-se L 1 L 2 como {x Σ x L 1 x L 2 }; Concatenação ( ): dadas as linguagens L 1 e L 2, sobre o alfabeto Σ, define-se L 1 L 2 como {x.y Σ x L 1 y L 2 };

Como construir um compilador utilizando ferramentas Java p. 18/2 Expressões regulares Usa operadores para combinar as letras do alfabeto e formar linguagens. União ( ): dadas as linguagens L 1 e L 2, sobre o alfabeto Σ, define-se L 1 L 2 como {x Σ x L 1 x L 2 }; Concatenação ( ): dadas as linguagens L 1 e L 2, sobre o alfabeto Σ, define-se L 1 L 2 como {x.y Σ x L 1 y L 2 }; Fecho de Kleene ( ): dada a linguagem L sobre o alfabeto Σ, define-se L como sendo λ L (L L) (L L L) (L L L L)...

Como construir um compilador utilizando ferramentas Java p. 19/2 ER e o analisador léxico Cada item léxico pode ser definido através de uma ER.

Como construir um compilador utilizando ferramentas Java p. 19/2 ER e o analisador léxico Cada item léxico pode ser definido através de uma ER. NUMERO: digito digito ;

Como construir um compilador utilizando ferramentas Java p. 19/2 ER e o analisador léxico Cada item léxico pode ser definido através de uma ER. NUMERO: digito digito ; IF: i f;

Como construir um compilador utilizando ferramentas Java p. 19/2 ER e o analisador léxico Cada item léxico pode ser definido através de uma ER. NUMERO: digito digito ; IF: i f; IDENTIFICADOR: letra (letra digito).

Como construir um compilador utilizando ferramentas Java p. 19/2 ER e o analisador léxico Cada item léxico pode ser definido através de uma ER. NUMERO: digito digito ; IF: i f; IDENTIFICADOR: letra (letra digito). Uma (ou diversas) ER pode ser transformada em um AFND.

Como construir um compilador utilizando ferramentas Java p. 20/2 Exercício 1) Identifique cada símbolo terminal na gramática de X ++ e construa, para cada um uma ER e um AFND. 2) Baixe o JavaCC (https://javacc.dev.java.net) e sua doc. (https://javacc.dev.java.net/doc/docindex.html) e tente entender como funciona este gerador de compiladores, que será usado para construir nosso analisador léxico. Veja também o Apêndice B do livro.