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

Documentos relacionados
Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 32. Instituto de C

Compiladores - JFlex. Fabio Mascarenhas

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

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

Linguagens de Programação

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

Compiladores - Autômatos

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

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

Compiladores. Análise Léxica

Compiladores - Análise Léxica

Compiladores 02 Analise léxica

Compiladores - Análise Léxica

Descrição da Linguagem Pascal Jr.

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

Analisador Léxico parte II

IV.2 Aspectos Léxicos Convencionais

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

Lex Adaptação da obra original de Tom Niemann

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

Compiladores Análise Semântica

Teoria da Computação e Algoritmos. Introdução à Linguagem Pascal. ALGORITMO <Nome do algoritmo>; <definições>; INÍCIO <Comandos>; FIM.

Compiladores - Especificando Sintaxe

Compiladores. Análise Léxica

Programação II. Aula 3

Compiladores Análise Semântica

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Compilação da linguagem Panda

Sintaxe do Pascal Simplificado Estendido de 12 novas construções em Notação EBNF (BNF estendida)

Linguagens de Domínio Específico

FACULDADE LEÃO SAMPAIO

Como construir um compilador utilizando ferramentas Java

Aspectos do analisador sintático Usabilidade da Dias de atraso

Compiladores - Análise Recursiva

Estrutura geral de um compilador programa-fonte

Pascal. -Cabeçalho do programa. - label - const - type - var - procedure - function. - integer - real - byte - boolean - char - string

Compiladores. Introdução

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Compiladores - JACC. Fabio Mascarenhas

Pratica JFlex. Prática criando o primeiro analisador léxico

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

Folha 3 - Análise léxica

Compiladores Aula 1. Celso Olivete Júnior.

Compiladores - Análise Recursiva

Introdução à Programação

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

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

Compiladores I Prof. Ricardo Santos (cap 1)

Grupo 3: 8,3 - Parte Léxica (2,0): 1,9 - Na parte I especificou tamanho de identificador com 512 caracteres, mas não tratou (-0,1) -Parte Sintática

Introdução. Flex e uma ferramenta para gerar scanners programas que reconhecem padrões lexicais em texto

Análise Sintática Introdução

Compiladores Aula 3. Celso Olivete Júnior.

Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison

Compiladores. Conceitos Básicos

Análise Sintática - Final

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

Linguagens de Programação

Compiladores. Fabio Mascarenhas

Linguagens de Domínio Específico

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

MAB Análise Léxica. Monday, March 19, 12

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

Linguagens de Programação Aula 4

V.2 Especificação Sintática de Linguagens de Programação

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

I1, I2 e In são instruções simples ou estruturadas da linguagem Pascal.

Programação Orientada a Objetos II Java Segunda aula. Prof. Rogério Albuquerque de Almeida

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Linguagem Pascal. Prof. Sérgio Rodrigues. É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa;

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Linguagens de Programação Aula 5

Linguagens Formais e Autômatos

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

6) ESTRUTURA DE UM PROGRAMA

Análise Sintática Bottom-up

Tokens, Padroes e Lexemas

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Conceitos de Linguagens de Programação

1 d=

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Prof. A. G. Silva. 28 de agosto de Prof. A. G. Silva INE5603 Introdução à POO 28 de agosto de / 1

Programa fonte token padrões lexema Tokens

Linguagem de programação: Pascal

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

Linguagem Pascal. Prof. Antonio Almeida de Barros Junior

Variáveis primitivas e Controle de fluxo

Compiladores Ambiente de Execução

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

Estruturas de seleção. Prof.: Jesus

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

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

Compiladores Análise Semântica

Python e sua sintaxe LNCC UFRJ

Transcrição:

ompiladores Análise Léxica Bruno Lopes Bruno Lopes ompiladores 1 / 31

Front-end Lida com a linguagem de entrada Teste de pertinência: código fonte linguagem fonte? Programa está bem formado? Sintaticamente? Semanticamente? ria um código intermediário Bruno Lopes ompiladores 2 / 31

