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

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

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

Compiladores - JACC. Fabio Mascarenhas

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

1 d=

Analisador Léxico parte II

Compiladores / YACC Professor Ariel da Silva Dias YACC. Adaptação da obra original de Tom Niemann

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

Análise Bottom-Up. Compiladores. Parsing LR. Tabela Ações/Transições. Análise LR. Construindo tabelas LR

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

Compiladores. Fabio Mascarenhas

O que faz/o que é Como usar Como funciona Formato geral do Arquivo Submetido ao Lex ER estendidas Exemplos The Lex & YACC page:

Utiliza Expressões Regulares (ER) Estendidas para definir a especificação da análise léxica desejada

Lex Adaptação da obra original de Tom Niemann

Linguagens de Programação

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

Introdução à Programação

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

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

CP Compiladores I Prof. Msc.. Carlos de Salles

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

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

Compiladores I Prof. Ricardo Santos (cap 1)

Linguagens e Programação BISON. Paulo Proença

Identificação do discente: Matrícula: Nome completo: Douglas Godeguez Nunes. Curso: Ciência da Computação

Linguagem C. André Tavares da Silva.

Processamento de Linguagens I LESI + LMCC (3 o ano)

Programa fonte token padrões lexema Tokens

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

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

Compiladores I. Caracterizar um método de análise bottom-up. Compreender os mecanismos básicos envolvidos no processo de análise LR.

Ambiente de desenvolvimento

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Análise Sintática Introdução

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

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

Compiladores. Conceitos Básicos

Introdução à Programação. Introdução a Linguagem C. Prof. José Honorato F. Nunes

Compiladores. Análise Léxica

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Compiladores. Introdução

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

Questão Aula Tipo - Flex+Bison

Compilação da linguagem Panda

Desenvolvimento de Aplicações Desktop

IV.2 Aspectos Léxicos Convencionais

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Compiladores 02 Analise léxica

Introdução ao FLEX e expressões regulares

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

Programação I A Linguagem C. Prof. Carlos Alberto

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

Laboratório de Introdução à Ciência da Computação I

Familiarização com a ferramenta JavaCC

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Laboratório de Introdução à Ciência da Computação I

1. Lex & YACC. 2. Lex. O que podem fazer por você. O que cada programa faz. Casando expressões regulares

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

Introdução à Programação em C Input / Output

Linguagens de Programação Aula 5

Implementação do Analisador Léxico

COMPILAÇÃO. Ricardo José Cabeça de Souza

LEX & YACC / FLEX & BISON. Uso prático... LEX: Tokenizer LEX & YACC / FLEX & BISON. Uso do Flex:

Compiladores Ficha de exercícios práticos

Compiladores. Análise Léxica

Linguagens Formais e Autómatos

Algoritmos e Programação

Fundamentos de Programação

A linguagem C (visão histórica)

Manipulação de Arquivos Exercício/Exemplo:

Paradigmas de Programação

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Linguagem C: Introdução

Revisão. Fases da dacompilação

FACULDADE LEÃO SAMPAIO

Projeto de Compiladores

PROGRAMAÇÃO I. Introdução

Compiladores - Análise Léxica

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

Algoritmos RESUMO - LINGUAGEM C

3. Linguagem de Programação C

Linguagem de Programação

15/03/2018. Professor Ariel da Silva Dias Aspectos sintáticos e semânticos básicos de linguagens de programação

Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR

Introdução a Linguagem C. Prof. Me. Hélio Esperidião

Universidade Federal de Alfenas

Conceitos de Linguagens de Programação

Compiladores - Análise Léxica

CAP. VI ANÁLISE SEMÂNTICA

3.1 - Funções para manipular dados de entrada e saída padrão

Compiladores Aula 1. Celso Olivete Júnior.

Revisão de Programação em C++ Leandro Tonietto Estruturas de Dados em C++ Segurança da Informação

Prof. Adriano Maranhão COMPILADORES

Transcrição:

Ferramentas Flex/Bison Prof. Sergio F. Ribeiro Lex e Yacc / Flex e Bison São ferramentas de auxílio na escrita de programas que promovem transformações sobre entradas estruturadas. São ferramentas desenvolvidas para programadores de compiladores e interpretadores. Permitem um rápido desenvolvimento de protótipos e uma manutenção simples do software. Tanto o Lex como o Yacc foram desenvolvidos nos Bell Laboratories. 2

