Compiladores - JACC. Fabio Mascarenhas

Documentos relacionados
Análise Sintática - Final

Compiladores - Análise SLR

Linguagens de Domínio Específico

Revisão. Fases da dacompilação

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

Compiladores - Análise Recursiva

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

Compiladores - Análise Recursiva

Familiarização com a ferramenta JavaCC

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

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.

Linguagens de Domínio Específico

Compiladores Análise Semântica

CP Compiladores I Prof. Msc.. Carlos de Salles

Compiladores Análise Semântica

I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1

Análise Sintática Introdução

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

Compiladores - Análise LL(1)

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

Análise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34

Compiladores - Análise LL(1)

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

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

Introdução à Programação

Analisador Léxico parte II

Análise Sintática. Fabiano Baldo

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

Compiladores - Gramáticas

Compiladores - JFlex. Fabio Mascarenhas

Pró-Reitoria Acadêmica Diretoria Acadêmica Assessoria Pedagógica da Diretoria Acadêmica

Compiladores - Análise Ascendente

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

Compiladores - Análise Ascendente

Compiladores - Especificando Sintaxe

Linguagens de Domínio Específico

Compilação: Erros. Detecção de Erros: * Analisadores Top-Down - Preditivo Tabular (LL) - Feito a mão. * Analisadores Botton-Up: - Shift-Reduce (SLR)

Linguagens de Domínio Específico

Compiladores - Gramáticas

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

Compiladores. Análise Léxica

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

Conceitos de Linguagens de Programação

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

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

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

Análise Sintática. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 18

Folha 4.2 Análise sintática ascendente

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

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

Conclusões. Baseado no Capítulo 9 de Programming Language Processors in Java, de Watt & Brown

Compiladores - Gramáticas

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

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

INE5318 Construção de Compiladores. AULA 4: Análise Sintática

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

FACULDADE LEÃO SAMPAIO

Linguagens de Domínio Específico

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação

Compiladores. Conceitos Básicos

Compiladores - Análise Preditiva

Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática

Análise sintática. Análise sintática ascendente. Parte-se dos símbolos terminais em direção ao símbolo inicial da gramática. Derivação mais à direita

Compiladores - Análise Preditiva

Como construir um compilador utilizando ferramentas Java

Compiladores Ficha de exercícios práticos

Análise Sintática. Compiladores Cristina C. Vieira. Compiladores 2012/2013

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

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

Análise Sintáctica. Definições: Conjuntos First() e Follow() Compiladores, Aula Nº 19 João M. P. Cardoso. Conjunto First(β)

Compiladores - Análise Léxica


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

CP Compiladores I Prof. Msc. Carlos de Salles

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

Linguagens de Programação Aula 4

Linguagens Formais e Autômatos

QUESTÃO 1 (0,6 ponto) Classifique os processadores de linguagens com relação aos tipos das linguagens-fonte e objeto.

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

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

Análise Sintática Bottom-up

Compiladores 02 Analise léxica

BNF (Backus-Naur Form) Gramática Livres de Contexto / Estruturas Recursivas

Tradução dirigida por sintaxe

Compiladores. Fabio Mascarenhas

Compilação da linguagem Panda

IV.2 Aspectos Léxicos Convencionais

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

Classes e Objetos. Sintaxe de classe em Java

Analisadores Descendentes Tabulares; Cjs First Follow

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

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

V Teoria de Parsing. Termos Básicos: Parser Analisador Sintático Parsing Analise Sintática Parse Representação da analise efetuada

RONALDO LIMA ROCHA CAMPOS GERADOR DE COMPILADORES

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

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

Transcrição:

Compiladores - JACC Fabio Mascarenhas - 2013.1 http://www.dcc.ufrj.br/~fabiom/comp

JACC Gerador de analisadores sintáticos LALR que gera código Java Sintaxe baseada na sintaxe do YACC (e de muitos outros geradores) Rápido, codifica o autômato LALR em código ao invés de usar uma tabela Usa o mesmo modelo de ações semânticas do YACC, o que permite gerar diretamente uma árvore sintática abstrata a partir da gramática

