Análise Contextual Tem o objetivo de verificar se o programa está de acordo com as restrições contextuais da linguagem fonte.

Slides:



Advertisements
Apresentações semelhantes
Estruturação de Linguagens (Pascal e C++)
Advertisements

Paulo Marques Hernâni Pedroso
1. Classes 2. Membros estáticos 1.1. Palavra chave this
Padrão de Projeto Interpreter
Orientação a Objetos: Encapsulamento e Classificação
Generalização, Especialização e Conceitos
Prof. Heloise Manica Paris Teixeira
Programação Básica em Java
Sobrecarga de Operadores
Walfredo Cirne Threads Walfredo Cirne
Construção de Compiladores
7 Abstração Genérica Unidades genéricas e instanciação.
8 Sistemas de Tipos Polimorfismo de inclusão.
JAVA ENUMS © 2009 by Jorge L. de Souza Leão março de 2009 PEE - COPPE/UFRJ.
A linguagem C#.
Métodos Programação II 1 Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre Elementos de Classe, class wrappers.
O Portal do Estudante de Computação
Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal:  var.
JAVA: Conceitos Iniciais
Variáveis, Tipos de Dados e Constantes
Concorrência em Java Threads em Java.
Departamento de Estatística e Informática
Sub-programas. Mecanismo de composição de programas Sub-programa está para peça de LEGO assim como um programa está para a construção.
Aula prática - análise contextual
Padrão de Projeto Visitor
Conceitos de Linguagem de Programação
GEJAVA IV SCJA – Certificação Sun java associado exame cx
Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal:  var.
Atributos, Encapsulamento e Interface em Java
OPERADORESOPERADORES SCJP – Otimize-TI. Operadores Java Resultado: Maioria das operações é um booleano ou numérico. Não podem ser sobrecarregados (Existem.
Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE.
Tipos de Dados Paradigmas de Programação
Análise Sintática – Parte 1
O Processo de Compilação
Teoria e Implementação de Linguagens Computacionais – IF688
Sintaxe e Semântica Prof.: Gláucya Carreiro Boechat
Verificação de Tipos e Escopos
Linguagem de Expressões 2
Classes, Objetos, Atributos e Métodos JAVA
Ambiente de Execução - Rotinas
Orientação a Objetos e Java Graduação em Ciência da Computação
Pilhas Profa. Nádia Félix.
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa This.
Linguagem Pascal Prof. Sérgio Rodrigues.
Capítulo II Gramáticas e Linguagens
Lógica Estruturada Aplicada
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Programação Orientada a Objetos - Java
Vetores Bidimensionais – Debug - Ponteiros – Listas Encadeadas Simples
Java Kickstart, day 2 Semelhanças com linguagem C.
Tradução Dirigida por Sintaxe
Melhorias e Mensagens Amigáveis ao Usuário Centro de Informática Universidade Federal de Pernambuco Bruno Felipe Marco André Paulo Fernando Rodolfo Santos.
1 Marcio de Carvalho Victorino JAVA. 2 Declaração de Atributos [ ] [transient] [volatile] [static] [final] ; controle de acesso –public, package (default),
Classes Abstratas e Interface
Conversão de Tipos Exemplo: x + i, onde x é do tipo real e i é do tipo integer. A especificação da linguagem deve indicar se a linguagem suporta este tipo.
Estruturas de Dados Aula 6: Cadeias de Caracteres
Programação Funcional
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Faculdade Pernambucana - FAPE Setembro/2007
Exemplo de desenvolvimento com testes (JUNIT - estudo de caso) Alfredo Goldman.
Aula Prática 5 Monitoria IP/CC (~if669). Roteiro 1. 1.Recursão 2. 2.Escopo de Variáveis 3. 3.Arrays 4. 4.Strings.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
SableCC Shirley Silva e Jobson Jeronimo Centro de Informática – CIn Universidade Federal de Pernambuco – UFPE
MATA56 Tipos, Verificação de Tipos Agenda Objetivo desta aula: Introduzir os principais aspectos semânticos de variáveis Palavras-chave – nomes.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Análise Contextual Mauro Araújo Teoria e Implementação de Linguagens Computacionais - IF688 Centro de Informática – CIn Universidade Federal de Pernambuco.
ProgramaçãoConcorrente Glêdson Elias
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
Linguagem de Programação – Aula 04 Prof. Me. Ronnison Reges Vidal.
Transcrição da apresentação:

Análise Contextual Tem o objetivo de verificar se o programa está de acordo com as restrições contextuais da linguagem fonte.

Análise Contextual Tipicamente, em uma linguagem com tipos estáticos e ligação estática ela: Verifica regras de escopo; Verifica regras de tipos;

Análise Contextual Consiste de duas fases: Identificação: associa ocorrências de nomes a suas definições Verificação de tipos: aplica regras de tipos para cada expressão, inferindo os tipos, e depois compara com os tipos esperados.

Identificação Faz a ligação entre uso de nomes e sua definição. Usa uma tabela de identificação (tabela de símbolos), com nome e atributos de cada identificador. Cada definição tem o seu escopo – parte do programa sobre a qual ela tem efeito. Um bloco delimita o escopo da declaração.

Escopo - Exemplo let D in C proc I (FPS) ~ C

Estrutura de Blocos de um programa Define a organização da tabela de símbolos. Monolítica: Basic, Cobol; Plana: Fortran; Aninhada: Pascal, Ada, C, Java

Estrutura de Blocos Monolítica O único bloco é o programa inteiro, ou seja, todas as declarações estão em um escopo global. Regras de escopo: nenhum identificador pode ser declarado mais de uma vez; Nenhum identificador pode ser usado sem ter sido definido.

Estrutura de Blocos Monolítica - Exemplo Program integer b = 10 integer n char c begin ... n = n * b ... write c end Ident. Attr. b (1) n (2) c (3)

Estrutura de Blocos Monolítica – em Java public class Attribute { ... } public class IdentificationTable { public IdentificationTable( ) { ... } public void enter (String id, Attribute attr) { ... } public Attribute retrieve (String id) { ... } }

Estrutura de Blocos Plana O programa pode ser particionado em vários blocos disjuntos. Dois níveis de escopo: Escopo local: ocorrencias de identificadores declarados localmente são restritos a um bloco em particular Outras declarações têm escopo global

Exemplo Nível Ident. Attr. global Q (1) local r (2) pi (3) procedure Q real r real pi = 3.14 begin ... end procedure R integer c begin ... call Q ... end program integer i boolean b char c begin ... end Nível Ident. Attr. global Q (1) R (4) local c (5) Nível Ident. Attr. global Q (1) R (4) Nível Ident. Attr. Global Q (1) R (4) local i (6) b (7) c (8)

Estrutura de Blocos Plana – em Java public class Attribute { ... } public class IdentificationTable { public IdentificationTable( ) { ... } public void enter (String id, Attribute attr) { ... } public Attribute retrieve (String id) { ... } public void openScope ( ) { ... } public void closeScope ( ) { ... } }

Estrutura de Blocos Aninhada Blocos podem ser aninhados um dentro do outro. Vários níveis de escopo: Declarações no nível mais externo têm escopo global (nível 1) Declarações dentro de um bloco interno são locais ao bloco; cada bloco está dentro de outro bloco, com um nível a mais.

Atributos public class Attribute { byte kind; // CONST ou VAR byte type; // BOOL ou INT public static final byte CONST = 0, VAR = 1; public static final byte BOOL = 0, INT = 1; ... }

Tipos public abstract class Type {...} public class BoolType extends Type {...} public class CharType extends Type {...} public class IntType extends Type {...} public class RecordType extends Type { FieldList fields; } public class ArrayType extends Type { int elementCount; Type elementType; }

Atributos (2) public abstract class Attribute {...} public class ConstAttribute extends Attribute {Type type;} public class VarAttribute extends Attribute {Type type;} public class ProcAttribute extends Attribute {FormalList formals;} public class FuncAttribute extends Attribute {FormalList formals; Type resultType;}

Atributos representados pela AST Informações sobre atributos são guardadas como ponteiro (referência) para os nós da árvore que contém as declarações, onde ficam informações de tipos etc.

Ambiente padrão Informações sobre tipos, variáveis e constantes predefinidas java.lang em Java Prelude em Haskell

Verificação de Tipos Inferencia dos tipos de construções mais simples, e em seguida das construções mais complexas Literais: o tipo de um literal é obtido diretamente: 325 é um inteiro, ‘a’ é um caracter etc. Identificador: o tipo do identificador é obtido de sua declaração.

Verificação de Tipos Aplicação de operador unário: expressão O E onde O tem tipo T1  T2, é verificado que E tem tipo equivalente a T1 e deduz que O E tem tipo T2 . Aplicação de operador binário: expressão E1 O E2 onde O tem tipo T1  T2  T3, é verificado que E1 tem tipo equivalente a T1 , E2 tem tipo equivalente a T2 e deduz que E1 O E2 tem tipo T3 .

Verificação de tipos em Java public class Type { private byte kind; public static final byte BOOL = 0, INT = 1; public static Type (byte sort) { this.sort = sort; } public boolean equals (Object other) { Type otherType = (Type) other; return (this.kind == otherType.kind); } }

Equivalência de tipos Equivalência estrutural: tipos são equivalentes se sua estrutura é a mesma. Em Java a comparação seria feita com o método ‘equals’ na classe Type. Equivalência por nome: toda ocorrência de um construtor de tipos (array ou registro) cria um novo tipo distinto; a comparação é feita através da comparação dos ponteiros para objetos que representam tipos (em Java, usaria ‘==’)

Algorítmo de análise contextual O resultado da identificação pode ser guardado através de um ponteiro do local de uso para o local da definição na árvore do programa; O resultado da verificação de tipos é guardado anotando em cada nó da árvore o seu tipo (e.g. a classe Expression tem um atributo que guarda seu tipo).

Exemplo let var n : Integer; var c: Char in begin c := ‘&’; n := n + 1 end

AST Program LetCommand sequentialCommand sequentialDeclaration AssignCommand AssignCommand VarDeclaration VarDeclaration SimpleV. CharExpr. ... SimpleT. SimpleT. CharLit. Ident. Ident. Ident. Ident. Ident. ‘&’ n Integer c Char c

AST Program LetCommand sequentialCommand ... ... AssignCommand BinaryExpr. SimpleV. VnameExpr. IntExpr. SimpleV. Ident. Op. IntLit. Ident. n n + 1

AST decorada – Análise Contextual Program LetCommand sequentialCommand sequentialDeclaration AssignCommand AssignCommand VarDeclaration VarDeclaration SimpleV. CharExpr. : char ... SimpleT. SimpleT. CharLit. Ident. Ident. Ident. Ident. Ident. ‘&’ n Integer c Char c

AST decorada – Análise Contextual Program LetCommand sequentialCommand ... ... AssignCommand BinaryExpr. : int SimpleV. : int VnameExpr. : int IntExpr. SimpleV. : int Ident. : int Op. IntLit. Ident. n n + 1

Novos atributos public abstract class Expression extends AST { public Type type; … } public abstract class Vname extends AST { public Type type; public boolean variable; } public class Identifier extends Terminal { public Declaration decl; } public class Operator extends Terminal { public OperatorDeclaration decl; }

Implementando a análise contextual Uso do padrão de projetos Visitor Esse padrão de projeto será usado também para geração de código.

Classes e Objetos Visitor public interface Visitor { public Object visitProgram (Program prog, Object arg); public Object visitAssignCommand (AssignCommand com, Object arg); public Object visitCallCommand (CallCommand com, Object arg); ... Public Object visitBinaryExpression (BinaryExpression expr, Object arg); ... }

Mudando a classe AST public abstract class AST { ... public abstract Object visit (Visitor v, Object arg); } public class AssignCommand extends Command { ... public Object visit (Visitor v, Object arg) { return v.visitAssignCommand(this, arg); } }

VisitAssignCommand public Object visitAssignCommand (AssignCommand com, Object arg) { Type vType = (Type) com.V.visit(this, null); Type eType = (Type) com.E.visit(this, null); if (! com.V.variable) ... if (! eType.equals(vType)) ... return null; }

VisitSequentialCommand public Object visitSequentialCommand (SequentialCommand com, Object arg) { com.C1.visit(this, null); com.C2.visit(this, null); return null; }

VisitIfCommand public Object visitIfCommand (IfCommand com, Object arg) { Type eType = (Type) com.E.visit(this, null); if (! eType.equals(Type.bool)) ... com.C1.visit(this, null); com.C2.visit(this, null); return null; }

VisitLetCommand public Object visitLetCommand (LetCommand com, Object arg) { idTable.openScope( ); com.D.visit(this, null); com.C.visit(this, null); idTable.closeScope( ); return null; }

VisitBinaryExpression public Object visitBinaryExpression (BinaryExpression expr, Object arg) { Type e1Type = (Type) expr.E1.visit (this, null); Type e2Type = (Type) expr.E2.visit (this, null); OperatorDeclaration opdecl = (OperatorDeclaration) expr.O.visit (this, null); if (opdecl instanceof BinaryOperatorDeclaration) ... return expr.type; }

Classe Checker public final class Checker implements Visitor { private IdentificationTable idTable; ... public void check (Program prog) { idTable = new IdentificationTable ( ); idTable.enter(“false”,...); ... prog.visit(this, null); } }