Ferramentas para a Construção de Compiladores: Lex & Yacc

Slides:



Advertisements
Apresentações semelhantes
Software Básico Silvio Fernandes
Advertisements

Tópicos em Compiladores
Introdução à Ciência da Computação Linguagens de Programação.
Compiladores Claudio Benossi
II – Análise léxica DEI Papel do analisador léxico.
II – Análise léxica DEI Conversão de expressões regulares em autómatos finitos determinísticos mínimos Bibliografia aconselhada: Aho, Sethi e Ullman –
II – Análise léxica DEI lex: linguagem de especificação para analisadores léxicos Implementação de simuladores de autómatos finitos Bibliografia aconselhada:
III – Análise sintáctica
I - Noções dum compilador Partes dum compilador Ferramentas de construção de compiladores Bibliografia aconselhada: –Aho, Sethi e Ullman – Cap. 1 LFA 1999/2000.
III – Análise sintáctica
III – Análise sintáctica
III – Análise sintáctica Geradores de parsers Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.9 LFA 1999/ Jorge Morais.
Compiladores I Cristiano Damiani Vasconcellos
03/08/2011 Professor Leomir J. Borba- –
Deyvisson, Rafael M.P., Renato, Robson C.F., Rodolfo
Software Básico Silvio Fernandes
Introdução à Programação
Introdução à Compilação Prof. Leandro Magno Slides adaptados a partir do material cedido pelos professores Heloise Manica Paris Teixeira, Yandre M. G.
EXPRESSÕES ARITMÉTICAS
JavaCC e JJTree Geração de compiladores implementados em Java
LINGUAGEM C.
INTRODUÇÃO À PROGRAMAÇÃO
Curso Sistemas de Informação Disciplina: Arquitetura de Software
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
YACC.
Lex e Yacc.
Relações em uma Gramática
Linguagem de Prog. e Programas
Construção de Compiladores
5.6 – Complementos de Yacc – Usando Yacc com gramáticas ambíguas
André Luis Meneses Silva
Revisão da Linguagem C.
Prof. Bruno Moreno Aula 4 – 11/03/2011
Análise Semântica e Representação Intermédia
DSC/CCT/UFCG Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel José Eustáquio Rangel de Queiroz Roberto.
PROGRAMAÇÃO I UNIDADE 1.
Análise léxica e sintática
Lex Linguagem (e compilador) para especificar analisadores léxicos.
Análise léxica e sintática
1 Funções (versão C) Funções são pedaços de código encapsulados para fácil acesso. Em C e C++ o processo de construção de uma função passa por 2 etapas.
Aula 17 1 Análise Sintáctica Compiladores, Aula Nº 17 João M. P. Cardoso.
Compiladores, Aula Nº 10 João M. P. Cardoso
Análises léxica e sintática
Análise léxica e sintática
Mayerber Carvalho Neto
ENGA78 – Síntese de Circuitos Digitais
1 2 Observa ilustração. Cria um texto. Observa ilustração.
1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.
Capítulo II Gramáticas e Linguagens
Analise sintática aula-07-analise-sintática.pdf.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Análise Sintática LR Prof. Alexandre Monteiro
Análises léxica e sintática
Analisador Léxico Prof. Alexandre Monteiro
Compiladores Análise Léxica
Análise Léxica Prof. Alexandre Monteiro
Tradução Dirigida por Sintaxe
CES-41 COMPILADORES Aulas Práticas Capítulo II A Ferramenta Yacc.
Analisador Léxico.
CES-41 COMPILADORES Aulas Práticas
Revisão Compiladores – AP1
Faculdade Pernambucana - FAPE Setembro/2007
COMPILADORES 04 Prof. Marcos.
Geradores de analisadores léxicos
JavaCC.
Sintaxe de uma Linguagem
Lex e Yacc Compiladores Giovani Rubert Librelotto
PLP – JavaCC Java Compiler Compiler
Compilador Software que traduz o texto (linguagem fonte) que representa um programa para código máquina(linguagem alvo) capaz de ser executado pelo.
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
Transcrição da apresentação:

Ferramentas para a Construção de Compiladores: Lex & Yacc Disciplina: Compiladores Professor: Marcelo Morandini Monitor: Alysson Neves Bessani Adaptação: Claudio Cesar de Sá claudio@joinville.udesc.br 14/08/2000 DIN - UEM

Construção de Compiladores Analisadores Léxico (scanners), Sintático (parsers), e Semântico, Tabela de Símbolos e Gerador de Código; Grande volume de código; Codificação complexa e repetitiva; Altamente propensa a erros; Desejável a utilização de ferramentas.

Tipos de Ferramentas Geradores de analisadores léxicos. Ex: lex, flex, javacc, ... Geradores de analisadores semânticos. Ex: yacc, bison, javacc, ... Geradores de geradores de código: Transformam uma LI (linguagem intermediária) em código assembly da máquina alvo.

Lex & Yacc Ferramentas largamente utilizadas no mundo UNIX; Lex: gerador de scanners(yylex()); Yacc: gerador de parsers(yyparse()); Trabalham juntos na construção de parsers.

Relação Lex, Yacc, Sistema yylex() yyparse() “Backend” do Compilador Sistema de I/O 1 n