Usando o JACC Linha de comando: jacc X.jacc -v: escreve saída do autômato em arquivo X.output -h: escreve autômato em formato HTML no arquivo XMachine.html -fv, -fh: mostra conjuntos FIRST e FOLLOW para cada não-terminal em conjunto com as opções anteriores -a, -s, -0: usa estratégia de parsing LALR, SLR, ou LR(0)

Especificação JACC Formato do arquivo de entrada: diretivas %% regras %% código extra Diretivas controlam a geração do parser Regras especificam a gramática e as ações durante a análise Código extra é inserido dentro da classe do parser

Regras As regras são onde especificamos as regras da gramática, separando as alternativas de cada não-terminal com :, e terminando com expr : expr + term expr - term term term : term * fact term / fact fact fact : ( expr ) NUM Terminais (tokens) são caracteres entre ou nomes em maiúsculas

Ações de redução Cada alternativa pode ter código Java associado que é executado na redução, e pode dizer qual valor deve ser empilhado para aquela redução O valor retirado na pilha para cada símbolo da alternativa fica em pseudovariáveis $1, $2,..., e o valor da pseudo-variável $$ é empilhado expr : expr + term { $$ = new ast.soma($1, $3) } expr - term { $$ = new ast.sub($1, $3) } term // default { $$ = $1 } term : term * fact { $$ = new ast.mul($1, $3) } term / fact { $$ = new ast.div($1, $3) } fact fact : ( expr ) { $$ = $2 } NUM { $$ = new ast.num($1.val) }

Precedência e associatividade A gramática pode ser ambígua na parte dos operadores, usando as diretivas %left e %right para resolver a ambiguidade dando a precedência e associatividade dos mesmos Precedência é declarada da menor para a maior %left + - %left * / %right ^ %% expr : expr + expr { $$ = new ast.soma($1, $3) } expr - expr { $$ = new ast.sub($1, $3) } expr * expr { $$ = new ast.mul($1, $3) } expr / expr { $$ = new ast.div($1, $3) } expr ^ expr { $$ = new ast.exp($1, $3) } NUM { $$ = new ast.num($1.val) }

Operadores unários e binários Se um operador tem duas precedências, uma quando é unário e outra quando binário, deve-se usar um pseudo-token e a diretiva %prec na regra: %left + - %left * / %right ^ %left NEG %% expr : expr + expr { $$ = new ast.soma($1, $3) } expr - expr { $$ = new ast.sub($1, $3) } expr * expr { $$ = new ast.mul($1, $3) } expr / expr { $$ = new ast.div($1, $3) } expr ^ expr { $$ = new ast.exp($1, $3) } - expr %prec NEG { $$ = new ast.neg($2) } NUM

Diretivas Vários aspectos da configuração do analisador gerado %package e %class dão o pacote e o nome da classe do analisador %implements diz quais interfaces o analisador deve implementar %interface dá o nome da interface gerada com as definições de tokens %next dá o nome do método chamado para obter o próximo token, e %get o nome do campo que contém o código do token de lookahead %semantic dá o tipo e nome do campo que contém o token de lookahead

Mais diretivas %{ e %} permitem embutir código Java antes da classe (imports, por exemplo) Diretivas %token dão os nomes de todos os tipos de token que não são dados por um único caractere Diretivas %type dão os tipos dos valores semânticos de cada não-terminal da gramática %type <Comando> cmd %type <Expressao> exp %type <Lvalue> lval %type <List> exps cmds

Código extra Deve-se sempre declarar um método yyerror para tratamento de erros sintáticos: void yyerror(string msg) {... } Também é preciso fazer a adaptação entre a interface do analisador léxico e o que o JACC espera, implementando o método dado na diretiva %next e os campos das diretivas %get e %semantic Um bug no JACC faz o método parse() gerado não retornar o valor semântico do programa como um todo, então também precisa-se usar um campo auxiliar para isso