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

Documentos relacionados
Estrutura geral de um compilador programa-fonte

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

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

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

Compiladores Aula 2. Celso Olivete Júnior.

Compiladores Aula 3. Celso Olivete Júnior.

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

Como construir um compilador utilizando ferramentas Java

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

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

Compiladores - Autômatos

IV.2 Aspectos Léxicos Convencionais

Compiladores. Análise Léxica

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Compiladores - Análise Léxica

Análise sintática. Prof. Thiago A. S. Pardo Tratamento de erros sintáticos

Linguagens Formais e Autômatos

Linguagens Formais e Autômatos

Prof. Adriano Maranhão COMPILADORES

Compiladores - Análise Léxica

Compiladores 02 Analise léxica

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

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS

Linguagens de Programação Aula 5

Análise semântica. Função, interação com o compilador Tabela de símbolos Análise semântica. Prof. Thiago A. S. Pardo

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

Conceitos de Linguagens de Programação

Linguagens de Programação

Análise sintática. Prof. Thiago A. S. Pardo. Análise sintática ascendente

Linguagens de Domínio Específico

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

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

FACULDADE LEÃO SAMPAIO

Linguagens de Programação Aula 4

Introdução à Programação

Análise semântica. Função, interação com o compilador Tabela de símbolos Análise semântica. Prof. Thiago A. S. Pardo

Compiladores Aula 12. Celso Olivete Júnior.

INE5622 INTRODUÇÃO A COMPILADORES

Análise sintática. Questão. E se a análise sintática pudesse ser modelada por autômatos?

Alfabeto, Cadeias, Operações e Linguagens

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

Linguagens de Programação Aula 3

Compilação da linguagem Panda

Tokens, Padroes e Lexemas

Compiladores. Conceitos Básicos

Conceitos de Linguagens de Programação

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

Compiladores. Análise Léxica

Lex Adaptação da obra original de Tom Niemann

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

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

Histórico e motivação

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

As fases de um compilador

Introdução parte II. Compiladores. Mariella Berger

Linguagens de Programação

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

Compiladores Aula 1. Celso Olivete Júnior.

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

CAP. VI ANÁLISE SEMÂNTICA

Análise Sintática Introdução

Aspectos do analisador sintático Usabilidade da Dias de atraso

As fases de um compilador

Compiladores. Introdução

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

Noções de compilação

Compiladores - Análise Ascendente

Noções de compilação

Paradigmas de Programação

Compiladores - Análise Ascendente

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

Semântica Denotacional

CP Compiladores I Prof. Msc.. Carlos de Salles

Compiladores - Especificando Sintaxe

Implementação do Analisador Léxico

II.1 Conceitos Fundamentais. Uma delas é programar o =>

Folha 3 - Análise léxica

Compiladores I Prof. Ricardo Santos (cap 1)

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

Compiladores. Introdução à Compiladores

Projeto de Compiladores

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

Programa fonte token padrões lexema Tokens

Descrição da Linguagem Pascal Jr.

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

Introdução aos Compiladores

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

Análise semântica (continuação)

Paradigmas de Programação

Analisador Léxico parte II

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

Plano da aula. Compiladores. Os erros típicos são sintáticos. Análise Sintática. Usando Gramáticas. Os erros típicos são sintáticos

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

Análise Sintática II: Analisadores Descendentes Preditivos

Linguagens Formais e Autômatos

ALGORITMOS E TÉCNICAS DE PROGRAMAÇÃO

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

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Transcrição:

Análise léxica Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros Prof. Thiago A. S. Pardo 1 Estrutura geral de um compilador programa-fonte analisador léxico Tabela de símbolos analisador sintático Tabela de palavras e símbolos reservados analisador semântico gerador de código intermediário otimizador de código Manipulação de erros gerador de código programa-alvo dados de entrada saída 2 1

Analisador léxico Primeira etapa de um compilador Função Ler o arquivo com o programa-fonte Identificar os tokens correspondentes Relatar erros (de forma muito limitada) Exemplos de tokens Identificadores Palavras reservadas e símbolos especiais Números 3 Exemplo x:=y*2; Cadeia Token x id := simb_atrib y id * simb_mult 2 num ; simb_pv 4 2

