Você está na página 1de 56

MAB 471 2012.

Anlise Semntica

http://www.dcc.ufrj.br/~fabiom/comp

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

O que h de errado?

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

O que h de errado?

(vamos contar)

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

O que h de errado?

(vamos contar)

nmero de argumentos de foo()

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

O que h de errado?

(vamos contar)

nmero de argumentos de foo() declarou g[0], usou g[17]

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

O que h de errado?

(vamos contar)

nmero de argumentos de foo() declarou g[0], usou g[17] ab no int

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

O que h de errado?

(vamos contar)

nmero de argumentos de foo() declarou g[0], usou g[17] ab no int dimenso errada no uso de f

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

O que h de errado?

(vamos contar)

nmero de argumentos de foo() declarou g[0], usou g[17] ab no int dimenso errada no uso de f varivel no declarada q

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
H um nvel de corretude alm da gramtica
foo(a,b,c,d) { int a, b, c, d; } bar() { int f[3],g[0], h, i, j, k; char *p; foo(h,i,ab,j, k); k = f * i + j; h = g[17]; printf(<%s,%s>.\n,p,q); p = 10; }

O que h de errado?

(vamos contar)

nmero de argumentos de foo() declarou g[0], usou g[17] ab no int dimenso errada no uso de f varivel no declarada q 10 no uma string
Tudo isso est alm da sintaxe

Para gerar cdigo, precisamos entender seu sigficado


2

Wednesday, May 23, 12

Alm da Sintaxe
Para gerar cdigo, o compilador deve responder as questes:

x escalar, array, ou funo? x foi declarado? H nomes no declarados? Declarados mas no usados? Qual declarao de x usada por uma ref. a x? A expresso x * y + z corretamente tipada? Em a[i,j,k], a tem trs dimenses? Onde z pode ficar?
(registrador, local, global, heap, esttica)

Em f 15, como representar 15? Quantos argumentos foo() recebe? E printf() ? *p referencia o resultado de um malloc() ? p & q se referem ao mesmo local na memria?
do poder expressivo de uma CFG x definido antes deAlm ser usado?
3

Wednesday, May 23, 12

Alm da Sintaxe
Essas questes so parte da anlise semntica

Respostas dependem de valores, no de categorias sintticas Questes e respostas usam informao no-local Respostas podem precisar de computao
Como responder essas questes?

Usar mtodos formais


Gramticas sensveis ao contexto? Gramticas de Atributos

Usar tcnicas ad-hoc


Tabelas de smbolos Cdigo ad-hoc

Wednesday, May 23, 12

Alm da Sintaxe
Essas questes so parte da anlise semntica

Respostas dependem de valores, no de categorias sintticas Questes e respostas usam informao no-local Respostas podem precisar de computao
Como responder essas questes?

Usar mtodos formais


Gramticas sensveis ao contexto? Gramticas de Atributos

Usar tcnicas ad-hoc


Tabelas de smbolos Cdigo ad-hoc Em anlise sinttica os formalismos ganharam.
4

Wednesday, May 23, 12

Alm da Sintaxe
Essas questes so parte da anlise semntica

Respostas dependem de valores, no de categorias sintticas Questes e respostas usam informao no-local Respostas podem precisar de computao
Como responder essas questes?

Usar mtodos formais


Gramticas sensveis ao contexto? Gramticas de Atributos

Usar tcnicas ad-hoc


Tabelas de smbolos Cdigo ad-hoc Em anlise sinttica os formalismos ganharam. Em anlise semntica as tnicas ad-hoc ganharam.
Wednesday, May 23, 12 4

Anlise Ad-hoc
Traduo dirigida por sintaxe

Usa parser shift-reduce bottom-up Associa trecho de cdigo a cada produo Executa o trecho a cada reduo Cdigo arbitrrio d muita flexibilidade
Inclusive a habilidade de dar um tiro no prprio p