Front-end ódigo Fonte Analisador Léxico Token Analisador Sintático Árvore Sintaxe de Gerador de ódigo Intermediário ódigo de três endereços Tabela de Símbolos Bruno Lopes ompiladores 3 / 31

Scanner onstrução onverter uma especificação de linguagem em código. 1 Escrever expressão regular para representar a linguagem 2 onstruir NFA para reconhecer a linguagem, a partir das ERs 3 Transformar NFA em DFA 4 Minimizar DFA 5 Transformar em código Bruno Lopes ompiladores 4 / 31

ódigo simples //estado 1 if (the next character is a letter) advance the input; // estado 2 while (the next character is a letter or digit) // permanece no estado 2 advance the input // vai para o estado 3, sem avançar a entrada accept; else error; Bruno Lopes ompiladores 5 / 31

Autômatos Finitos: implementação omo traduzir qualquer DFA? omo ficará a complexidade do código se existirem muitos estados em caminhos arbitrários? Bruno Lopes ompiladores 6 / 31

other * / * * / q 0 q 1 q 2 q 3 q 4 other Bruno Lopes ompiladores 7 / 31

if (next character is "/") advance the input; if (next character is "*" advance the input; done = false; while (! done ) while (next character is not "*") advance the input; advance the input; while (next character is "*") advance the input; if (next character is "/") done = true; advance the input accept; Bruno Lopes ompiladores 8 / 31

É possível melhorar Usar uma variável para manter o estado corrente Usar um case dentro do loop um comando para testar o estado corrente um comando para testar o caracter de entrada Bruno Lopes ompiladores 9 / 31

state = 1 while (state = 1 or state = 2) case state: 1: case input character letter: advance the input; state = 2 else state =... (erro, p.ex.) 2: case input character letter or digit: advance the input; state = 2 else state = 3 if state = 3; accept Bruno Lopes ompiladores 10 / 31

DFA como uma tabela de transições caracteres no alfabeto estados estados representando transições com o caracter aceitação? Bruno Lopes ompiladores 11 / 31

Tabela de transição letra letra dígito outro aceitação 1 2 3 não 2 2 2 3 sim 3 3 3 3 não 1 letra 2 dígito outro outro 3 qualquer Bruno Lopes ompiladores 12 / 31

ódigo dirigido à tabela state = 1 ch = next input character while (not Accept[state] and not error(state)) newstate = T[state, ch]; if (Advance[state, ch]) ch = next input character state = newstate; if (Accept[state]) accept; Bruno Lopes ompiladores 13 / 31

Vantagens código reduzido fácil de manter genérico Desvantagens Tabela pode ficar muito grande Bruno Lopes ompiladores 14 / 31

Linguagem Tiny Variáveis inteiras Declaração a partir da atribuição de valores ontrole com if e repeat if termina com end e tem um else opcional omentários entre chaves Expressões aritméticas e booleanas Bruno Lopes ompiladores 15 / 31

Scanner para a Tiny Tokens palavras reservadas: if, then, else, end, repeat, until, read, write Símbolos especiais: +, -, *, /, =,, (, ), ;, := números: 1 ou mais dígitos identificadores: 1 ou mais letras Bruno Lopes ompiladores 16 / 31

Scanner para a Tiny omentários entre chaves espaços em branco são ignorados Princípio de reconhecimento da string mais longa Palavras reservadas tratadas como identificador (categoria sintática?) ERs simples DFA? Bruno Lopes ompiladores 17 / 31

Scanner para a Tiny omentários entre chaves espaços em branco são ignorados Princípio de reconhecimento da string mais longa Palavras reservadas tratadas como identificador (categoria sintática?) ERs simples DFA? Bruno Lopes ompiladores 17 / 31

{Exemplo de programa em Tiny - Fatorial} read x; {inteiro de entrada} if x > 0 then {express~ao booleana} fact := 1; repeat fact := fact * x; x := x + 1; until x = 0; write fact; end Bruno Lopes ompiladores 18 / 31

Geradores de Scanner Lex and Flex seguem o caminho usual Algoritmos são bem conhecidos e entendidos Problema chave: interface para o parse Bruno Lopes ompiladores 19 / 31

Lex Gerador de analisador léxico Entrada: ERs Saída: lex.yy.c Bruno Lopes ompiladores 20 / 31

Formato de entrada {definitions} %% {rules} %% {auxiliary routines} Bruno Lopes ompiladores 21 / 31

Lex com Tiny arquivo de entrada para o lex com as especificações da linguagem executa lex com esse arquivo de entrada: produz lexyy.c com o analisador léxico de Tiny compila lexyy.c executa com um programa escrito em Tiny Devolve os tokens do programa Bruno Lopes ompiladores 22 / 31

JFlex Gerador de analisador léxico Java, inspirado no Lex código Java (entra no arquivo de classe do scanner, %% opç~oes e declaraç~oes (como o scanner é gerado) %% regras do scanner (ERs e aç~oes) mas fora Bruno Lopes ompiladores 23 / 31

Regras e ações Formato EXPRESSAOREGULAR ÓDIGO JAVA O código é inserido no método do scanner que fornece um token para pegar o valor do lexema, use yytext() Deve incluir um return <<EOF>> indica fim do arquivo [0-9]+ { return new Token(Token.NUM, yytext(), yyline); } Bruno Lopes ompiladores 24 / 31

Regras e ações Ao consumir a entrada, o scanner determina a porção regular mais longa correspondente Se existir mais de uma, ele escolhe a que foi definida primeiro Se não existir nenhuma, dá uma mensagem de erro Bruno Lopes ompiladores 25 / 31

Estados Ao consumir a entrada, o scanner determina a porção regular mais longa correspondente Usados para restringir o conjunto de expressões regulares que podem ser associadas a uma entrada Podem ser exclusivos ou não Expressão regular será correspondente a uma entrada quando conjunto de estados léxicos inclui o estado ativo do scanner conjunto de estados está vazio e o estado léxico não é exclusivo Bruno Lopes ompiladores 26 / 31

Estados Estado corrente ativo pode ser alterado com o método yybegin() Estado inicial é o YYINITIAL (inclusivo), default Uma lista de estados pode ser associada com uma ER Bruno Lopes ompiladores 27 / 31

Exemplo %states A, B %xstates %% // n~ao tem estado listado: match com todos os estados, // exceto com (exclusivo) expr1 { yybegin(a); action } <YYINITIAL, A> expr2 { action } <A> { expr3 { action } <B,> expr4 { action } Bruno Lopes ompiladores 28 / 31

Uso de estados: regras léxicas distintas para entradas iguais HTML: regras léxicas para elementos que aparecem dentro ou fora de uma tag Entradas que não podem ser reconhecidas por expressões regulares aninhamento de comentários /* começa o primeiro /* aqui tem outro */ termina o primeiro */ Bruno Lopes ompiladores 29 / 31

Exemplo %state TAG // seç~ao de declaraç~oes %% <YYINITIAL> {//seç~ao de regras [<] { yybegin(tag); return new Token( < ); } [^<]+ { return new Token(TOKEN.PALAVRA, yytext()); } } <TAG> { [>] { yybegin(yyinitial); return new Token( > );... outras regras... } Bruno Lopes ompiladores 30 / 31

omo estados poderiam ser usados para controlar comentários aninhados? Implemente a entrada para o JFlex e o que mais for necessário para reconhecer uma linguagem de calculadora. Além de números inteiros e com ponto flutuante, os operadores permitidos são (,),+,-,*,/,//,**. Qualquer outro símbolo deve gerar um erro Bruno Lopes ompiladores 31 / 31