Lex e Yacc / Flex e Bison Papel do Lex: toma um conjunto de expressões regulares e produz uma rotina C que irá executar a análise léxica identificando os tokens. Papel do Yacc: toma uma descrição concisa de uma gramática e produz uma rotina C que irá executar a análise sintática ou parsing. 3 Gerador de Analisador Sintático É uma ferramenta similar e complementar ao gerador de analisador léxico. Ferramentas mais comuns: yacc (yet another compiler-compiler) oubison. Lex gera a função yylex() que retorna o identificador de um item léxico reconhecido. Yacc gera a função yyparse() que analisa os itens léxicos e decide se eles formam ou não uma sentença válida. 4

Gerador de Analisador Sintático Criando um tradutor de entrada/saída com Yacc: Especificação Yacc translate.y y.tab.c Compilador Yacc Compilador C y.tab.c a.out entrada a.out saída 5 Formato Geral do Programa Yacc Constituído de três seções: definições (declaração de nomes e tipos de tokens, de variáveis, etc.) %% regras de tradução (contém as produções da gramática) símbolo : derivações {ações semânticas} %% rotinas do usuário (contém o main(l) e outras rotinas de suporte em C) 6

Especificação Bison Uma especificação bison descreve uma gramática livre do contexto que pode ser usada para gerar um parser. Ela possui elementos membros de 4 classes: Elementos léxicos ou tokens, que é o conjunto de símbolos terminais; Elementos sintáticos, que são símbolos não-terminais. Regras de produção, que definem símbolos não-terminais em termos de sequência de terminais e não-terminais; Uma regra start, que reduz todos os elementos da gramática para uma regra. 7 Especificação Bison A cada regra está associado um símbolo não-terminal (lado esquerdo). As definições (lado direito) consistem de zero ou mais símbolos terminais (tokens ou caracteres literais) ou não-terminais. Tokens são símbolos terminais reconhecidos pelo analisador léxico, apenas no lado direito das regras. A cada regra pode ser associada uma ação em C. Estas ações ficam entre chaves ( { } ) e ditam o que deve ser feito pra cada produção reconhecida. 8

Especificação Bison Os nomes de símbolos podem ter qualquer tamanho, consistindo de letras, ponto, sublinhado e números (exceto na primeira posição). Os nomes de não-terminais são usualmente especificados em minúsculos. Os terminais ou tokens, em maiúsculos. O bison transforma esta descrição da gramática, e ações associadas, em um parser (programa capaz de analisar uma sequência de tokens de entrada, detectar produções e agir sobre elas). 9 Especificação Bison Na seção de declarações (1ª seção): Códigos em C entre%{ e%} (como no flex). Definição de tokens: %token T1 Definição de regras auxiliares para a solução de ambiguidades, como por exemplo: %left MAIS MENOS %left VEZES DIVIDIR %left MENOS_UNARIO 10

Especificação Bison Na seção de regras de produção (2ª seção): uma gramática definida assim: lado_esquerdo alt1 alt2... altn transforma-se na seguinte especificação yacc Lado_esquerdo : alt1 {/*ação 1*/} alt2 {/*ação 2*/}... altn {/*ação N*/} ; 11 Especificação Bison Na seção de regras de produção (2ª seção): Cada símbolo (terminal ou não) tem associado a ele uma pseudo variável; O símbolo do lado esquerdo tem associada a ele a pseudo variável $$; Cada símbolo i da direita tem associada a ele a variável $i; $i contém o valor do token (retornado por yylex()) se o símbolo i for terminal, caso contrário contém o valor do $$ do não terminal; Ações podem ser executadas sobre estas variáveis. 12

Usando o Bison São 4 passos para criar um parser: Escrever uma especificação de uma gramática no formato do bison. O arquivo terá a extensão.y. Escrever uma especificação de um analisador léxico que pode produzir tokens; extensão.l. Executar o bison sobre a especificação.y e o flex sobre a especificação.l. Compilar e linkar os códigos fontes do parser, do analisador léxico e suas rotinas auxiliares. 13 Usando o Bison A saída do bison, yy.tab.c, contém a rotina yyparse que chama a rotina yylex para obter tokens. Como o Lex, o Bison não gera programas completos. Ayyparse deve ser chamada a partir domain. A rotina léxica lê a entrada, e a cada token encontrado, retorna o número do token ao parser. A rotina léxica pode também passar o valor do token usando a variável externa yylval (entre outras). Um programa completo também requer uma rotina de erro chamada yyerror. 14