Para fazer funcionar

Precisa de nomes para cada smbolo de uma regra gramatical


Yacc e derivados usam $$, $1, $2, $n, esquerda pra direita

Mecanismo de avaliao ps-ordem


Natural no algoritmo LR(1)
5

Wednesday, May 23, 12

Exemplo Tipagem Assume tabelas de tipagem


F+, F, F, e F

Wednesday, May 23, 12

Exemplo Construo de AST Assume construtores para cada n Assume que a pilha guarda ponteiros pros ns

Wednesday, May 23, 12

Example Emisso de IR linear Assume que NextRegister() retorna nome de reg. virtual Assume que Emit() formata cdigo assembly

Wednesday, May 23, 12

Example Emisso de IR linear Assume que NextRegister() retorna nome de reg. virtual Assume que Emit() formata cdigo assembly Assume que EmitLoad() lida com endereamento e carrega
um valor em um registrador

Wednesday, May 23, 12

Usos Tpicos Construo de tabela de smbolos


Entra informao de declaraes medida que so processadas Usa tabela para checar erros medida que o parsing progride

Checagem de erros e tipos simples


Definio antes de uso busca na referncia Dimenso, tipo, ... checado quando encontrado Consistncia dos tipos de uma expresso na reduo da exp. Interfaces de procedimentos so mais difceis se no quiser impor definies antes de usos (ou prottipos)
Construir representao para listas de parmetros e tipos Criar lista de stios para checagem Checagem offline
10

Wednesday, May 23, 12

Limitaes Fora avaliao em uma ordem especfica: ps-ordem


Esquerda pra direita Bottom up

Implicaes
Declaraes antes de usos Informao de contexto no pode ser passada para baixo
Como saber de dentro de qual regra voc foi chamado?

Poderia usar globais?


Requer inicializao e pensar direito nas solues

Pode influenciar o projeto da linguagem, para ser mais fcil de

analisar dessa maneira

11

Wednesday, May 23, 12

Traduo Dirigida por Sintaxe


Como encaixar em um parser LR(1)?
stack.push(INVLIDO); stack.push(s0); loop { // estado inicial token = scanner.next_token(); s = stack.top(); if ( ACTION[s,token] == reduce A ) then { stack.popnum(2*||); // desempilha 2*|| smbolos s = stack.top(); stack.push(A); // empilha A stack.push(GOTO[s,A]); // empilha prximo estado

else if ( ACTION[s,token] == shift si ) then { stack.push(token); stack.push(si); token scanner.next_token(); } else if ( ACTION[s,token] == accept & token == EOF ) then break; else erro de sintaxe; }

12

Wednesday, May 23, 12