Exemplo: usando códigos numéricos x:=y*2; Token Código id 1 num 2 simb_mult 3 simb_atrib 4 simb_pv 5 Cadeia Token x 1 := 4 y 1 * 3 2 2 ; 5 5 Exemplo program p; var x: integer; begin x:=1; while (x<3) do x:=x+1; end. 6 3

Exemplo program p; var x: integer; begin x:=1; while (x<3) do x:=x+1; end. Cadeia Token program simb_program p id ; simb_pv var simb_var x id : simb_dp integer simb_tipo ; simb_pv begin simb_begin x id := simb_atrib 1 num ; simb_pv while simb_while ( simb_apar x id < simb_menor 3 num ) simb_fpar do simb_do x id := simb_atrib x id + simb_mais 1 num ; simb_pv end simb_end. simb_p 7 Analisador léxico Em geral, subordinado ao analisador sintático Sub-rotina do analisador sintático: a cada chamada, o analisador léxico retorna para o analisador sintático uma cadeia lida e o token correspondente O analisador sintático combina os tokens e verifica a boa formação (sintaxe) do programa-fonte usando a gramática da linguagem programafonte Analisador léxico obter próximo token token Analisador sintático 8 4

Analisador léxico Há necessidade dessa interação com o analisador sintático? Não se poderia pré-processar o arquivo todo e produzir um tabelão com os tokens? programafonte Analisador léxico obter próximo token token Analisador sintático 9 Por que separar o analisador léxico do sintático? 10 5

Por que separar o analisador léxico do sintático? Modularização Projeto mais simples de cada etapa Maior eficiência de cada processo: possibilidade de uso de técnicas específicas e métodos de otimização locais Maior portabilidade: especificidades da linguagem de programação podem ser resolvidas na análise léxica Facilidade de manutenção É mais fácil para o analisador léxico separar identificadores de palavras reservadas 11 Outras funções do analisador léxico Consumir comentários e caracteres não imprimíveis (espaço em branco, tabulação, código de nova linha) Se a gramática fosse se responsabilizar por isso, ela seria demasiadamente complicada Por quê? Possível manipulação da tabela de símbolos Relacionar as mensagens de erro emitidas pelo compilador com o programa-fonte Deve-se manter contagem do número de linhas Diagnóstico e tratamento de erros 12 6

