Como construir um compilador utilizando ferramentas Java

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

Introdução à Programação

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

Linguagens de Programação Classificação

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

Como construir um compilador utilizando ferramentas Java

Tratamento dos Erros de Sintaxe. Adriano Maranhão

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Conceitos de Linguagens de Programação

CAP. VI ANÁLISE SEMÂNTICA

Compiladores. Análise Semântica

Paradigmas de Programação

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

Projeto de Compiladores

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

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

Desenvolvimento de Aplicações Desktop

Compiladores. Introdução

Compiladores. Análise Semântica

Ambiente de desenvolvimento

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

Como construir um compilador utilizando ferramentas Java

Linguagens de Programação Aula 3

Algoritmos e Programação

Projeto de Compiladores

Existem três categorias principais de linguagem de programação: linguagem de máquina, linguagens assembly e linguagens de alto nível.

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

Variáveis primitivas e Controle de fluxo

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

Noções de compilação

Analisador Léxico parte II

Paradigmas de Linguagem de Programação. Aspectos Básicos

AULA TEÓRICA 3 Tema 2. Introdução a programação em Java (JVM, JDK)

Programação I Apresentação

Compiladores. Fabio Mascarenhas

Programação de Computadores I. Professor Ilaim Costa Junior

Questões de Paradigmas de Programação Matéria: Prova 1 4ª EDIÇÃO

Análise Semântica: Verificação de Tipos

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Compiladores. Prof. Bruno Moreno

Compiladores Análise Semântica

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.

Variável. Expressões. Atribuição. Tipos básicos Declaração. Aritméticas Lógicas. Professor Leandro Augusto Frata Fernandes

Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação

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

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

ALGORITMOS E ESTRUTURA DE DADOS

Aula 23: Noções de Compilação, Montagem, Link-edição, e Interpretação

Linguagens de Domínio Específico

Compiladores Ambiente de Execução

Compiladores. Análise Léxica

Infraestrutura de Hardware. Funcionamento de um Computador

Compiladores. Análise Léxica

As fases de um compilador

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

SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.

ALGORITMOS E TÉCNICAS DE PROGRAMAÇÃO

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Algoritmos. Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi

Compiladores Ambiente de Execução

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

Compiladores Aula 12. Celso Olivete Júnior.

Java e sua Sintaxe. Estrutura mínima de um programa em Java: public class Exemplo { }

Linguagem C Princípios Básicos (parte 1)

Acadêmica: Giselle Mafra Schlosser Orientador: Everaldo Artur Grahl

Transcrição:

Como construir um compilador utilizando ferramentas Java p. 1/2 Como construir um compilador utilizando ferramentas Java Aula 1 - Introdução Prof. Márcio Delamaro delamaro@icmc.usp.br

Como construir um compilador utilizando ferramentas Java p. 2/2 O livro http://www.novatec.com.br/livros/compilador/ http://www.novateceditora.com.br/downloads.php

Como construir um compilador utilizando ferramentas Java p. 3/2 Conteúdo Introdução à compilação. Descrição da linguagem X++, utilizada como estudo de caso. Apresenta conceitos básicos sobre linguagens e como defini-las. Análise léxica. Mostra como se utiliza a ferramenta JavaCC para criar um analisador léxico para a linguagem X++. Análise sintática. Mostra como construir um analisador sintático para X++ utilizando JavaCC.

Como construir um compilador utilizando ferramentas Java p. 4/2 Conteúdo Árvore sintática. Mostra como construir a árvore sintática usando o JavaCC e como utilizá-la nas etapas seguintes. Tabela de símbolos e análise semântica. Mostra como implementar uma tabela de símbolos utilizada na checagem de tipos e validação semântica. Geração de código. Mostra como utilizar a ferramenta Jasmin para gerar o código-objeto (bytecode) Java.

Como construir um compilador utilizando ferramentas Java p. 5/2 O que é um programa? Seqüência de 0s e 1s. CPU A B C D Memória 000 001 002 003 004 005 006 007

Como construir um compilador utilizando ferramentas Java p. 6/2 Operações simples Programa é armazenado na memória.

Como construir um compilador utilizando ferramentas Java p. 6/2 Operações simples Programa é armazenado na memória. Programa é executado dentro da CPU por meio de instruções muito simples.

Como construir um compilador utilizando ferramentas Java p. 6/2 Operações simples Programa é armazenado na memória. Programa é executado dentro da CPU por meio de instruções muito simples. Somar posição de memória 100 com posição 101 e colocar resultado em 102. copiar o conteúdo da posição de memória 100 para o registrador A; copiar o conteúdo da posição de memória 101 para o registrador B; somar o conteúdo de B em A; copiar o conteúdo de A para a posição de memória 102.

Como construir um compilador utilizando ferramentas Java p. 7/2 Linguagens de alto nível Necessário desenvolver programas num nível de abstração um pouco mais elevado.

Como construir um compilador utilizando ferramentas Java p. 7/2 Linguagens de alto nível Necessário desenvolver programas num nível de abstração um pouco mais elevado. Menos dependente das instruções de uma determinada máquina.