Parser LR(1)
stack.push(INVLIDO); stack.push(NULL); stack.push(s0); loop {

com aes TDS


// estado inicial

token = scanner.next_token(); s = stack.top(); if ( ACTION[s,token] == reduce A ) then { /* insira aes aqui (switch) */ stack.popnum(3*||); // desempilha 3*|| smbolos

Para adicionar aes YACC:

Empilhe 3 items por smbolo ao


invs de 2 (3o $$) redues

Switch na seo de processar


Switch no nmero da produo Cada clusula tem o trecho de cdigo para aquela produo Substitui nomes apropriados para $$, $1, $2,

s = stack.top(); stack.push(A); // empilha A stack.push(GOTO[s,A]); // empilha prximo estado

else if ( ACTION[s,token] == shift si ) then { stack.push(token); stack.push(si); token scanner.next_token(); } else if ( ACTION[s,token] == accept & token == EOF ) then break; else erro de sintaxe; }

Aumento modesto no tempo 50% de aumento na pilha


13

Wednesday, May 23, 12

Anlise em ASTs
E se preciso fazer aes que no se encaixam bem no framework da traduo dirigida por sintaxe?

Construir a AST usando traduo dirigida por sintaxe Fazer as aes em uma ou mais passagens pela rvore
Vrias maneiras de se estruturar em uma linguagem OO Faz computao arbitrria e controla a ordem Mltiplas passadas se necessrio

14

Wednesday, May 23, 12

Representaes Intermedirias

Cdigo Fonte

Front End

IR

Middle End

IR

Back End

Cdigo Nativo

Front end - produz uma representao intermediria (IR) Middle end - transforma a IR do front end em uma IR
equivalente que mais eficiente (otimizao)

Back end - transforma a IR final em cdigo nativo IR codifica conhecimento do compilador sobre o programa

15

Wednesday, May 23, 12

Representaes Intermedirias Decises no projeto da IR afetam a eficincia do compilador


e do cdigo que ele gera

Propriedades importantes
Facilidade de gerao Facilidade de manipulao Tamanho dos programas Expressividade Nvel de Abstrao

A importncia de diferentes propriedades varia entre


diferentes compiladores
Escolher a IR apropriedada fundamental
16

Wednesday, May 23, 12

Tipos de Representaes Intermedirias


Trs grandes categorias

Estrutural
Grficas Muito usada em traduo fonte para fonte Tende a ser grande

Exemplo: ASTs

Linear
Pseudo-cdigo para mquina abstrata Nvel de abstrao varia Simples e compacta Mais fcil de rearrumar o cdigo

Exemplos: Cdigo 3 endereos Cdigo mq. de pilha

Hbrida
Combinao de grafos e cdigo linear Grafos de fluxo de controle

Exemplo: CFGs

17

Wednesday, May 23, 12

Nvel de Abstrao O nvel de detalhe exposto em uma IR influencia a


possibilidade de diferentes otimizaes

Duas representaes para acesso a array:


loadI sub loadI mult sub add loadI add load 1 rj, 10 r2, ri, r4, @A r7, r8 => => => => => => => => => r1 r2 r3 r4 r5 r6 r7 r8 rAij

subscript

r1 r3 r1 r5 r6

AST alto nvel: Boa para desambiguar acessos

Cdigo linear de baixo nvel: Bom para clculo de endereo mais eficiente

18

Wednesday, May 23, 12

Nvel de Abstrao IRs estruturais normalmente so alto nvel IRs lineares normalmente so baixo nvel No necessariamente verdade:
load

AST baixo nvel


+ + * @A

loadArray A,i,j
Cdigo lin. alto nvel

10 j 1

j 1

19

Wednesday, May 23, 12

rvore de Sintaxe Abstrata (AST)


Uma rvore de sintaxe abstrata a rvore sinttica com os ns para a maioria dos no-terminais removido

x 2

*
y

x-2*y

Pode usar forma linearizada da rvore


Mais fcil de manipular do que ponteiros

x 2 y * - * 2 y x

em forma ps-fixada em forma pr-fixada

S-expressions (Scheme, Lisp) e XML so essencialmente ASTs


20

Wednesday, May 23, 12

Cdigo de Mquina de Pilha


Burroughs B-5000, p-code Pascal, Smalltalk, Java

Exemplo:
x-2*y vira

push x push 2 push y mul sub

Vantagens

Compacta (muitas operaes precisam s de 1 byte - bytecode) Nomes dos temporrios so implcitos Simples de gerar cdigo e executar
til para transmisso de cdigo
21

Wednesday, May 23, 12

Cdigo de Trs Endereos


Muitas representaes diferentes

Em geral, cdigo de 3 endereos tem comandos da forma:


x y op z Com 1 operador (op ) e at 3 nomes (x, y, & z) Exemplo: zx-2*y Vantagens: vira

Lembra uma mquina RISC simples Introduz nomes para temporrios Forma compacta
22

Wednesday, May 23, 12

Cdigo de Trs Endereos


Muitas representaes diferentes

Em geral, cdigo de 3 endereos tem comandos da forma:


x y op z Com 1 operador (op ) e at 3 nomes (x, y, & z) Exemplo: zx-2*y Vantagens: vira
t 2 * y z x - t

Lembra uma mquina RISC simples Introduz nomes para temporrios * Forma compacta
22

Wednesday, May 23, 12

Cdigo de 3 Endereos: Qudruplas


Representao simples de cdigo de 3 endereos

Tabela de k * 4 inteiros ou vetor de registros Fcil de reordenar Nomes explcitos load loadI mult load sub r1, r2, r3, r4, r5, y 2 r2, r1 x r4, r3

O compilador FORTRAN original usava quads load loadi mult load sub 1 2 3 4 5
Qudruplas

y 2 2 x 4 3 1

Cdigo de 3 endereos

23

Wednesday, May 23, 12

Cdigo de 3 Endereos: Triplas


ndice nome implcito do destino 25% menos espao que quads Muito mais difcil de reordenar, a no ser que ndices nas operaes
sejam ponteiros

(1) (2) (3) (4) (5)

load loadI mult load sub

y 2 (1) x (4) (3) (2) Nomes implcitos no ocupam espao

24

Wednesday, May 23, 12

Grafo de Fluxo de Controle


Modela a transferncia de controle em um procedimento

Ns do grafo so blocos bsicos


Pode usar quads, triplas ou outra representao linear

Arestas no grafo representam fluxo de controle


Exemplo
if (x = y)

a2

a3

b5
ca*b

b4

25

Wednesday, May 23, 12

Forma SSA Ideia principal: definir cada nome apenas uma vez Introduzir funes (seleo) para fazer funcionar
Original x y while (x < k) x x + 1 y y + x Forma SSA ! ! x0 ! ! y0 ! ! if (x0 >= k) goto next loop:! ! x1 (x0,x2) ! ! ! y1 (y0,y2) ! x 2 x1 + 1 ! y 2 y1 + x2 ! ! ! if (x2 < k) goto loop next:

Vantagens da forma SSA

Anlise mais precisa Algoritmos mais rpidos


26

Wednesday, May 23, 12

Usando Mltiplas Representaes

Cdigo Fonte

Front End

IR 1

Middle IR 2 Middle IR 3 End End

Back End

Cdigo Nativo

Repetidamente reduzir o nvel da representao


intermediria
Cada representao voltada para certas otimizaes

Exemplo: GCC
AST, GIMPLE, RTL

Exemplo: V8
AST, Hydrogen, Lithium
27

Wednesday, May 23, 12

O Resto
Representar cdigo apenas parte de uma IR Outros componentes necessrios

Tabela de Smbolos Tabela de constantes


Representao, tipo Local de armazenamento, offset

Mapa de armazenamento
Layout geral Registradores virtuais

28

Wednesday, May 23, 12

Anlise Semntica

Cdigo Fonte

Front End

IR

Middle End

IR

Back End

Cdigo Nativo

Front end (analisador lxico + analisador sinttico) produz


uma rvore sinttica abstrata

Middle end faz a anlise semntica para checar a validade da


rvore e prepar-la com informao necessria para gerao de cdigo

Back end faz a gerao de cdigo final

29

Wednesday, May 23, 12

Informao Semntica Tabela de Smbolos


Normalmente se usa vrias, para os diferentes espaos de nomes e escopos Mapeia nomes em todo o programa para elementos reais da linguagem: variveis, funes, classes, mtodos

Checagem de Tipos
Anlise esttica dos tipos usados em todas as expresses e comandos do programa Informao sobre o tipo dos elementos do programa fica na tabela de smbolos

30

Wednesday, May 23, 12

Projetando a Anlise Semntica Regras de escopo


Escopo aninhado, redefinio de variveis, separao dos espaos de nomes... Afeta a estrutura das tabelas de smbolos Quando a amarrao dos nomes com os elementos reais feita?

Regras de Tipagem
Tipos existentes Tipos permitidos em expresses e comandos Tipos definidos pelo usurio Equivalncia de tipos, nominal ou estrutural

31

Wednesday, May 23, 12

Metodologia Percorrer e anotar a AST em mltiplas passadas Cada passada fica responsvel por uma verificao

semntica, e pode fornecer informao para passadas subsequentes da AST para cada passada, ou podemos fazer um esquema mais elaborado com o padro Visitor

Implementao pode ser simples, com um mtodo nas classes

Em geral todas as passadas percorrem a rvore em

profundidade, com aes especficas sendo executadas em pr-ordem, ordem, ou ps-ordem

32

Wednesday, May 23, 12

Tabelas de Smbolo com Escopo O problema


Compilador precisa de um registro para cada declarao Escopo lxico aninhado admite mltiplas declaraes

A interface
insert(nome, nvel): cria registro para nome em nvel lookup(nome): retorna registro para nome

Muitas implementaes foram propostas Vamos usar uma simples e que funciona bem para um

compilador pequeno (poucos nveis lxicos, poucos nomes)

Tabelas de smbolos so estruturas em tempo de compilao para resolver referncias para nomes. Veremos as estruturas em tempo de execuo correspondentes na gerao de cdigo.

33

Wednesday, May 23, 12

Exemplo
procedure p { ! ! ! ! ! ! ! ! ! ! ! ! ! ! } ! ! ! ! ! ! ! ! ! ! ! ! ! ! int a, b, c procedure q { ! ! ! ! ! ! ! ! ! ! } q int v, b, x, w procedure r { ! int x, y, z ! } procedure s { ! ! } int x, a, v .
B0: { ! ! ! ! ! ! ! ! ! ! ! }
34

! ! ! ! ! ! ! ! ! ! !

int a, b, c { ! ! ! ! ! ! ! ! ! ! } int v, b, x, w { ! ! } { ! ! } int x, a, v int x, y, z .

B1: ! ! B2: ! !

B3: ! !

rs

Wednesday, May 23, 12

Tabelas de Smbolo com Escopo


Ideia geral

Criar nova tabela para cada escopo Encade-las para busca


Implementao em resma de tabelas

insert() pode precisar criar uma


tabela

sempre insere no nvel corrente lookup() percorre cadeia de tabelas e


retorna primeira ocorrncia do nome Se o compilador tem que preservar a tabela (para depurao, por exemplo), essa ideia bastante prtica. Tabelas individuais so tabelas hash.
35

Wednesday, May 23, 12

Consideraes sobre Escopo Escopo dos parmetros da funo separado do corpo da


funo?

Variveis podem ser redefinidas no mesmo escopo? E em


escopos aninhados?
Se puderem ser redefinidas no mesmo escopo a estrutura de tabela de smbolo dos slides anteriores no serve

Variveis e funes podem ter o mesmo nome? E quanto a

variveis e nomes de classes? E mtodos? E tipos definidos pelo usurio? E quanto a espaos de nomes definidos pelo usurio (pacotes Java, namespaces C++)?
Em geral cada espao de nomes deve ter sua prpria tabela de smbolos ou pilha de tabelas de smbolo
36

Wednesday, May 23, 12

Checagem de Tipos Checagem esttica de tipos a maior parte do analisador


semntico

Verifica o uso consistente dos tipos


Operandos Lado direito com lado esquerdo de atribuies Interfaces de funes Membros de estruturas

Todo termo da linguagem envolve tipos de alguma forma Vrias linguagens adiam essa verificao para a execuo do
programa: tipagem dinmica
Requer gerao de cdigo e uma ambiente de execuo mais elaborados
37

Wednesday, May 23, 12

Tipos Simples
Tipos primitivos da linguagem
Pr-definidos pela especificao inteiros, caracteres, nmeros de ponto flutuante, booleanos, o tipo void Detalhes como tamanho podem ser parte da especificao (Java), ou ficar em aberto para o implementador (C)

Linguagem tambm define regras de compatibilidade entre


esses tipos
C e Java tm vrios tamanhos de inteiros, e regras de converso entre os diferentes tamanhos O mesmo vale para inteiros e nmeros de ponto flutuante Qual o tipo de x+y se x inteiro e y p.f.? Existem linguagens em que essa operao invlida, e outras em que x+y sempre adio inteira e existe outro operador para adio de p.f.
38

Wednesday, May 23, 12

Construtores de Tipos Mecanismos na linguagem para criao de novos tipos


Enumeraes, vetores, matrizes, ponteiros, estruturas, unies, funes, classes... Tipos novos podem ter nomes prprios (classes em Java, typedef de C) ou serem annimos

Compilador precisa representar a estrutura de cada tipo


Os tipos normalmente formam sua prpria mini-linguagem com sua AST

Como os tipos so comparados? Pode ser por nome (Java) ou


pela estrutura (C)

39

Wednesday, May 23, 12

Vetores e Matrizes Tipos de vetor formados a partir de um tipo base O tamanho do vetor pode fazer parte do tipo ou no Equivalncia entre tipos de vetores
Pode-se usar variveis de tipo vetor em uma atribuio? O vetor copiado ou criado um alias? Vetores com tamanhos diferentes so compatveis? E quanto a tipos base diferentes (vetores em Java)

Como funcionam as matrizes? So vetores de vetores, ou uma


estrutura contgua?

40

Wednesday, May 23, 12

Estruturas (structs) Generalizao de vetores, com uma coleo de valores de


tipos diferentes
Os nomes dos campos so convertidos para offsets no cdigo gerado

Qual o espao de nomes dos campos? Cada tipo de estrutura


tem o seu?

Equivalncia de estruturas
Nominal (como nas classes Java) ou estrutural, como em ML? Na equivalncia estrutural dois tipos struct so o mesmo tipo se tm campos equivalentes na mesma ordem Algoritmo recursivo

41

Wednesday, May 23, 12

Tipos Recursivos Uma estrutura ou classe pode ter um campo com o mesmo
tipo dela?
Em C e C++ no, mas pode ter um ponteiro para ela Em Java sim

Tipos recursivos complicam algoritmos de equivalncia


estrutural, mas so triviais em equivalncia nominal

Implementao de tipos recursivos sempre usa algum tipo de


indireo (ponteiros), seja explcitamente, como em C, ou implicitamente, como em Java

42

Wednesday, May 23, 12

Funes Tipos especficos para funes s so necessrios quando se


tem ponteiros de funo e mecanismos similares (funes como valores) estrutura, com problemas similares

Na prtica tipos de funo so equivalentes a tipos de Outros aspecto importante so a amarrao de funces e
qual o espao de nomes das funes

43

Wednesday, May 23, 12

Equivalncia de Tipos em C Mistura de equivalncia estrutural e nominal


Structs e unions usam equivalncia nominal mdulo typedefs Vetores, ponteiros e funes usam equivalncia estrutural Vrias regras de coero entre tipos primitivos Structs annimas tm um nome definido pelo compilador O cdigo a seguir no compila com erro de tipo na atribuio struct { int a; } foo; struct { int a; } bar; foo.a = 2; bar = foo;

44

Wednesday, May 23, 12

TINY Tipado Vamos acrescentar declaraes de variveis e tipos a TINY,


seguindo a seguinte gramtica:
var-decl : var id : tipo tipo : tipo-simp | tipo-estrut tipo-simp : int | bool | char tipo-estrut : array [ num ] of tipo | record campos end | tipo campos : id : tipo {; id : tipo}

A verificao de tipos estrutural, e no permitido


atribuies envolvendo arrays e records

O tamanho do array no conta para equivalncia


45

Wednesday, May 23, 12