Fluxo de Controle de um Tradutor main Entrada avaliada Retorna 0 se entrada é valida 1 se não yyparse( ) Requerer próximo token Valor da ação do processo yylval Retornar o token ou 0 se EOF Valor passado do token yylex( ) Ler chars da entrada input 15 Tradutor com Flex/Bison Veremos agora um exemplo de implementação de um analisador léxico e sintático usando as ferramentas Flex e Bison, respectivamente. No programa bison, será acrescentado regras semânticas de forma a termos no final a implementação de um tradutor. O objetivo é implementar um tradutor que calcule e traduza expressões aritméticas da forma infixa para a forma posfixa. 16

Gramática cmd ID=expr; expr expr+termo expr termo termo termo termo * fator termo / fator fator fator (expr) NUM ID 17 Esquema de Tradução cmd ID{imprimir ID.atr}=expr;{imprimir( = )} expr expr+termo {imprimir( + )} expr termo {imprimir( )} termo termo termo * fator {imprimir( * )} termo / fator {imprimir( / )} fator fator (expr) NUM{imprimir(NUM.atr)} ID{imprimir(ID.atr)} 18

Ferramentas As ferramentas Flex e Bison são projetos GNU obtidas no site: https://sourceforge.net/projects/gnuwin32/files/flex/2.5.4a- 1/flex-2.5.4a-1.exe/download http://downloads.sourceforge.net/gnuwin32/bison-2.4.1- setup.exe As ferramentas rodam em linha de comando no DOS. Os arquivos.lex e.y devem estar na pasta bin para serem reconhecidos pelas ferramentas. 19 Compilação Na linha de prompt, deve-se entrar com os seguintes comandos: flex arquivo1.lex bison d arquivo2.y obs: o parâmetro d é usado para se gerar arquivo.h Deve-se abrir oarquivo2.tab.c no DevC++ e compilar para gerar o executável arquivo2.tab.exe Este executável é o analisador/tradutor desejado. Depois de executado, entra-se com uma expressão infixa e o tradutor devolve a expressão posfixa correspondente e o valor resultante. 20

Programa.lex Analisador Léxico %{ #include "ypos.tab.h" #include <stdlib.h> extern int yylval; %} digito [0-9] letra [a-za-z] %% "+" {yylval = yytext[0]; return MAIS;} "-" {yylval = yytext[0]; return MENOS;} "*" {yylval = yytext[0]; return MULT;} "/" {yylval = yytext[0]; return DIV;} 21 Programa.lex Analisador Léxico "=" {yylval = yytext[0]; return ATRIB;} ";" {return PV;} "(" {return ABREPAR;} ")" {return FECHAPAR;} {digito} {yylval = atoi(yytext); return NUM;} {letra} {yylval = yytext[0]; return ID;} %% 22

Programa.y Analisador Sintático %{ #include <stdio.h> // To avoid warning, we include below definitions: int yylex(); void yyerror(const char *s); %} %token MAIS MENOS MULT DIV NUM ID ATRIB PV ABREPAR FECHAPAR %left ATRIB // Operator precedence and associativity %left MAIS MENOS %left MULT DIV 23 Programa.y Analisador Sintático %% cmd : ID ATRIB {printf("%c", $1);} expr PV {printf("%c", $2); printf("\n%d\n", $4);} ; expr : expr MAIS termo {$$ = $1 + $3; printf("%c", $2);} expr MENOS termo {$$ = $1 - $3; printf("%c", $2);} termo ; termo : termo MULT fator {$$ = $1 * $3; printf("%c", $2);} termo DIV fator {$$ = $1 / $3; printf("%c", $2);} fator ; 24

Programa.y Analisador Sintático fator : ABREPAR expr FECHAPAR {$$ = $2;} NUM {printf("%d", $1);} ID {printf("%c", $1);} ; %% #include "lex.yy.c" int main(){ yyparse(); return(0); } void yyerror(const char *s){ printf("\nerror\n"); } int yywrap(){ return 1; } 25