Como construir um compilador utilizando ferramentas Java p. 7/2 Linguagens de alto nível Necessário desenvolver programas num nível de abstração um pouco mais elevado. Menos dependente das instruções de uma determinada máquina. As linguagens de alto nível substituem as instruções dos computadores por comandos cujas utilização e compreensão são mais fáceis

Como construir um compilador utilizando ferramentas Java p. 7/2 Linguagens de alto nível Necessário desenvolver programas num nível de abstração um pouco mais elevado. Menos dependente das instruções de uma determinada máquina. As linguagens de alto nível substituem as instruções dos computadores por comandos cujas utilização e compreensão são mais fáceis a = b + c

Como construir um compilador utilizando ferramentas Java p. 8/2 Processo de compilação As linguagens de programação evoluíram

Como construir um compilador utilizando ferramentas Java p. 8/2 Processo de compilação As linguagens de programação evoluíram Máquinas continuam as mesmas ou seja, continuam usando instruções de baixo nível

Como construir um compilador utilizando ferramentas Java p. 8/2 Processo de compilação As linguagens de programação evoluíram Máquinas continuam as mesmas ou seja, continuam usando instruções de baixo nível Como usar então uma linguagem de alto nível numa máquina que não a compreende?

Como construir um compilador utilizando ferramentas Java p. 8/2 Processo de compilação As linguagens de programação evoluíram Máquinas continuam as mesmas ou seja, continuam usando instruções de baixo nível Como usar então uma linguagem de alto nível numa máquina que não a compreende? PROGRAMA FONTE COMPILADOR PROGRAMA OBJETO

Como construir um compilador utilizando ferramentas Java p. 9/2 Os componentes de um compilador o analisador léxico; o analisador sintático; o analisador semântico; o gerador de código.

Como construir um compilador utilizando ferramentas Java p. 10/2 Analisador léxico O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para a linguagem ou de avisar quando um símbolo que não faz parte da linguagem é encontrado.

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin 123 constante inteira;

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin 123 constante inteira; x1 nome de variável ou procedimento;

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin 123 constante inteira; x1 nome de variável ou procedimento; ; símbolo especial ponto-e-vírgula ;

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin 123 constante inteira; x1 nome de variável ou procedimento; ; símbolo especial ponto-e-vírgula ; y2 nome de variável ou procedimento;

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin 123 constante inteira; x1 nome de variável ou procedimento; ; símbolo especial ponto-e-vírgula ; y2 nome de variável ou procedimento; true constante booleana;

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin 123 constante inteira; x1 nome de variável ou procedimento; ; símbolo especial ponto-e-vírgula ; y2 nome de variável ou procedimento; true constante booleana; begin palavra reservada.

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin 123 constante inteira; x1 nome de variável ou procedimento; ; símbolo especial ponto-e-vírgula ; y2 nome de variável ou procedimento; true constante booleana; begin palavra reservada. A descrição da linguagem diz quais são os símbolos válidos e o que significam

Como construir um compilador utilizando ferramentas Java p. 11/2 Análise léxica 123 x1 ; y2 true begin 123 constante inteira; x1 nome de variável ou procedimento; ; símbolo especial ponto-e-vírgula ; y2 nome de variável ou procedimento; true constante booleana; begin palavra reservada. A descrição da linguagem diz quais são os símbolos válidos e o que significam Erros léxicos