Erros léxicos Erros possíveis de serem checados nessa etapa Símbolo não pertencente ao conjunto de símbolos terminais da linguagem: @ Identificador mal formado: j@, 1a Tamanho do identificador: minha_variável_para_... Número mal formado: 2.a3 Tamanho excessivo do número: 5555555555555555 Fim de arquivo inesperado (comentário não fechado): {... Char ou string mal formados: a, hello world São limitados os erros detectáveis nessa etapa Visão local do programa-fonte, sem contexto fi (a>b) then... 13 Projeto do analisador léxico É desejável que se usem notações formais para especificar e reconhecer a estrutura dos tokens que serão retornados pelo analisador léxico Evitam-se erros Mapeamento mais consistente e direto para o programa de análise léxica Notações Gramáticas ou expressões regulares: especificação de tokens Autômatos finitos: reconhecimento de tokens 14 7

Expressões regulares Determinam conjuntos de cadeias válidas Linguagem Exemplos Identificador: letra ( letra dígito ) * Número inteiro sem sinal: dígito + Número inteiro com sinal: ( + - ) dígito + 15 Autômatos finitos Modelos matemáticos Conjunto de estados S Conjunto de símbolos de entrada Σ Funções de transição que mapeiam um par estado-símbolo de entrada em um novo estado Um estado inicial s 0 Um conjunto de estados finais F para aceitação de cadeias Reconhecimento de cadeias válidas Uma cadeia é reconhecida se existe um percurso do estado inicial até um estado final 16 8

Exemplo S={0,1,2,3}, Σ={a,b}, s 0 =0, F={3} a a b b 0 1 2 3 b Quais cadeias esse autômato aceita? (a b) * abb 17 Exemplo Representação em tabela de transição Vantagem: elegância e generalidade Desvantagem: pode ocupar grande espaço quando o alfabeto de entrada é grande; processamento mais lento a a b b 0 1 2 3 b Estado Símbolo de entrada a b 0 {0,1} {0} 1 --- {2} 2 --- {3} 18 9

Execução do autômato Se autômato determinístico (i.e., não há transições λ e, para cada estado s e símbolo de entrada a, existe somente uma transição possível), o seguinte algoritmo pode ser aplicado s:=s 0 enquanto (c<>eof) faça s:=transição(s,c) fim se s for um estado final então retornar cadeia aceita 19 Exemplo de execução do autômato s:=s 0 enquanto (c<>eof) faça s:=transição(s,c) fim se s for um estado final então retornar cadeia aceita Estado Símbolo de entrada a b 0 {1} {0} 1 --- {2} 2 --- --- S={0,1,2}, Σ={a,b}, s 0 =0, F={2} b a b 0 1 2 Reconhecer cadeia bab 20 10

Execução do autômato Se autômato não determinístico, pode-se transformá-lo em um autômato determinístico Para a aplicação em compiladores, em geral, é muito simples construir um autômato determinístico 21 Execução do autômato Opção: incorporação das transições no código do programa Tabela de transição não é mais necessária s:=s 0 enquanto (verdadeiro) faça case (s) 0: se (c=a) então s:=1 senão se (c=b) então s:=0 1: se (c=b) então s:=2 2: se (c=eof) então retornar cadeia aceita fim b a b 0 1 2 22 11

Execução do autômato Solução ad hoc b se (c= b ) então enquanto (c=b) faça se (c= a ) então 0 a 1 b 2 se (c= b ) e (acabou cadeia de entrada) então retornar cadeia aceita senão se (c= a ) então se (c= b ) e (acabou cadeia de entrada) então retornar cadeia aceita 23 Tokens de um programa Exemplos de tokens possíveis Identificadores: x, y, minha_variável, meu_procedimento Palavras reservadas e símbolos especiais: while, for, :=, <> Números inteiros e reais Não basta identificar o token, deve-se retorná-lo ao analisador sintático junto com a cadeia correspondente 1. Concatenação da cadeia conforme o autômato é percorrido 2. Associação de ações semânticas aos estados finais do autômato Às vezes, para se decidir por um token, tem-se que se ler um caractere a mais, o qual deve ser devolvido à cadeia de entrada depois 24 12

Tokens de um programa Autômato para os símbolos := e : q0 : q1 = q2 outro q3 retornar(:=,simb_atrib) retornar(:,simb_dp) retroceder() 25 Tokens de um programa Exercício: autômato para operadores relacionais >, >=, <, <=, = e <> 26 13

Tokens de um programa Exercício: autômato para operadores relacionais >, >=, <, <=, = e <> q0 < q1 = q2 > > = outro q3 q4 q5 retornar(<=,simb_menor_igual) retornar(<>,simb_dif) retornar(<,simb_menor) retroceder() retornar(=,simb_igual) q6 = q7 retornar(>=,simb_maior_igual) outro q8 retornar(>,simb_maior) retroceder() 27 Tokens de um programa Autômato para identificadores: letra seguida de qualquer combinação de letras e dígitos 28 14

Tokens de um programa Autômato para identificadores: letra seguida de qualquer combinação de letras e dígitos letra dígito q0 letra q1 outro q2 retornar(cadeia,id) retroceder() 29 Tokens de um programa Autômato para palavras reservadas: while, if, for, array, etc. Opções Fazer um autômato para cada palavra-reservada Trabalhoso e ineficiente Deixar que o autômato para identificadores reconheça as palavras reservadas e, ao final, verifique na tabela de palavras reservadas se se trata de uma palavra reservada Simples e elegante letra dígito q0 letra q1 outro q2 se busca_tabela(cadeia)=verdadeiro então retornar(cadeia,cadeia/token) senão retornar(cadeia,id) retroceder() 30 15

Tokens de um programa Autômato para consumir caracteres não imprimíveis: espaços em branco, tabulações e códigos de nova linha O analisador léxico não deve produzir tokens para esses símbolos \t \n letra dígito q0 letra q1 outro q2 se busca_tabela(cadeia)=verdadeiro então retornar(cadeia,cadeia/token) senão retornar(cadeia,id) retroceder() 31 Tokens de um programa Exercício Construir autômatos para se reconhecer Números inteiros com e sem sinal: 5, -1, 100 Números reais: 3.11, 0.1 32 16