Lex Gerador de scanners; Pode ser utilizado para reconhecimento de qualquer tipo de expressão regular; Expressões regulares são transformadas em autômatos; Para cada expressão regular especificada deve-se definir uma ação (código em C);

Formato do Arquivo Lex declarações %% regras subrotinas de apoio

Lex: Declarações Códigos em C: Abreviações: %{ /* coloque qualquer código em C... */ #define FOO 1 /* ... como defines ou macros ... */ int tokval = 0; /* ... ou variáveis globais */ %} Abreviações: AB (‘a’|’b’) /* AB é uma abreviação de a|b */

Lex: Regras Formato básico: Expressões Regulares: <expressão regular 1> <ação 1> <expressão regular 2> <ação 2> ... <expressão regular n> <ação n> Expressões Regulares: Definições regulares; Exemplos: [abcD]+ (a|b|c|D) (a|b|c|D)* .\+ ?+

Lex: Regras (cont) Expressões Regulares(cont): Ações: Exemplos (cont): {AB} /* abreviação AB */ Ações: Código em C; Variáveis Importantes: char yytext[]: texto reconhecido pela ER associada a ação; unsigned int yyleng:tamanho do texto;

Lex: Subrotinas auxiliares Qualquer função definida em C; Normalmente utiliza-se esta seção para construção de funções de apoio nas ações; Este trecho não é alterado no scanner gerado.

Lex: Pequeno Exemplo %{ #include <stdio.h> #include ‘y.tab.h’ /* header que define os tokens */ int numc = 0, idc = 0, tok = 0; %} NUM [0-9] ID [a-zA-Z_$] [a-zA-Z0-9_$]* %% {NUM} {numc++; tok = TNUM; return get_number();} /* continua */

Lex: Pequeno Exemplo (cont) /* continuação */ {ID} {idc++; tok = TID; return do_table();} \+ {return tok = TADD;} - {return tok = TSUB;} %% int get_number(){ return atoi(yytext); } int do_table(){ /* instala o ID na tabela de símbolos ou retorna seu valor corrente */

Yacc: Yet Another Compiler-Compiler Gerador de parsers; Transforma uma gramática que define uma linguagem em um autômato de pilha que reconhece esta linguagem (implementado em C); Para cada produção da gramática existe uma ação semântica.

Formato do Arquivo Yacc declarações %% regras de tradução subrotinas de apoio

Yacc: Declarações Códigos em C (de maneira semelhante ao Lex) entre %{ %}; Definição de tokens: %token T1 T2 T3 ... TN Definição de regras auxiliares para solução de ambigüidades: Exemplos: %right ‘+’ %start S

Yacc: Regras de Tradução Semelhantes a definições gramaticais; Cada símbolo (terminal ou não) tem associado a ele uma pseudo variável; O símbolo do lado esquerdo tem associado a ele o $$; A cada símbolo i associa-se um $i; $i contém o valor do token (retornado por yylex()) se o símbolo i for terminal, caso contrário contém o $$ do não terminal.

Yacc: Regras de Tradução (cont) As regras são da forma: /* uma gramática definida assim: */ <lado esquerdo> := <alt1>|<alt2>|...|<altN> /* transforma-se na seguinte especificação yacc */ <lado esquerdo>: <alt1> {/*ação semântica 1*/} | <alt2> {/*ação semântica 2*/} ... | <alt3> {/*ação semântica N*/} ;

Yacc: Subrotinas auxiliares Funções em C que são copiadas para o parser gerado; Funciona de maneira semelhante as subrotinas auxiliares do Lex; Se o Lex não for usado para especificação do analisador léxico a função yylex() deve ser implementada aqui.

Yacc: Pequeno Exemplo %{ #define <stdio.h> %} %start init %token TNUM TID TADD TSUB %% init : expr ‘\n’ {printf(‘r: %d’,$1);} ; /* continua */

Yacc: Pequeno Exemplo (cont) /* continuação */ expr : expr TADD expr {$$ = $1 + $3;} | expr TSUB expr {$$ = $1 - $3;} | ‘(’ expr ‘)’ {$$ = $2;} | TNUM %% /*subrotinas em C, se necessário */

Lex & Yacc: Como Utilizar Arquivos Lex são por convenção terminados com .l e os do Yacc são terminados em .y; Utilizando o Yacc: yacc -d <arquivo.y> Obs: A opção -d faz com que se crie o arquivo .h com a definição dos tokens; Obs: Use a opção -v para gerar o arquivo y.output, que descreve o autômato de pilha gerado.

Lex & Yacc: Como Utilizar (cont) Utilizando Lex: lex <arquivo.l> Compilando e gerando o parser: cc -o <programa alvo> lex.yy.c y.tab.c -ly -ll Obs: lex.yy.c é o scanner gerado pelo lex; Obs: y.tab.c é o parser gerado pelo yacc; Obs: y é a biblioteca do yacc e ela deve ser colocada antes da biblioteca do lex (l).

Bibliografia Aho, Alfred V. et all. Compiladores: Princípios, Técnicas e Ferramentas. Livros Técnicos e Científicos (tradução). 1986. EUA. Sun Microsystems. Solaris Programing Utilities Guide. 1994. USA. UNIX Man Pages: lex (1) e yacc (1).