Como construir um compilador utilizando ferramentas Java p. 12/2 Nem tudo é tão simples 123x1begin(end

Como construir um compilador utilizando ferramentas Java p. 12/2 Nem tudo é tão simples 123x1begin(end 123 constante inteira;

Como construir um compilador utilizando ferramentas Java p. 12/2 Nem tudo é tão simples 123x1begin(end 123 constante inteira; x1begin nome de variável ou procedimento;

Como construir um compilador utilizando ferramentas Java p. 12/2 Nem tudo é tão simples 123x1begin(end 123 constante inteira; x1begin nome de variável ou procedimento; ( símbolo especial abre parênteses ;

Como construir um compilador utilizando ferramentas Java p. 12/2 Nem tudo é tão simples 123x1begin(end 123 constante inteira; x1begin nome de variável ou procedimento; ( símbolo especial abre parênteses ; end palavra reservada.

Como construir um compilador utilizando ferramentas Java p. 13/2 Estados do analisador léxico "Aqui @ temos uma arroba" /* Isso é um comentário */

Como construir um compilador utilizando ferramentas Java p. 14/2 Analisador sintático O AL não se preocupa em verificar se a ordem em que os símbolos aparecem é válida ou não.

Como construir um compilador utilizando ferramentas Java p. 14/2 Analisador sintático O AL não se preocupa em verificar se a ordem em que os símbolos aparecem é válida ou não. O analisador sintático é o coração do compilador, responsável por verificar se a seqüência de símbolos contida no programa fonte forma um programa válido ou não.

Como construir um compilador utilizando ferramentas Java p. 15/2 Análise sintática if (a - 10 > b * 2) a = b; O AS deve ser capaz de analisar esse programa e reconhecê-lo como válido. Após a palavra reservada if deve vir um ( Uma expressão Um ) Um comando qualquer (por exemplo a = b )

Como construir um compilador utilizando ferramentas Java p. 16/2 Descrição da linguagem O AS é construído sobre uma gramática livre de contexto que descreve a linguagem fonte. Essa gramática é composta de uma série de regras que descrevem quais são as construções válidas da linguagem. O AS deve aceitar aqueles programas que seguem essas regras e rejeitar indicando a ocorrência de um erro sintático aqueles que as violam.

Como construir um compilador utilizando ferramentas Java p. 17/2 árvore sintática O AS desempenha ainda outra importante função que é a construção da árvore sintática(árvore de derivação) do programa fonte. Uma árvore sintáticaé uma estrutura em forma de árvore que descreve as construções da linguagem reconhecidas pelo AS no programa fonte. Se o programa fonte possui um comando if como aquele visto há pouco, sua árvore sintática deve espelhar esse fato e descrever como esse comando é formado.

Como construir um compilador utilizando ferramentas Java p. 18/2 árvore sintática if > = - * a b a 10 b 2

Como construir um compilador utilizando ferramentas Java p. 19/2 O analisador semântico O analisador semântico (ASem) verifica se os aspectos semânticos do programa estão corretos, ou seja, se não existem incoerências quanto ao significado das construções utilizadas pelo programador.

Como construir um compilador utilizando ferramentas Java p. 19/2 O analisador semântico O analisador semântico (ASem) verifica se os aspectos semânticos do programa estão corretos, ou seja, se não existem incoerências quanto ao significado das construções utilizadas pelo programador. Não utiliza mais o programa fonte para fazer tal verificação. Em vez disso, utiliza a árvore sintática como representação do programa.

Como construir um compilador utilizando ferramentas Java p. 20/2 Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador *

Como construir um compilador utilizando ferramentas Java p. 20/2 Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Variáveis não declaradas.

Como construir um compilador utilizando ferramentas Java p. 20/2 Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Variáveis não declaradas. Redeclaração de variáveis.

Como construir um compilador utilizando ferramentas Java p. 20/2 Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Variáveis não declaradas. Redeclaração de variáveis. Chamadas de funções ou métodos com o número incorreto de parâmetros.

Como construir um compilador utilizando ferramentas Java p. 20/2 Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Variáveis não declaradas. Redeclaração de variáveis. Chamadas de funções ou métodos com o número incorreto de parâmetros. Comandos colocados fora de contexto. Por exemplo, a utilização de um comando continue fora de um comando de laço deve ser apontada como um erro semântico.

Como construir um compilador utilizando ferramentas Java p. 21/2 Erros semânticos Esses erros não são detectados pelo AS, pois não constituem erros sintáticos. De acordo com a gramática da linguagem fonte, uma variável c pode ser utilizada em uma expressão como a = b * c, não importando se foi declarada anteriormente ou não, ou qual é o seu tipo.

Como construir um compilador utilizando ferramentas Java p. 22/2 Tabela de símbolos Para desempenhar seu papel, o ASem depende de uma tabela de símbolos. Nela são armazenadas informações de variáveis declaradas, funções ou métodos, tipos ou classes. Ao analisar o comando a = b * c (ou melhor, a árvore sintática correspondente a esse comando), o ASem precisa saber se cada uma das variáveis envolvidas foi previamente declarada e o tipo de cada uma delas. O ASem deve, ao analisar um comando de declaração como int c, incluir na tabela de símbolos a variável c, indicando, entre outras coisas, que seu tipo é int.

Como construir um compilador utilizando ferramentas Java p. 23/2 O gerador de código Uma vez verificado que não existem erros sintáticos ou semânticos, o compilador pode realizar sua tarefa, que é a criação do programa objeto.

Como construir um compilador utilizando ferramentas Java p. 23/2 O gerador de código Uma vez verificado que não existem erros sintáticos ou semânticos, o compilador pode realizar sua tarefa, que é a criação do programa objeto. O programa objeto reflete, mediante instruções de baixo nível, os comandos do programa fonte. Como cada máquina ou cada plataforma possui um conjunto diferente de instruções e de meios de acesso ao sistema operacional, em geral é necessário que exista um gerador de código distinto para cada plataforma.

Como construir um compilador utilizando ferramentas Java p. 24/2 JavaCC Programa é um gerador de compiladores, ou mais precisamente um gerador de analisador sintático. Ele toma como entrada uma gramática e transforma-a num programa Java capaz de analisar um arquivo e dizer se satisfaz ou não as regras especificadas nessa gramática. Ele também oferece facilidades para a construção da árvore sintática. Ao descrever a gramática, pode-se também indicar como a árvore sintática deve ser construída, incorporando-se código para realizar tal tarefa ao analisador sintático gerado.

Como construir um compilador utilizando ferramentas Java p. 25/2 Próximo passo Vamos definir uma linguagem de programação que será usada como estudo de caso durante o curso. Ver Capítulo 2 do livro.