2. O gerador de código estende DepthFirstAdapter implementando a interpretação que gerará código Jasmin a partir de Smallpascal.



Documentos relacionados
file.j. a Baseado no Jasmin User Guide. (

Implementando uma Classe e Criando Objetos a partir dela

Algoritmos e Programação II. Sobrecarga

Uma Introdução à Arquitetura CORBA. O Object Request Broker (ORB)

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

Análise de Programação

O comando switch. c Professores de ALPRO I 04/2012. Faculdade de Informática PUCRS. ALPRO I (FACIN) O comando switch 04/ / 31

Exercícios de Revisão Java Básico

Computação II Orientação a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Cartão de fidelização de clientes das distribuidoras de combustível.

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

insfcanceof new public switch transient while byte continue extends for int null

Prof. Jhonatan Fernando

Estrutura Condicional em Java

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Um Exemplo de Refatoração. Prof. Alberto Costa Neto DComp/UFS

Encapsulamento de Dados

Introdução a Java. Hélder Nunes

Módulo 06 Desenho de Classes

Programação por Objectos. Java

BC0505 Processamento da Informação

Desenvolvimento OO com Java Orientação a objetos básica

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 6 Filas

Programação Orientada a Objetos C++

2 Orientação a objetos na prática

Rafael Santos. Instituto Nacional de Pesquisas Espaciais rafael.santos. Rafael Santos - rafael.

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

INTRODUÇÃO À LINGUAGEM C++

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Orientação a Objetos. Conceitos Iniciais Introdução a Linguagem Java. Gil Eduardo de Andrade

Desenvolvimento de aplicações Web. Java Server Pages

A Pilha. Aula 02. DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria

Linguagem de Programação I. Orientação a Objetos em Java

ESTRUTURA BÁSICA DE UM PROGRAMA JAVA

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Carga horária : 4 aulas semanais (laboratório) Professores: Custódio, Daniel, Julio foco: introdução a uma linguagem de programação Linguagem Java

BSI UFRPE Prof. Gustavo Callou

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

Java. Marcio de Carvalho Victorino

Templates e Pilhas. 1. Introdução

Java Básico. Matrícula de Alunos. Marco Antonio, Arquiteto de Software TJDF Novembro/2005

Módulo 07 Características Avançadas de Classes

1.2 Uma linguagem de programação muito simples

Programando em C++ Histórico da Linguagem C

FACULDADE DE TECNOLOGIA SENAC GOIÁS ADELTON HENRIQUE ABISHAI LEMES BORGES NETO HENRIQUE FERREIRA DA SILVA

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Desenvolvimento Web TCC Turma A-1

ÇÃO COM OBJECTOS PROGRAMAÇÃ. Programação com Objectos. Programação com Objectos TUDO É UM OBJECTO TUDO É UM OBJECTO ÍNDICE.

Informática de Gestão 1º ano / 1º semestre Ano letivo: 2014/2015. Visual Basic VBA

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Testando e Comparando Valores

Java Threads. Introdução

Algoritmos e Programação

Programação de Computadores - I. Profª Beatriz Profº Israel

Pilhas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Web Browser como o processo cliente. Servidor web com páginas estáticas Vs. Aplicações dinâmicas para a Web:

Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Itens estruturais/caso de uso. Itens estruturais/classe ativa. Itens estruturais/componente. Itens estruturais/artefatos. Itens comportamentais

Tipo de Dados em Linguagem C

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

Java Laboratório Aula 1. Divisões da Plataforma. Introdução a Plataforma Java. Visão geral da arquitetura da

MANUAL DE PADRONIZAÇÃO DE CODIFICAÇÃO PHP CODING STANDARDS

Noções sobre Objetos e Classes

Orientação a Objetos e a Linguagem Java

Capítulo 7 Nível da Linguagem Assembly

Recursividade. Aula 9

PADRÕES DE PROJETO. Prof.: Jean Carlo Mendes

A Linguagem Java. Alberto Costa Neto DComp - UFS

Java 2 Standard Edition Como criar classes e objetos

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Linguagem de Programação I

Como construir um compilador utilizando ferramentas Java

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

PROCESSOS. Prof. Maicon A. Sartin

DESENVOLVIMENTO DE SOFTWARE

(Aula 15) Threads e Threads em Java

Documentação do retorno XML referente projeto Busca Endereço por CEP

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

Programação Orientada a Objetos em Java. Herança

Como usar o bluej. Laboratório I Prof.ª Vera Alves

Representação de Algoritmos - Linguagens de Programação

Algoritmos e Estruturas de Dados I. Universidade Federal de São João del-rei Pedro Mitsuo Shiroma Sala 119 Bloco 3

Programação Visual TIC - 3PA. Lista de Exercícios 02

Programação Orientada a Objeto

Linguagem de Programação Orientada a Objeto. Introdução a Orientação a Objetos Professora Sheila Cáceres

AULA Uma linguagem de programação orientada a objetos

Capítulo 2. VARIÁVEIS DO TIPO INTEIRO

Transcrição:

Geração de Código para Smallpascal a 1. Já estudamos como SableCC faz uso do design pattern visitor para construir compiladores modulares. Vimos também os principais componentes da máquina virtual Java e a sintaxe da linguagem Jasmin, um assembler para um subconjunto do máquina virtual Java. Vamos agora estudar como código Jasmin pode ser gerado a partir de uma linguagem de expressões simples chamada Smallpascal. public class CodeGenerator extends DepthFirstAdapter private Hashtable table = new Hashtable(); private String source; private String class name; PrintWriter out; 2. O gerador de código estende DepthFirstAdapter implementando a interpretação que gerará código Jasmin a partir de Smallpascal. a Baseado na implementação de Samllpascal, por Fidel Viegas. brainycreatures.co.uk/download/smallpascal.asp) (http://www. 1

3. A variável table armazenará os identificadores declarados no programa sendo compilado. Programas em Smallpascal são case insensitive, ou seja, não é feita distinção entre letras maiúsculas e minúsculas. 4. A variável source armazena o nome do arquivo original e class name armazena o nome do arquivo original sem a extensão pas. Esta string define o nome da classe Java gerada. Finalmente out guarda o stream com o texto Jasmin gerado pelo compilador. O nome do arquivo gerado é o valor de class name concatenado a.j. public CodeGenerator(String source)... 5. O construtor default recebe uma string contendo o nome do arquivo Smallpascal sendo compilado. A partir desta string os campos (atributos) source, class name e out são instanciados apropriadamente. 2

public void inaprogram(aprogram node) out.println(".source " + source); out.println(".class public " + class_name); out.println(".super java/lang/object"); out.println(".method public <init>()v"); out.println(" aload_0"); out.println(" invokenonvirtual java/lang/object/<init>()v"); out.println(" return"); out.println(".end method"); 6. A máquina virtual Java espera que toda classe tenha pelo menos um construtor. Todo programa Smallpascal é mapeado para uma classe na JVM. Desta maneira é necessário gerar o construtor default para a classe gerada a partir do programa Smallpascal sendo compilado. O construtor default chama o construtor de java.lang.object. Isso é feito na ação associada ao header do programa junto com as diretivas.source,.class e.super de Jasmin. 3

public void outasingleidentifierlist (ASingleIdentifierList node) String key = node.getidentifier().gettext().touppercase(); String var_name = node.getidentifier().gettext(); String var_image = class_name + "/"+ var_name; out.println(".field public static "+ var_name + " I = 0"); table.put(key, var_image); 7. Declarações de variáveis são mapeadas para declarações de campos (atributos) em Jasmin. Todas as variáveis em Samllpascal são int. Lembre-se que variáveis em Jasmin são representadas pelo nome da classe mais o nome da variável. Guardamos então este nome completo da variável na tabela de símbolos para que este nome completo possa ser descoberto quando a variável for utilizada numa expressão. 4

public void inabody(abody node) out.println(); out.println( ".method public static main([ljava/lang/string;)v"); out.println(".limit stack 5"); out.println(".limit locals 1"); 8. Um programa em Smallpascal tem a seguinte organização: program = program_heading declarations body dot ; O corpo ( body ) de um programa em Smallpascal é então mapeado na função main da classe sendo gerada para o programa. Como em Smallpascal não existem variáveis locais, a pilha é limitada a valores, o que é suficiente para cumprir os requisitos da JVM. Da mesma maneira o número de variáveis locais é limitado a correspondendo aos parâmetros args[] passados ao método main. 5

public void outabody(abody node) out.println(" return"); out.println(".end method"); out.flush(); 9. Na ação out da produção Body deve ser gerado código para que a função main retone, dado que todos os métodos, que são procedimentos, na máquina virtual devem terminar com return. A diretiva adequada deve também ser gerada e finalmente o código do programa é escrito no disco. 6

public void outaassignmentstatement (AAssignmentStatement node) String key = node.getidentifier().gettext().touppercase(); String var_image = (String) table.get(key); out.println(" putstatic " + var_image + " I"); 10. Este é o código gerado para uma atribuição em Smallpascal. Primeiro o nome completo do identificador é obtido da tabela de símbolos. Assume-se que o resultado da avaliação da expressão sendo atribuída a variável esteja no topo da pilha de operandos. A instrução putstatic copia o valor do topo da pilha para a variável que é do tipo int, como todas as variáveis em Smallpascal. 7

public void inawritelnstatement(awritelnstatement node) out.println( "getstatic java/lang/system/out Ljava/io/PrintStream;"); public void outawritelnstatement(awritelnstatement node) out.println( "invokevirtual java/io/printstream/println(i)v"); 11. O comando writeln de Smallpascal é implementado através das ações in e out da produção AWritelnStatement. Na ação in o objeto java.lang.system.out é empilhado e na ação out o método println da classe PrintStream é invocado. 8

public void outaplusexpression(aplusexpression node) out.println(" iadd"); public void outaminusexpression(aminusexpression node) out.println(" isub"); //... public void outanumberfactor(anumberfactor node) String value = node.getnumber().gettext(); push(value); 12. As operações aritméticas são traduzidas simplesmente para suas contrapartes na JVM. O processo de empilhamento dos operandos é feito pelo método push, da classe CodeGenerator, que deve primeiro verificar qual inteiro está sendo empilhado de forma a utilizar a instrução adequada. O método push, que pode sinalizar uma exceção se o inteiro for mal-formado, é invocado quando um fator está sendo processado. Isso porque neste exemplo não está sendo utilizada a árvore de sintaxe abstrata. 9

private void push(string value) //... switch(int_value) //... case 5: // gera iconst_x se X estiver entre 0 e 5 out.println(" iconst_" + value); break; default: // instrução para empilhar um byte if ((int_value >= -128) && (int_value <= 127)) out.println(" bipush " + value); // instrução para empilhar short integer else if ((int_value >= -32768) && (int_value <= 32767)) out.println(" sipush " + value); // instrução para empilhar integer else out.println(" ldc " + value); break; //... 10

public void outaidentifierfactor(aidentifierfactor node) String key = node.getidentifier().gettext(). touppercase(); String var_image = (String) table.get(key); out.println(" getstatic " + var_image + " I"); 13. Uma instrução getstatic deve ser utilizada para se recuperar o valor de uma variável no lado direito de uma expressão. 11