A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Análise Contextual Tem o objetivo de verificar se o programa está de acordo com as restrições contextuais da linguagem fonte."— Transcrição da apresentação:

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

2 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;

3 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.

4 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.

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

6 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

7 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.

8 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)

9 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) { ... } }

10 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

11 Exemplo Nível Ident. Attr. global Q (1) local r (2) pi (3) procedure Q real r real pi = 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)

12 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 ( ) { ... } }

13 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.

14 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; }

15 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; }

16 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;}

17 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.

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

19 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.

20 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 .

21 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); } }

22 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 ‘==’)

23 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).

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

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

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

27 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

28 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

29 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; }

30 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.

31 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); ... }

32 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); } }

33 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; }

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

35 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; }

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

37 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; }

38 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); } }


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

Apresentações semelhantes


Anúncios Google