CES-41 COMPILADORES Capítulo VI Análise Semântica.

187
CES-41 CES-41 COMPILADORES COMPILADORES Capítulo VI Capítulo VI Análise Semântica Análise Semântica

Transcript of CES-41 COMPILADORES Capítulo VI Análise Semântica.

Page 1: CES-41 COMPILADORES Capítulo VI Análise Semântica.

CES-41 CES-41 COMPILADORESCOMPILADORES

Capítulo VICapítulo VIAnálise SemânticaAnálise Semântica

Page 2: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Capítulo VI – Análise Capítulo VI – Análise SemânticaSemântica6.1 – Classificação dos testes semânticos6.1 – Classificação dos testes semânticos

6.2 – Montagem de uma tabela de 6.2 – Montagem de uma tabela de símbolossímbolos

6.3 – Testes semânticos no Yacc6.3 – Testes semânticos no Yacc

6.4 – Testes semânticos em análise 6.4 – Testes semânticos em análise preditorapreditora

6.5 – Formalização de análise semântica6.5 – Formalização de análise semântica

Page 3: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.1 – Classificação dos 6.1 – Classificação dos Testes SemânticosTestes Semânticos

6.1.1 – O papel da análise semântica6.1.1 – O papel da análise semântica

A A análise semânticaanálise semântica verifica se as construções verifica se as construções sintáticassintáticas fazem fazem sentidosentido

GLC’s não sãoGLC’s não são suficientemente suficientemente poderosaspoderosas para para descrever várias construções de descrever várias construções de linguagens de linguagens de programaçãoprogramação

É conveniente que aspectos É conveniente que aspectos dependentes de dependentes de contextocontexto nessas linguagens sejam tratados nessas linguagens sejam tratados durante a durante a análise semânticaanálise semântica

Page 4: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: seja a linguagem já vista no Capítulo seja a linguagem já vista no Capítulo II:II:

L = {w c w | w L = {w c w | w (a | b)*} (a | b)*}onde ∑ = {a, b, c}onde ∑ = {a, b, c}

Sentença típica: Sentença típica: aababaababccaababaabab

A linguagem é uma A linguagem é uma simplificaçãosimplificação daquelas daquelas que exigem a que exigem a declaraçãodeclaração de todo de todo identificadoridentificador usado nos comandos usado nos comandos executáveis.executáveis.

Tais linguagens não podem ser geradas por Tais linguagens não podem ser geradas por gramáticas livres de contextogramáticas livres de contexto (GLC’s) (GLC’s)

Page 5: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Os testes semânticos são de Os testes semânticos são de caráter estáticocaráter estático, , em contraposição aos em contraposição aos testes dinâmicostestes dinâmicos feitos feitos em em tempo de execuçãotempo de execução

Exemplo 6.2: Exemplo 6.2: Um Um teste dinâmicoteste dinâmico::

Sejam a declaração e os comandos em Sejam a declaração e os comandos em CC::

int A[100], i, x; int A[100], i, x;

scanf (“%d”, &i); scanf (“%d”, &i); x = A[i];x = A[i];

Evitar Evitar i > 99i > 99, só é possível em , só é possível em tempo de tempo de execuçãoexecução

Page 6: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Os testes semânticos podem ser grupados em Os testes semânticos podem ser grupados em quatro classesquatro classes::

Declaração e uso de identificadores e Declaração e uso de identificadores e constantesconstantes

Compatibilidade de tipos Compatibilidade de tipos

Fluxo de dados Fluxo de dados

Fluxo de controleFluxo de controle

Page 7: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.1.2 – Declarações e uso de 6.1.2 – Declarações e uso de identificadores e constantesidentificadores e constantes

a) Todos os identificadores usados devem a) Todos os identificadores usados devem ser declarados:ser declarados:

A verificação A verificação não é tão simplesnão é tão simples em em linguagens organizadas por linguagens organizadas por blocosblocos ou ou linguagens que admitem linguagens que admitem aninhamento de aninhamento de sub-programassub-programas

Page 8: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: em C:em C:

É exigida informação sobre o É exigida informação sobre o escopo de escopo de validadevalidade de um identificador na de um identificador na TabSimbTabSimb

int x ( ) {int a;- - - - -

}

int y ( ) {- - - - -. . . = . . . + a +

. . .}

A variável a está na TabSimb

Mas seu uso em y está incorreto

Page 9: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: em C:em C://// Declaracoes globaisDeclaracoes globais

- - - - - - - - - -- - - - - - - - - -void main ( ) {void main ( ) {

- - - - -- - - - -{ //Bloco 1{ //Bloco 1

int a;int a;- - - - -- - - - -{//Bloco 2{//Bloco 2

- - - - -- - - - -{//Bloco 3{//Bloco 3

. . . . . = . . . . . + a + . . . . . ;. . . . . = . . . . . + a + . . . . . ;}//Bloco 3 - fim}//Bloco 3 - fim

}//Bloco 2 - fim}//Bloco 2 - fim}//Bloco 1 – fim}//Bloco 1 – fim{//Bloco 4{//Bloco 4

. . . . . = . . . . . + a + . . . . . ;. . . . . = . . . . . + a + . . . . . ;}//Bloco 4 - fim}//Bloco 4 - fim

}//}// main - fimmain - fim

Uso correto

Uso incorre

to

Declaração de a no Bloco 1

Page 10: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Nessas linguagens, a Nessas linguagens, a tabela de símbolostabela de símbolos deve deve ter informações sobre o ter informações sobre o escopo de validadeescopo de validade de um de um identificadoridentificador

FortranFortran dispensa a declaração dos dispensa a declaração dos identificadores usadosidentificadores usados

Page 11: CES-41 COMPILADORES Capítulo VI Análise Semântica.

b) Dupla declaração de identificadores:b) Dupla declaração de identificadores:

Isso é Isso é proibidoproibido para variáveis, funções e tipos para variáveis, funções e tipos globaisglobais ou ou locais locais de um de um mesmo blocomesmo bloco

A Linguagem A Linguagem CC permite que o nome de uma permite que o nome de uma funçãofunção seja usado também como nome de seja usado também como nome de variável localvariável local a essa função a essa função

É que a É que a funçãofunção é definida no é definida no escopo globalescopo global

No entanto, uma No entanto, uma funçãofunção não pode ter o mesmo não pode ter o mesmo nome de uma nome de uma variável globalvariável global

Page 12: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: em C:em C:

#include <stdio.h>#include <stdio.h>

int int aa = 7; = 7;

int int bb ( ) { int ( ) { int bb = 3; return a+b; } = 3; return a+b; }

float x ( ) { float float x ( ) { float aa = 8.7; return a; } = 8.7; return a; }

void main ( ) {void main ( ) {

char char aa = '$'; int c; float d; = '$'; int c; float d;c = b( ); d = x( );c = b( ); d = x( );printf ("a = %c, c = %d, d = %g", a, c, d);printf ("a = %c, c = %d, d = %g", a, c, d);

}}

Declarações legais de a

Declarações legais de b

Page 13: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: em C:em C:

#include <stdio.h>#include <stdio.h>

int int aa = 7; = 7;

int int aa ( ) { int b = 3; return a+b; } ( ) { int b = 3; return a+b; }

float x ( ) { float a = 8.7; return a; }float x ( ) { float a = 8.7; return a; }

void main ( ) {void main ( ) {

char a = '$'; int c; float d;char a = '$'; int c; float d;c = b( ); d = x( );c = b( ); d = x( );printf ("a = %c, c = %d, d = %g", a, c, d);printf ("a = %c, c = %d, d = %g", a, c, d);

}}

Duas declarações de a: ambas no escopo global A segunda declaração é ilegal

Page 14: CES-41 COMPILADORES Capítulo VI Análise Semântica.

c) Dimensionamento de variáveis indexadas:c) Dimensionamento de variáveis indexadas:

Cada linguagemCada linguagem tem sua forma de dimensionar tem sua forma de dimensionar

Pascal:Pascal:

ID ID : array [: array [CTE1 CTE1 .... CTE2 CTE2] of ] of TipoPrimitivo TipoPrimitivo ;;

É obrigatório que CTE1 É obrigatório que CTE1 CTE2 CTE2

Linguagem C:Linguagem C:

Tipo Variável Tipo Variável [ [ CTE CTE ] ;] ;

É obrigatório que CTE > 0É obrigatório que CTE > 0

Page 15: CES-41 COMPILADORES Capítulo VI Análise Semântica.

d) Uso de subscritos:d) Uso de subscritos:

Variáveis escalares Variáveis escalares não podem ter não podem ter subscritossubscritos

ExpressõesExpressões e lados esquerdos de comandos de e lados esquerdos de comandos de atribuiçãoatribuição em em C:C:

O número de O número de subscritossubscritos de variáveis de variáveis indexadas e de campos indexados de indexadas e de campos indexados de estruturas deve ser igual ao número de estruturas deve ser igual ao número de suas suas dimensõesdimensões

Page 16: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo:Exemplo: código em C: código em C:

int i, j, k, A[10][20][5];int i, j, k, A[10][20][5];- - - - -- - - - -A[i+1][2-j][3*k] = ..... ;A[i+1][2-j][3*k] = ..... ;..... = ..... + A[7][15][2] + ..... ;..... = ..... + A[7][15][2] + ..... ;- - - - -- - - - -A[i-3] = ..... ;A[i-3] = ..... ;..... = ..... + A[7][15] + ..... ;..... = ..... + A[7][15] + ..... ;A = ..... ;A = ..... ;

Referências legais à variável A

Referências ilegais à variável A

Page 17: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Comandos de leitura em Comandos de leitura em C:C:

O O número de subscritos número de subscritos de variáveis de variáveis indexadas do tipo indexadas do tipo charchar e de campos e de campos indexados desse tipo nas estruturas deve indexados desse tipo nas estruturas deve ser ser igualigual ou ou uma unidade menor uma unidade menor que o que o número de suas número de suas dimensõesdimensões

Exemplo: Exemplo: código legal em C:código legal em C:

char A[15], B[5][10]; char A[15], B[5][10]; scanf (“%s%s%c%c”, A, B[4], A[12], B[2][3]);scanf (“%s%s%c%c”, A, B[4], A[12], B[2][3]);

Page 18: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Comandos de escrita em Comandos de escrita em C:C:

Pode-se escrever um Pode-se escrever um vetor de elementos vetor de elementos de uma variável indexada do tipo de uma variável indexada do tipo charchar ou ou do campo indexado desse tipo de uma do campo indexado desse tipo de uma estruturaestrutura

Exemplo: Exemplo: código legal em C:código legal em C:

char A[15], B[5][10]; char A[15], B[5][10]; - - - - - - - - - - printf (“A = %s; B[4] = %s”, A, B[4]);printf (“A = %s; B[4] = %s”, A, B[4]);

Page 19: CES-41 COMPILADORES Capítulo VI Análise Semântica.

e) Campos de estruturas e de union’s:e) Campos de estruturas e de union’s:

Estão Estão usados corretamenteusados corretamente, isto é, , isto é, correspondem a um correspondem a um campo declarado da campo declarado da estruturaestrutura na qual está sendo usado? na qual está sendo usado?

Exemplo:Exemplo:

typedef struct st st;typedef struct st st;struct st {int a; float x;};struct st {int a; float x;};st s;st s;- - - - -- - - - -

s.a = ..... ; x = ..... ;s.a = ..... ; x = ..... ;

correto

incorreto

Page 20: CES-41 COMPILADORES Capítulo VI Análise Semântica.

PascalPascal não admite que, num não admite que, num mesmo escopomesmo escopo, , o identificador de um o identificador de um campocampo de uma estrutura de uma estrutura seja usado como campo de seja usado como campo de outra estruturaoutra estrutura ou ou como nome de como nome de variávelvariável

Em Pascal:

typest1 = record

a: integer; b: real;

end;st2 = record

a: real; c: char;

end;var

a: integer;

Declarações ilegais

Em C:

struct st1 {int a; float b;

};struct st2 {

float a; char c;};int a;

Declarações legais

Page 21: CES-41 COMPILADORES Capítulo VI Análise Semântica.

f) Unicidade dos rótulos de um comando de f) Unicidade dos rótulos de um comando de seleção seleção

Exemplo: Exemplo: comando comando switch-caseswitch-case em C: em C:

switch (expr) {switch (expr) {case 1: - - - - - ; break;case 1: - - - - - ; break;case 2: - - - - - ; break;case 2: - - - - - ; break;case 1: - - - - - ; break;case 1: - - - - - ; break;

}}

g) Declaração de um único módulo principalg) Declaração de um único módulo principal

Erro: rótulo repetido

Page 22: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.1.3 – Compatibilidade de tipos6.1.3 – Compatibilidade de tipos

a) Já vistos em aulas de laboratório:a) Já vistos em aulas de laboratório:

Compatibilidade entre operadores e operandos Compatibilidade entre operadores e operandos de de expressõesexpressões

Compatibilidade entre os dois lados de um Compatibilidade entre os dois lados de um comando de atribuiçãocomando de atribuição

Compatibilidade da expressão de controle dos Compatibilidade da expressão de controle dos comandos condicionaiscomandos condicionais, , repetitivosrepetitivos e da e da expressão em expressão em subscritossubscritos de variáveis de variáveis indexadasindexadas

Page 23: CES-41 COMPILADORES Capítulo VI Análise Semântica.

b) Compatibilidade entre argumentos de b) Compatibilidade entre argumentos de chamada e parâmetros de um sub-chamada e parâmetros de um sub-programa:programa:

Essa compatibilidade deve ser em Essa compatibilidade deve ser em númeronúmero, , tipotipo e e modomodo de passagem de parâmetros de passagem de parâmetros

Em passagem Em passagem por valorpor valor, o argumento deve ser , o argumento deve ser uma uma expressãoexpressão; em passagem ; em passagem por referênciapor referência, , deve ser uma deve ser uma variávelvariável

c) Compatibilidade entre o valor retornado e c) Compatibilidade entre o valor retornado e o tipo de uma funçãoo tipo de uma função

d) Compatibilidade entre o protótipo e a d) Compatibilidade entre o protótipo e a definição de um subprogramadefinição de um subprograma

Page 24: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.1.4 – Fluxo de dados6.1.4 – Fluxo de dados

a) Inicialização e referência a variáveisa) Inicialização e referência a variáveis

Já vistos em aulas de laboratórioJá vistos em aulas de laboratório

b) Alteração na variável de controle de b) Alteração na variável de controle de laços:laços:

Em algumas linguagens como Em algumas linguagens como PascalPascal, , AlgolAlgol, , FortranFortran, etc., os , etc., os laçoslaços forfor vêm com uma vêm com uma variável de controlevariável de controle explícita explícita

Em algumas delas, é Em algumas delas, é proibido alterarproibido alterar seu seu valor no valor no escopoescopo do laço do laço

Page 25: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo:Exemplo: em Pascal: em Pascal:

for i := 1 to n do beginfor i := 1 to n do begin- - - - -- - - - -i := ..... ;i := ..... ;- - - - -- - - - -read (i);read (i);- - - - -- - - - -

endend

proibidos

Page 26: CES-41 COMPILADORES Capítulo VI Análise Semântica.

c) Utilidade de valores atribuídos às c) Utilidade de valores atribuídos às variáveisvariáveis

Não raro, programas atribuem Não raro, programas atribuem valores inúteisvalores inúteis a algumas de suas variáveis, ou seja, valores a algumas de suas variáveis, ou seja, valores que que não serão usadosnão serão usados em nenhum momento em nenhum momento em em qualquer execuçãoqualquer execução do programa do programa

A A detecçãodetecção desse fato normalmente ocorre na desse fato normalmente ocorre na fase de fase de otimização do código intermediáriootimização do código intermediário, , por meio de uma por meio de uma análise de fluxo de dadosanálise de fluxo de dados do programado programa

Page 27: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.1.5 – Fluxo de controle6.1.5 – Fluxo de controle

a) Detecção de sub-programas recursivos a) Detecção de sub-programas recursivos

b) Detecção de chamadas recursivas infinitasb) Detecção de chamadas recursivas infinitas

c) Um escape de comando composto está c) Um escape de comando composto está dentro de um comando composto?dentro de um comando composto?

d) Um comando será executado em alguma d) Um comando será executado em alguma circunstância?circunstância?

Exigem Exigem análise do fluxo de controleanálise do fluxo de controle, , normalmente aplicada ao programa na fase de normalmente aplicada ao programa na fase de otimizaçãootimização do código intermediário do código intermediário

  

Page 28: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.2 – Montagem de uma 6.2 – Montagem de uma Tabela de SímbolosTabela de Símbolos

6.2.1 – Abordagem progressiva:6.2.1 – Abordagem progressiva:

Linguagens Linguagens sem subprogramas sem subprogramas (visto em (visto em aulas de laboratório)aulas de laboratório)

Linguagens com Linguagens com subprogramas subprogramas desaninhadosdesaninhados e sem estruturas de blocos e sem estruturas de blocos

Linguagens com Linguagens com aninhamentosaninhamentos de de subprogramas e/ou estruturas de subprogramas e/ou estruturas de blocosblocos

Page 29: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.2.2 – Linguagens sem subprogramas 6.2.2 – Linguagens sem subprogramas

Estrutura de dados em Estrutura de dados em hashing abertohashing aberto

FunçãoFunção para o para o hashinghashing::

Onde: Onde: – NCLASSHASH é o NCLASSHASH é o número de classesnúmero de classes..– nn é o número de caracteres de é o número de caracteres de x x (sem o (sem o ‘\‘\0’0’))

Page 30: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Esquema da tabela de símbolos:Esquema da tabela de símbolos:

Page 31: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Declarações:Declarações:

typedef struct celsimb celsimb;typedef struct celsimb celsimb;typedef celsimb *simbolo;typedef celsimb *simbolo;struct celsimb {struct celsimb {

char *cadeia;char *cadeia;int tid, tvar, ndims, dims[MAXDIMS+1];int tid, tvar, ndims, dims[MAXDIMS+1];char inic, ref, array; simbolo prox; };char inic, ref, array; simbolo prox; };

simbolo tabsimb[NCLASSHASH];simbolo tabsimb[NCLASSHASH];

Acadei

aIDVA

R

tid

INTEIROtvar

0inic

0ref

1arra

y3

ndims

10

20

5 ..........

dims

0 1 2 3 10

int A[10][20][5];

Page 32: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Funções:Funções:

int InicTabSimb ( )int InicTabSimb ( )simbolo ProcuraSimb simbolo ProcuraSimb

(char *cadeia)(char *cadeia)simbolo InsereSimb simbolo InsereSimb

(char *cadeia, int tid, int tvar)(char *cadeia, int tid, int tvar)int hash (char *cadeia)int hash (char *cadeia)

Acadei

aIDVA

R

tid

INTEIROtvar

0inic

0ref

1arra

y3

ndims

10

20

5 ..........

dims

0 1 2 3 10

Page 33: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.2.3 – Linguagens com subprogramas 6.2.3 – Linguagens com subprogramas desaninhados e sem estruturas de desaninhados e sem estruturas de blocosblocos

Há vários tipos de Há vários tipos de subprogramassubprogramas::

Cada Cada nome de subprograma nome de subprograma deve ter deve ter informação sobre o informação sobre o tipotipo de subprograma de subprograma

Em Em PascalPascal, por exemplo, , por exemplo, tid = IDFUNC tid = IDFUNC ou ou IDPROCIDPROC

Page 34: CES-41 COMPILADORES Capítulo VI Análise Semântica.

EscoposEscopos para linguagens para linguagens sem aninhamento sem aninhamento de subprogramasde subprogramas

Escopo Escopo globalglobal Escopo de cada Escopo de cada subprogramasubprograma

O escopo global O escopo global abrangeabrange os dos subprogramas os dos subprogramas

Escopo do Escopo do programa principalprograma principal::

Em Em CC, tem tratamento de , tem tratamento de subprogramasubprograma Em Em PascalPascal, tem tratamento de escopo , tem tratamento de escopo globalglobal

Page 35: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Informação sobre Informação sobre escopoescopo de um identificador: de um identificador:

PonteiroPonteiro para a para a célulacélula da tabela que da tabela que contém o nome do identificador que define contém o nome do identificador que define o escopoo escopo

Exemplo:Exemplo: em Cem C

int ff ( ) {int a;- - - -

-}

ff IDFUNC

a IDVAR escopo

Page 36: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Há Há escoposescopos que não correspondem a que não correspondem a nenhum nenhum identificadoridentificador

Exemplo: Exemplo: escopo escopo globalglobal em C em C Pode-se usar na tabela um identificador Pode-se usar na tabela um identificador

artificial: artificial: ##global##global, por exemplo, por exemplo Tipo de id: Tipo de id: IDGLOBIDGLOB

Novas informações para Novas informações para identificadores de identificadores de variáveisvariáveis::

Se são Se são parâmetrosparâmetros ou não ou não Tipo de Tipo de passagempassagem de parâmetros de parâmetros

Page 37: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Novas informações para identificadores de Novas informações para identificadores de subprogramassubprogramas ou do ou do escopo globalescopo global::

Lista de Lista de variáveis locaisvariáveis locais Lista de Lista de parâmetrosparâmetros Lista de Lista de funçõesfunções (para o escopo (para o escopo globalglobal))

Exemplo: Exemplo: a seguir,a seguir, tabela de símbolos tabela de símbolos para o códigopara o código- - - - -- - - - -int d, e, f;int d, e, f;int ff (int m, int n) {int ff (int m, int n) {

int q, p; - - - - -int q, p; - - - - -} - - - - -} - - - - -

Page 38: CES-41 COMPILADORES Capítulo VI Análise Semântica.

int d, e, f;int ff (int m, int

n) {int q, p; - - -

}

Page 39: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Sugestões para Sugestões para declaraçõesdeclarações relativas à relativas à tabela de símbolostabela de símbolos

/* Definicao dos tipos de identificadores *//* Definicao dos tipos de identificadores */

#define IDGLOB#define IDGLOB 11#define IDVAR#define IDVAR 22#define IDFUNC#define IDFUNC 33#define IDPROC#define IDPROC 44#define IDPROG#define IDPROG 55

/* Definicao dos tipos de /* Definicao dos tipos de passagem de parametros */passagem de parametros */

#define PARAMVAL#define PARAMVAL 11 11#define PARAMREF#define PARAMREF 22 22

Page 40: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Listas de simbolos *//* Listas de simbolos */

typedef struct elemlistsimb elemlistsimb;typedef struct elemlistsimb elemlistsimb;typedef elemlistsimb *pontelemlistsimb;typedef elemlistsimb *pontelemlistsimb;typedef elemlistsimb *listsimb;typedef elemlistsimb *listsimb;struct elemlistsimb {struct elemlistsimb {

simbolo simb; simbolo simb; pontelemlistsimb prox;pontelemlistsimb prox;

}}

Page 41: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Tabela de simbolos *//* Tabela de simbolos */

typedef struct celsimb celsimb;typedef struct celsimb celsimb;typedef celsimb *simbolo;typedef celsimb *simbolo;struct celsimb {struct celsimb {

char *cadeia;char *cadeia;int tid, tvar, int tid, tvar, tparamtparam , ndims, , ndims,

dims[MAXDIMS+1];dims[MAXDIMS+1];char inic, ref, array, char inic, ref, array, parametroparametro ; ;listsimb listvar, listparam, listsimb listvar, listparam,

listfunc; listfunc; simbolo simbolo escopoescopo , prox; , prox;

};};simbolo tabsimb[NCLASSHASH];simbolo tabsimb[NCLASSHASH];

Page 42: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.2.4 – Linguagens com aninhamentos 6.2.4 – Linguagens com aninhamentos de subprogramas e/ou estruturas de de subprogramas e/ou estruturas de blocosblocos

BlocosBlocos são são comandos compostoscomandos compostos com com declaraçõesdeclarações no início no início

Numa gramática, um Numa gramática, um blocobloco pode ser pode ser implementado pela seguinte implementado pela seguinte produçãoprodução::

Bloco Bloco {{ ListDeclarações ListDeclarações ListComandos ListComandos }}

Page 43: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Numa gramática, Numa gramática, subprogramas aninhadossubprogramas aninhados podem ser implementados pelas seguintes podem ser implementados pelas seguintes produçõesproduções::

Programa Programa CabeçalhoProg Declarações CabeçalhoProg Declarações SubProgramas CmdCompostoSubProgramas CmdComposto

SubProgramas SubProgramas εε | SubProgramas | SubProgramas DefSubProgDefSubProg

DefSubProg DefSubProg CabeçalhoSubProg CabeçalhoSubProg Declarações Declarações SubProgramas SubProgramas CmdCompostoCmdComposto

Page 44: CES-41 COMPILADORES Capítulo VI Análise Semântica.

PascalPascal trabalha com trabalha com blocosblocos e os e os subprogramassubprogramas podem ser podem ser aninhados aninhados

A Linguagem A Linguagem CC trabalha com trabalha com blocosblocos, mas os , mas os subprogramas são subprogramas são desaninhadosdesaninhados

Page 45: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Em linguagens com essa estrutura, os Em linguagens com essa estrutura, os escoposescopos formam uma formam uma árvore hierárquicaárvore hierárquica::

O escopo O escopo globalglobal é a é a raizraiz da árvore da árvore

Os Os subprogramassubprogramas do escopo do escopo globalglobal são seus são seus filhosfilhos na árvore na árvore

Os Os subprogramassubprogramas e os e os blocos internosblocos internos a um a um outro subprograma são outro subprograma são filhosfilhos desse último desse último

Os Os camposcampos de uma de uma estruturaestrutura e de uma e de uma unionunion são são filhosfilhos dessas construções dessas construções

Page 46: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Os Os escopos dos blocosescopos dos blocos podem ser representados na podem ser representados na tabela de símbolos por tabela de símbolos por identificadores artificiaisidentificadores artificiais (por exemplo, (por exemplo, ##bloco01##bloco01, , ##bloco02##bloco02, etc.), etc.)

Cada Cada identificador de escopoidentificador de escopo pode ter uma pode ter uma lista lista de escopos filhosde escopos filhos, tal como o caso do escopo , tal como o caso do escopo globalglobal, no passo anterior desta abordagem , no passo anterior desta abordagem progressivaprogressiva

Dois identificadoresDois identificadores na tabela de símbolos podem na tabela de símbolos podem ter o ter o mesmo nomemesmo nome, desde que pertencentes a , desde que pertencentes a escopos diferentesescopos diferentes

Assim sendo, uma Assim sendo, uma procuraprocura na tabela de símbolos na tabela de símbolos deve informar qual o deve informar qual o identificadoridentificador procurado e em procurado e em qual qual escopoescopo ela é feita ela é feita

Page 47: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: blocos em C:blocos em C:

void main ( ) {void main ( ) {{bloco 1} {bloco 2}{bloco 1} {bloco 2}

}}int f1 ( ) {int f1 ( ) {

{bloco 3} {bloco 4}{bloco 3} {bloco 4}}}float f2 ( ) {float f2 ( ) {

struct st {struct st {int c1; float c2}int c1; float c2}

}}

##globalescop

o

listescfilhos

mainescop

o

listescfilhos

##bloco 1escop

o

##bloco 2escop

o

f1escop

o

listescfilhos

escopo

##bloco 3escop

o

##bloco 4

f2escop

o

listtipos

stescop

o

c1escop

o

c2escop

ost

f2

Page 48: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.3 – Testes Semânticos no 6.3 – Testes Semânticos no YaccYacc

6.3.1 – Linguagem ilustrativa6.3.1 – Linguagem ilustrativa

A A linguagemlinguagem para ilustrar este tópico tem as para ilustrar este tópico tem as seguintes características, no tocante a seguintes características, no tocante a subprogramassubprogramas e e blocosblocos::

Os subprogramas são do tipo Os subprogramas são do tipo funçãofunção, podendo , podendo ser eles do tipo ser eles do tipo voidvoid (que não retornam valor) ou (que não retornam valor) ou de algum tipo (retornando valor escalar)de algum tipo (retornando valor escalar)

Não há Não há aninhamento de funçõesaninhamento de funções

Internamente às funções, pode haver Internamente às funções, pode haver aninhamentos de blocosaninhamentos de blocos

Page 49: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Produções da gramática, para Produções da gramática, para subprogramação:subprogramação:

ProgProg : DeclGlobs Funções: DeclGlobs FunçõesDeclGlobsDeclGlobs : : εε | | globais :globais : ListDecls ListDeclsListDeclsListDecls : - - - - - - - - - - (conhecidas de outras : - - - - - - - - - - (conhecidas de outras

gramáticas)gramáticas)- - - - - - - - - -- - - - - - - - - -FunçõesFunções : : funcoes : funcoes : ListFunc ListFuncListFuncListFunc : Função | ListFunc Função: Função | ListFunc FunçãoFunçãoFunção : Cabeçalho Bloco: Cabeçalho BlocoCabeçalhoCabeçalho : Tipo : Tipo ID ( ID ( ListParam ListParam ))TipoTipo : : int int | - - - - - - - - - - | | - - - - - - - - - - | voidvoidListParamListParam : - - - - - - - - - - (conhecidas de outras : - - - - - - - - - - (conhecidas de outras

gramáticas)gramáticas)- - - - - - - - - -- - - - - - - - - -

Átomos em negrito

Page 50: CES-41 COMPILADORES Capítulo VI Análise Semântica.

BlocoBloco : : {{{{ DeclLocs Comandos DeclLocs Comandos }}}}DeclLocsDeclLocs : : εε | | locaislocais :: ListDecls ListDeclsComandosComandos : : comandoscomandos :: ListCmds ListCmdsListCmdsListCmds : Comando | ListCmds Comando: Comando | ListCmds ComandoComandoComando : CmdAtrib | CmdSe | - - - - - - - - | : CmdAtrib | CmdSe | - - - - - - - - |

Bloco Bloco | CmdComposto| CmdComposto

CmdComposto: CmdComposto: { { ListCmds ListCmds }}

Exemplo: Exemplo: um programa típico:um programa típico:

globais:globais:int a, b; real c, d;int a, b; real c, d;

funcoes:funcoes:

Delimitadores de blocos (ABBLOC e FBLOC)

Page 51: CES-41 COMPILADORES Capítulo VI Análise Semântica.

int ff (int x, y;) {{int ff (int x, y;) {{locais: locais:

logic m, n;logic m, n;comandos:comandos:

a = b + 1;a = b + 1;{{

c = d + 1; if ( - - - - - ) - - - - - ; m = !n;c = d + 1; if ( - - - - - ) - - - - - ; m = !n;}}{{ locais: int k, l; comandos: - - - - - }}{{ locais: int k, l; comandos: - - - - - }}

}}}}void main ( ) {{void main ( ) {{

locais: - - - - -locais: - - - - -comandos: - - - - -comandos: - - - - -

}}}}

Delimitadores de blocos (ABBLOC e FBLOC)

Page 52: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.3.2 – Declaração e uso de 6.3.2 – Declaração e uso de identificadoresidentificadores

É necessário verificar se o É necessário verificar se o identificadoridentificador usado usado está na está na tabela de símbolostabela de símbolos, no , no escopo de escopo de seu usoseu uso ou em algum ou em algum ancestralancestral desse escopo desse escopo na árvore de escoposna árvore de escopos

A função A função ProcuraSimbProcuraSimb deve ter como deve ter como parâmetro, além da parâmetro, além da cadeiacadeia procurada, o procurada, o escopoescopo onde ela deve ser procurada onde ela deve ser procurada

Essa procura deve ser feita na produçãoEssa procura deve ser feita na produçãoVariável : ID SubscritosVariável : ID Subscritos

Page 53: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo:Exemplo:

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl 5 */ - - - - - }}{{ /*bl 5 */ - - - - - }}}}}}

##globalescopo

mainescopo

##bl 1escopo

##bl 2escopo

##bl 3escopo

##bl 4escopo

ffescopo

##bl 5escopo

Escopo do uso de a

átomo em análise

Usar uma variável global escopo para indicar o escopo do átomo em análise

escopo

Page 54: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

No início, insere-se o identificador ##global na TabSimb, que passa a ser o escopo corrente

escopo

Page 55: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O identificador main é inserido na TabSimb, no escopo de ##global

escopo

mainescopo

Page 56: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O escopo corrente passa a ser o de main

escopo

mainescopo

Page 57: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O identificador ##bl1 é inserido na TabSimb, no escopo de main

escopo

mainescopo

##bl1escopo

Page 58: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O escopo corrente passa a ser o de ##bl1

escopo

mainescopo

##bl1escopo

Page 59: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O escopo corrente volta a ser o de main

escopo

mainescopo

##bl1escopo

Page 60: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O identificador ##bl2 é inserido na TabSimb, no escopo de main

escopo

mainescopo

##bl1escopo

##bl2escopo

Page 61: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O escopo corrente passa a ser o de ##bl2

escopo

mainescopo

##bl1escopo

##bl2escopo

Page 62: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O identificador ##bl3 é inserido na TabSimb, no escopo de ##bl2

escopo

mainescopo

##bl1escopo

##bl2escopo

##bl3escopo

Page 63: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

O escopo corrente passa a ser o de ##bl3

escopo

mainescopo

##bl1escopo

##bl2escopo

##bl3escopo

Page 64: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Declaracoes globais *//* Declaracoes globais */- - - - -- - - - -

void main ( ) {{void main ( ) {{{{ /*bl 1*/ - - - - - }}{{ /*bl 1*/ - - - - - }}{{ /*bl 2*/ {{ /*bl 2*/

- - - - - - - - - - {{ /*bl 3*/ - - - - -{{ /*bl 3*/ - - - - -

. . . = a + . . .. . . = a + . . .}} }} {{ /*bl 4*/ - - - - - }}{{ /*bl 4*/ - - - - - }}

}}}}}}}}int ff ( ) {{int ff ( ) {{

{{ /*bl */ - - - - - }}{{ /*bl */ - - - - - }}}}}}

##globalescopo

ponto da

análise

•O escopo corrente é o de ##bl3•O identificador a é procurado primeiramente no escopo de ##bl3•Depois no de ##bl2, de main e de ##global•Não sendo achado, não está declarado

escopo

mainescopo

##bl1escopo

##bl2escopo

##bl3escopo

Page 65: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programação em Yacc:Programação em Yacc:

1) Inserindo o identificador ##global:1) Inserindo o identificador ##global:

ProgProg : {escopo = InsereSimb (“##global”, : {escopo = InsereSimb (“##global”, IDGLOB, NAOVAR, NULL);} DeclGlobs IDGLOB, NAOVAR, NULL);} DeclGlobs FunçõesFunções

Neste ponto, o escopo corrente é o de Neste ponto, o escopo corrente é o de ##global##global

As As variáveis globais variáveis globais e as e as funçõesfunções serão serão inseridas nesse escopoinseridas nesse escopo

Page 66: CES-41 COMPILADORES Capítulo VI Análise Semântica.

2) Entrada e saída do escopo de uma função:2) Entrada e saída do escopo de uma função:

CabeçalhoCabeçalho : Tipo ID {escopo = InsereSimb : Tipo ID {escopo = InsereSimb ($2, IDFUNC, tipocorrente, escopo);} ABPAR ($2, IDFUNC, tipocorrente, escopo);} ABPAR Listparam FPAR ;Listparam FPAR ;

Neste ponto, o Neste ponto, o escopoescopo corrente é o do nome corrente é o do nome da da funçãofunção

Os Os parâmetrosparâmetros serão inseridos nesse escopo serão inseridos nesse escopo

FunçãoFunção: Cabeçalho {proxblocoehfuncao = : Cabeçalho {proxblocoehfuncao = VERDADE} Bloco ;VERDADE} Bloco ;

Para indicar, que o Para indicar, que o blocobloco a seguir é de a seguir é de funçãofunção

Page 67: CES-41 COMPILADORES Capítulo VI Análise Semântica.

3) Entrada e saída do escopo de um bloco:3) Entrada e saída do escopo de um bloco:

Criação do Criação do tid = IDBLOCtid = IDBLOC

#define IDGLOB#define IDGLOB 11#define IDVAR#define IDVAR 22#define IDFUNC#define IDFUNC 33#define IDPROC#define IDPROC 44#define IDPROG#define IDPROG 55#define IDBLOC#define IDBLOC 66

Função para gerar o nome de um novo bloco: Função para gerar o nome de um novo bloco: NovoBlocoNovoBloco

Retorna um Retorna um ponteiroponteiro para uma para uma cadeia de cadeia de caracterescaracteres

Page 68: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Chamadas do não-terminal Chamadas do não-terminal BlocoBloco

ComandoComando : CmdAtrib | CmdSe | - - - : CmdAtrib | CmdSe | - - - - - - - - | - - - - - | BlocoBloco | CmdComposto | CmdComposto

FunçãoFunção : Cabeçalho : Cabeçalho BlocoBloco

Page 69: CES-41 COMPILADORES Capítulo VI Análise Semântica.

BlocoBloco : ABBLOC : ABBLOC { { if (! proxblocoehfuncao) if (! proxblocoehfuncao) escopo = InsereSimb (NovoBloco (), IDBLOC, escopo = InsereSimb (NovoBloco (), IDBLOC, NAOVAR, escopo);NAOVAR, escopo); }} DeclLocs DeclLocs {proxblocoehfuncao = FALSO;}{proxblocoehfuncao = FALSO;} Comandos FBLOC Comandos FBLOC {escopo = escopo-{escopo = escopo->escopo;}>escopo;};;

Só cria Só cria nomenome para para blocobloco e entra em seu e entra em seu escopoescopo, , se o bloco não for o se o bloco não for o corpo de uma funçãocorpo de uma função

Prepara para receber Prepara para receber blocos embutidosblocos embutidos no bloco no bloco correntecorrente

SaindoSaindo de um bloco, o de um bloco, o escopoescopo corrente é o do corrente é o do paipai

Page 70: CES-41 COMPILADORES Capítulo VI Análise Semântica.

4) Teste de declaração de identificadores 4) Teste de declaração de identificadores usadosusados

Variável Variável : ID {: ID {escaux = escopo;escaux = escopo;simb = ProcuraSimb ($1, escaux);simb = ProcuraSimb ($1, escaux);while (escaux && !simb) {while (escaux && !simb) {

escaux = escaux->escopoescaux = escaux->escopoif (escaux)if (escaux) simb = ProcuraSimb ($1, escaux);simb = ProcuraSimb ($1, escaux);

}}if (! simb) NaoDeclarado ($1);if (! simb) NaoDeclarado ($1);else if (simb->tid != IDVAR)else if (simb->tid != IDVAR)

TipoInadequado ($1);TipoInadequado ($1);} Subscritos} Subscritos;;

##globalescopo

mainescopo

##bl1escopo

##bl2escopo

##bl3escopo

escopo

Page 71: CES-41 COMPILADORES Capítulo VI Análise Semântica.

5) Teste de dupla declaração de 5) Teste de dupla declaração de identificadoresidentificadores

Basta verificar se o Basta verificar se o identificadoridentificador recém- recém-declarado já está na declarado já está na tabela de símbolostabela de símbolos, no , no escopo correnteescopo corrente

ElemDeclElemDecl : ID {: ID {if (ProcuraSimb ($1, escopo))if (ProcuraSimb ($1, escopo))

DuplaDeclaracao ($1);DuplaDeclaracao ($1); }};;

Page 72: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.3.3 – Variável de controle de comandos 6.3.3 – Variável de controle de comandos for:for:

Produção:Produção:

CmdFor:CmdFor: forfor ABPARABPAR Variavel Variavel ATRIBATRIB Expressao Expressao PVIRGPVIRG Expressao Expressao PVIRG PVIRG Variavel Variavel ATRIBATRIB Expressao Expressao FPARFPAR Comando Comando

O tipo da primeira O tipo da primeira VariavelVariavel e da primeira e e da primeira e terceira terceira ExpressaoExpressao deve ser escalar inteiro ou deve ser escalar inteiro ou caracterecaractere

O tipo da segunda O tipo da segunda Expressão Expressão deve ser lógicodeve ser lógico

A segunda A segunda Variavel Variavel deve ser igual à primeiradeve ser igual à primeira

Page 73: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Produções simplificadas para o comando Produções simplificadas para o comando forfor em Pascal:em Pascal:

CmdForCmdFor : : forfor CmdAtrib CmdAtrib toto Expressao Expressao dodo ComandoComando

CmdAtrib CmdAtrib : : IDID == Expressao Expressao Funcionamento desse comando em termos de comandos while

A variável i é chamada de variável de controle do for

Page 74: CES-41 COMPILADORES Capítulo VI Análise Semântica.

CmdForCmdFor : : forfor CmdAtrib CmdAtrib toto Expressao Expressao dodo Comando Comando CmdAtrib CmdAtrib : ID : ID == Expressao Expressao

Testes semânticos cabíveis:Testes semânticos cabíveis:

1.1.A variável de controleA variável de controle deve ser escalar do tipo deve ser escalar do tipo inteiro ou caractere (testes semelhantes já foram inteiro ou caractere (testes semelhantes já foram apresentados)apresentados)

2.2.As expressões dessas produções devem ser do tipo As expressões dessas produções devem ser do tipo inteiro ou caractere (testes semelhantes já foram inteiro ou caractere (testes semelhantes já foram apresentados)apresentados)

3.3.A variável de controle não pode ser global (verificar A variável de controle não pode ser global (verificar escopo) escopo)

4.4.A variável de controle não pode ser alterada no A variável de controle não pode ser alterada no escopo desse comando escopo desse comando (ver programa a seguir)(ver programa a seguir)

Page 75: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo de programa com variável de Exemplo de programa com variável de controle global:controle global:

/* Declaracoes globais *//* Declaracoes globais */int i;int i;

funcoes: funcoes: void main ( ) {{void main ( ) {{

int n;int n;for i := 1 to n dofor i := 1 to n docall ff ();call ff ();- - - - -- - - - -

}}}}int ff ( ) {{int ff ( ) {{

i := - - - - -;i := - - - - -;- - - - -- - - - -

}}}}

A chamada de ff dentro do comando for altera o valor de i (variável de controle - global)

Deve-se verificar qual o escopo de i, por ela ser a variável de controle do comando for

Page 76: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Seja a seguinte gramática simplificada:Seja a seguinte gramática simplificada:

ProgProg : : CmdCompostoCmdCompostoCmdComposto: CmdComposto: {{ ListCmds ListCmds }} ListCmdsListCmds : : Comando | ListCmds Comando Comando | ListCmds ComandoComando Comando : : CmdComposto | CmdFor | CmdAtrib CmdComposto | CmdFor | CmdAtrib CmdForCmdFor : : forfor CmdAtrib CmdAtrib toto Expressao Expressao dodo Comando ComandoCmdAtrib CmdAtrib : : ID ID == Expressao ExpressaoExpressaoExpressao : : Termo | Termo Termo | Termo ++ Termo TermoTermoTermo : : ID | CTINTID | CTINT

O programa a seguir implementa o teste semântico O programa a seguir implementa o teste semântico das alterações da variável de controle do das alterações da variável de controle do forfor em seu em seu escopoescopo

Pode haver Pode haver aninhamentosaninhamentos de de forfor’s o que torna o ’s o que torna o teste mais complexoteste mais complexo

Page 77: CES-41 COMPILADORES Capítulo VI Análise Semântica.

%{%{ #include <string.h>#include <string.h>typedef struct noh noh;typedef struct noh noh;typedef noh *pilha;typedef noh *pilha;struct noh {struct noh {

char elem[30]; noh *prox;char elem[30]; noh *prox;};};pilha PFor;pilha PFor;void Empilhar (char *, pilha *);void Empilhar (char *, pilha *);void Desempilhar (pilha *);void Desempilhar (pilha *);char *Topo (pilha);char *Topo (pilha);void InicPilha (pilha *);void InicPilha (pilha *);char Vazia (pilha);char Vazia (pilha);noh *Procurar (char *, pilha);noh *Procurar (char *, pilha);%}%}

Será usada uma pilha para guardar as variáveis de controle de um aninhamento de comandos for

Page 78: CES-41 COMPILADORES Capítulo VI Análise Semântica.

%union {%union {char cadeia[50]; int valint; char carac;char cadeia[50]; int valint; char carac;

}}%type%type <cadeia><cadeia> CmdAtribCmdAtrib%token%token <cadeia><cadeia> IDID%token%token <valint><valint> CTINTCTINT%token%token ABCHAVABCHAV%token%token FCHAVFCHAV%token%token ATRIBATRIB%token%token MAISMAIS%token%token FORFOR%token%token TOTO%token%token DODO%token%token <atr><atr> INVALINVAL%%%%

CmdAtrib terá o mesmo atributo de sua variável do lado esquerdo

Page 79: CES-41 COMPILADORES Capítulo VI Análise Semântica.

ProgProg : {: {InicPilha (&PFor);InicPilha (&PFor);} CmdComposto} CmdComposto;;

CmdComposto: ABCHAV {printf ("{\n");} CmdComposto: ABCHAV {printf ("{\n");} ListCmds ListCmds

FCHAV {printf ("}\n");}FCHAV {printf ("}\n");};;

ListCmdsListCmds : Comando: Comando| ListCmds Comando| ListCmds Comando;;

Comando Comando : CmdComposto: CmdComposto| CmdFor| CmdFor| CmdAtrib {printf ("\n");}| CmdAtrib {printf ("\n");};;

No começo, a pilha é inicializada vazia

Page 80: CES-41 COMPILADORES Capítulo VI Análise Semântica.

CmdFor:CmdFor: FOR {printf ("for ");} FOR {printf ("for ");} CmdAtrib {CmdAtrib {Empilhar ($3, &PFor);Empilhar ($3, &PFor);}}TO {printf ("to ");} Expressao DO TO {printf ("to ");} Expressao DO

{printf ("do\n");}{printf ("do\n");}Comando {Comando {Desempilhar (&PFor);Desempilhar (&PFor);}}

;;

Processado CmdAtrib, seu atributo, ou seja, a variável de controle é empilhada

Encerrado o processamento de CmdFor, a variável de controle é desempilhada

Page 81: CES-41 COMPILADORES Capítulo VI Análise Semântica.

CmdAtrib CmdAtrib : ID {: ID {printf ("%s ", $1);printf ("%s ", $1);if (if (Procurar ($1, PFor)Procurar ($1, PFor)))

printf (printf ( "** Alteracao em variavel de controle de "** Alteracao em variavel de controle de

for: %s ** ", $1);for: %s ** ", $1);} ATRIB {printf ("= ");} Expressao {} ATRIB {printf ("= ");} Expressao {strcpy ($$, strcpy ($$, $1);$1);}}

;;

A variável do lado esquerdo de CmdAtrib é procurada na pilha

Caso seja encontrada: erro

O atributo de ID é copiado no atributo de CmdAtrib

Page 82: CES-41 COMPILADORES Capítulo VI Análise Semântica.

ExpressaoExpressao :: Termo Termo|| Termo MAIS {printf ("+ ");} Termo MAIS {printf ("+ ");}

TermoTermoTermoTermo : : ID {printf ("%s ", $1);}ID {printf ("%s ", $1);}

| | CTINT {printf ("%d ", $1);}CTINT {printf ("%d ", $1);};;

%%%%#include "lex.yy.c"#include "lex.yy.c"

Definições das funções para manipular a pilha de variáveis de controle

Page 83: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: seja um arquivo de entrada com o seja um arquivo de entrada com o seguinte programa:seguinte programa:

{{i = 1i = 1for j = 2 to 10 do {for j = 2 to 10 do {

k = 2 + 3 b = e+wwk = 2 + 3 b = e+wwfor i = d+f to h+22 dofor i = d+f to h+22 do

j = 5j = 5v = 3v = 3for k = 32+i to n+2 do {for k = 32+i to n+2 do {

i = 3 i = 4+bi = 3 i = 4+bfor k = 3 to 20 do {for k = 3 to 20 do {

j = 3 k = i+wj = 3 k = i+w}}

}}}}

}}

Page 84: CES-41 COMPILADORES Capítulo VI Análise Semântica.

{{i = 1i = 1for j = 2 to 10 dofor j = 2 to 10 do{{k = 2 + 3k = 2 + 3b = e + wwb = e + wwfor i = d + f to h + 22 dofor i = d + f to h + 22 doj j ** Alteracao em variavel de controle de for: j **** Alteracao em variavel de controle de for: j ** = 5 = 5v = 3v = 3for k = 32 + i to n + 2 dofor k = 32 + i to n + 2 do{{i = 3i = 3i = 4 + bi = 4 + bfor k for k ** Alteracao em variavel de controle de for: k **** Alteracao em variavel de controle de for: k ** = 3 to 20 do = 3 to 20 do{{j j ** Alteracao em variavel de controle de for: j **** Alteracao em variavel de controle de for: j ** = 3 = 3k k ** Alteracao em variavel de controle de for: k **** Alteracao em variavel de controle de for: k ** = i + w = i + w}}}}}}}}

Saída

Page 85: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Observações:Observações:

As variáveis de um comando As variáveis de um comando readread também também devem ser procuradas na devem ser procuradas na pilhapilha de variáveis de de variáveis de controlecontrole

Linguagens com Linguagens com aninhamentosaninhamentos de blocos e/ou de blocos e/ou de funções podem tornar o teste mais de funções podem tornar o teste mais complexo (o corpo do complexo (o corpo do for for pode ser um pode ser um blocobloco))

A pilha do A pilha do forfor pode exigir o escopo da pode exigir o escopo da declaração da variável de controledeclaração da variável de controle

Page 86: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.3.4 – Unicidade dos rótulos de um 6.3.4 – Unicidade dos rótulos de um comando de seleçãocomando de seleção

Exemplo de um comando de seleção (Exemplo de um comando de seleção (Pascal-Pascal-likelike):):

case ( expr ) {case ( expr ) {ct1, ct2, ct3: Cmd1ct1, ct2, ct3: Cmd1ct4, ct5: Cmd2ct4, ct5: Cmd2ct6, ct7, ct8: Cmd3ct6, ct7, ct8: Cmd3ct9: Cmd4ct9: Cmd4default: Cmd5default: Cmd5

}}

Entre as constantes Entre as constantes inteiras inteiras ct1, ct2, ct1, ct2, ct3, ct4, ct5, ct6, ct3, ct4, ct5, ct6, ct7, ct8 e ct9 ct7, ct8 e ct9 não não deve haver deve haver repetiçõesrepetições

Page 87: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Possíveis produções para um comando de Possíveis produções para um comando de seleção:seleção:

CmdCase CmdCase CASE ABPAR ExprArit FPAR ABCHAV CASE ABPAR ExprArit FPAR ABCHAV ListCase FCHAVListCase FCHAV

ListCase ListCase ListCaseSimpl AlterDefault ListCaseSimpl AlterDefaultListCaseSimpl ListCaseSimpl ListAlterCase DPONTS Comando ListAlterCase DPONTS Comando

| ListCaseSimpl ListAlterCase DPONTS Comando| ListCaseSimpl ListAlterCase DPONTS ComandoListAlterCase ListAlterCase AlterCase AlterCase

| ListAlterCase VIRG AlterCase | ListAlterCase VIRG AlterCase AlterCase AlterCase CTINT | CTCHAR CTINT | CTCHARAlterDefault AlterDefault | DEFAULT DPONTS Comando | DEFAULT DPONTS Comando

case ( expr ) {case ( expr ) {ct1, ct2, ct3: ct1, ct2, ct3:

Cmd1Cmd1ct4, ct5: ct4, ct5:

Cmd2Cmd2ct6, ct7, ct8: ct6, ct7, ct8:

Cmd3Cmd3ct9: Cmd4ct9: Cmd4default: default:

Cmd5Cmd5}}

Idéia: usar listas de rótulos como atributos de alguns desses não-terminais

Page 88: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo:Exemplo:

case (Expressao) { 1, 2, 3: Comando 4, 5: Comando 6: Comando}

Em algumas reduções, concatena-se listas de rótulos

Em outras, inaugura-se uma lista dessas

Page 89: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Acrescenta-se o atributo Acrescenta-se o atributo listrotcaselistrotcase na na %union%union

Acrescenta-se a seguinte declaração Acrescenta-se a seguinte declaração %type%type::

%type <listrotcase> ListCase ListCaseSimpl ListAlterCase AlterCase

Nas produções do não-terminal Nas produções do não-terminal AlterCaseAlterCase::

AlterCaseAlterCase :: CTINT { $$ = InicListCase CTINT { $$ = InicListCase ($1)}($1)}|| CTCHAR { $$ = InicListCase ($1)}CTCHAR { $$ = InicListCase ($1)};;

O não terminal O não terminal AlterCaseAlterCase terá sempre uma lista terá sempre uma lista contendo contendo um rótuloum rótulo

Page 90: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Nas produções do não-terminal Nas produções do não-terminal ListAlterCaseListAlterCase::

ListAlterCaseListAlterCase :: AlterCaseAlterCase|| ListAlterCase VIRG AlterCaseListAlterCase VIRG AlterCase{$$ = ConcatListCase ($1, $3);}{$$ = ConcatListCase ($1, $3);};;

Na primeira produção, a ação Na primeira produção, a ação default default é é {$$ = {$$ = $1}$1}; a ; a listalista do não-terminal do não-terminal AlterCaseAlterCase será será passada para o passada para o não-terminal da esquerdanão-terminal da esquerda

Na segunda produção, as Na segunda produção, as listaslistas dos não-terminais dos não-terminais ListAlterCase ListAlterCase e e AlterCaseAlterCase serão serão concatenadasconcatenadas e passadas para o e passadas para o não terminal da esquerdanão terminal da esquerda

Page 91: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Nas produções do não-terminal Nas produções do não-terminal ListCaseSimplListCaseSimpl ::

ListCaseSimpl : ListAlterCase DPONTS ListCaseSimpl : ListAlterCase DPONTS ComandoComando| ListCaseSimpl ListAlterCase DPONTS| ListCaseSimpl ListAlterCase DPONTS Comando {$$ = ConcatListCase ($1, $2);}Comando {$$ = ConcatListCase ($1, $2);} ;

Na primeira produção, a ação Na primeira produção, a ação default default é é {$$ = $1}{$$ = $1}; ; a a listalista do não-terminal do não-terminal ListAlterCaseListAlterCase será passada será passada para o para o não-terminal da esquerdanão-terminal da esquerda..

Na segunda produção, as Na segunda produção, as listaslistas dos não-terminais dos não-terminais ListCaseSimpl ListCaseSimpl e e ListAlterCase ListAlterCase serão serão concatenadasconcatenadas e passadas para o e passadas para o não-terminal da não-terminal da esquerdaesquerda

Page 92: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Na produção do não terminal Na produção do não terminal ListCaseListCase::

ListCaseListCase : ListCaseSimpl AlterDefault: ListCaseSimpl AlterDefault

A ação A ação default default é é {$$ = $1}{$$ = $1}; a ; a listalista do não- do não-terminal terminal ListCaseSimplListCaseSimpl será passada para o será passada para o não-terminal da esquerdanão-terminal da esquerda

Na produção do não-terminal Na produção do não-terminal CmdCaseCmdCase::

CmdCaseCmdCase : CASE ABPAR ExprArit : CASE ABPAR ExprArit FPAR ABCHAV FPAR ABCHAV ListCase FCHAV ListCase FCHAV { ChecUnicRotCase ($6); }{ ChecUnicRotCase ($6); }

;;

A A listalista do não-terminal do não-terminal ListCaseListCase será examinada será examinada para verificar se possui algum para verificar se possui algum rótulo repetidorótulo repetido

Page 93: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.3.5 – Testes semânticos relacionados 6.3.5 – Testes semânticos relacionados com ponteiroscom ponteiros

1) Produção para a declaração de ponteiros:

ElemDecl : ID Dimens | @ ID

O caractere ‘@’ declara que ID é um ponteiro

Aqui usa-se @ ID no lugar de * ID para evitar duplicidade de uso do caractere ‘*’

Page 94: CES-41 COMPILADORES Capítulo VI Análise Semântica.

2) Produções para referências a ponteiros:

FatorFator : Variavel | CTINT | CTREAL | : Variavel | CTINT | CTREAL | CTCHAR CTCHAR | TRUE | FALSE | ~ Fator | TRUE | FALSE | ~ Fator | ( Expressao ) | CallFunc | | ( Expressao ) | CallFunc | # Variavel# Variavel

CmdAtribCmdAtrib : LadoEsquerdo := Expressao ;: LadoEsquerdo := Expressao ;| LadoEsquerdo := & Variavel ;| LadoEsquerdo := & Variavel ;

LadoEsquerdo: Variavel | # VariavelLadoEsquerdo: Variavel | # Variavel

# Variavel significa “local apontado por Varíavel”

& Variavel significa “endereço de Variavel”

Page 95: CES-41 COMPILADORES Capítulo VI Análise Semântica.

3) Novos tokens

%token%token DECLPTRDECLPTR /* ‘@’ – declaração de /* ‘@’ – declaração de ponteiro */ponteiro */

%token%token LOCAPONT /* ‘#’ – local apontado LOCAPONT /* ‘#’ – local apontado por */por */

%token%token ENDERENDER /* ‘&’ – endereço de /* ‘&’ – endereço de variável */variável */

4) Definições de novos tipos de expressões e 4) Definições de novos tipos de expressões e variáveisvariáveis#define NAOVAR#define NAOVAR00#define INTEIRO#define INTEIRO11#define LOGICO#define LOGICO22#define REAL#define REAL

33#define CARACTERE#define CARACTERE44

#define PTRINT#define PTRINT55

#define PTRLOG#define PTRLOG66

#define PTRREAL#define PTRREAL77

#define PTRCARAC#define PTRCARAC88

Page 96: CES-41 COMPILADORES Capítulo VI Análise Semântica.

5) Novo campo na tabela de símbolos:

O flag O flag ehpontehpont que sinaliza se uma variável é que sinaliza se uma variável é ou não um ou não um ponteiroponteiro

6) Tabela de compatibilidade para os 6) Tabela de compatibilidade para os operadores de ponteiros:operadores de ponteiros:

Operador

Operandos admitidos

# Variável ponteiro& Qualquer variável

Page 97: CES-41 COMPILADORES Capítulo VI Análise Semântica.

7) Declaração de variáveis ponteiros:

ElemDecl : DECLPTR ID {if (ProcuraSimb ($2) != NULL)if (ProcuraSimb ($2) != NULL)DeclaracaoRepetida ($2);DeclaracaoRepetida ($2);else {else {switch (tipocorrente) {switch (tipocorrente) {case INTEIRO: tipoprt = PTRINT;case INTEIRO: tipoprt = PTRINT;case REAL: tipoprt = PTRREAL;case REAL: tipoprt = PTRREAL;case LOGICO: tipoprt = PTRLOG;case LOGICO: tipoprt = PTRLOG;case CARACTERE: tipoprt = PTRCARAC;case CARACTERE: tipoprt = PTRCARAC;}}InsereSimb ($2, IDVAR, tipoptr);InsereSimb ($2, IDVAR, tipoptr);}}}}

;

Page 98: CES-41 COMPILADORES Capítulo VI Análise Semântica.

8) Compatibilidade em expressões:

FatorFator : LOCAPONT Variavel {: LOCAPONT Variavel {if ($2)if ($2)if (!$2->ehpont)if (!$2->ehpont)Esperado ("Variavel ponteiro");Esperado ("Variavel ponteiro");else switch ($2->tvar) {else switch ($2->tvar) {case PTRINT: $$ = INTEIRO; break;case PTRINT: $$ = INTEIRO; break;case PTRLOG: $$ = LOGICO; break;case PTRLOG: $$ = LOGICO; break;case PTRREAL: $$ = REAL; break;case PTRREAL: $$ = REAL; break;case PTRCARAC: $$ = CARACTERE; break;case PTRCARAC: $$ = CARACTERE; break;}}

}};;

Page 99: CES-41 COMPILADORES Capítulo VI Análise Semântica.

9) Compatibilidade em comandos de atribuição:

Tabela de compatibilidade:Tabela de compatibilidade:

Tipo do lado esquerdo

Tipo admitido do lado direito

Inteiro Inteiro ou CaractereReal Inteiro, Real ou

CaractereCaractere Inteiro ou Caractere

Lógico LógicoPonteiro Ponteiro de mesmo

tipo

Page 100: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Teste de compatibilidade: Teste de compatibilidade: nas produções:nas produções:

CmdAtribCmdAtrib :: LadoEsquerdo := Expressao LadoEsquerdo := Expressao ; ;

|| LadoEsquerdo := & LadoEsquerdo := & Variavel ;Variavel ;

LadoEsquerdo:LadoEsquerdo: Variavel | # VariavelVariavel | # Variavel

Atributo do não-terminal Atributo do não-terminal LadoEsquerdo:LadoEsquerdo:

%type%type <tipoexpr><tipoexpr> LadoEsquerdoLadoEsquerdo

A seguir a programação em A seguir a programação em YaccYacc

Page 101: CES-41 COMPILADORES Capítulo VI Análise Semântica.

LadoEsquerdoLadoEsquerdo :: Variavel Variavel { if ($1) { if ($1) $$ = $1->tvar; }$$ = $1->tvar; }

|| LOCAPONT Variavel {LOCAPONT Variavel {if ($2)if ($2)if (!$2->ehpont)if (!$2->ehpont)Esperado ("Variavel ponteiro");Esperado ("Variavel ponteiro");else switch ($2->tvar) {else switch ($2->tvar) {case PTRINT: $$ = INTEIRO; break;case PTRINT: $$ = INTEIRO; break;case PTRLOG: $$ = LOGICO; break;case PTRLOG: $$ = LOGICO; break;case PTRREAL: $$ = REAL; break;case PTRREAL: $$ = REAL; break;case PTRCARAC: $$ = CARACTERE; break;case PTRCARAC: $$ = CARACTERE; break;} }

}};;

Cálculo do atributo de LadoEsquerdo

Page 102: CES-41 COMPILADORES Capítulo VI Análise Semântica.

CmdAtrib : LadoEsquerdo ATRIB Expressao PVIRG CmdAtrib : LadoEsquerdo ATRIB Expressao PVIRG {{

switch ($1) {switch ($1) {case INTEIRO: case CARACTERE:case INTEIRO: case CARACTERE:if ($3 != INTEIRO && $3 != CARACTERE)if ($3 != INTEIRO && $3 != CARACTERE)IncompatibilidadeIncompatibilidade("Tipos incompativeis numa atribuicao"); ("Tipos incompativeis numa atribuicao"); break;break;case REAL:case REAL:if ($3 != INTEIRO && $3 != CARACTERE && $3 != REAL)if ($3 != INTEIRO && $3 != CARACTERE && $3 != REAL)IncompatibilidadeIncompatibilidade("Tipos incompativeis numa atribuicao"); ("Tipos incompativeis numa atribuicao"); break;break;case LOGICO:case LOGICO:if ($3 != LOGICO)if ($3 != LOGICO)IncompatibilidadeIncompatibilidade("Tipos incompativeis numa atribuicao"); ("Tipos incompativeis numa atribuicao"); break;break;default:default:if ($1 != $3)if ($1 != $3)Incompatibilidade Incompatibilidade ("Tipos incompativeis numa atribuicao");("Tipos incompativeis numa atribuicao");}}

}};;

Page 103: CES-41 COMPILADORES Capítulo VI Análise Semântica.

CmdAtrib : LadoEsquerdo ATRIB ENDER Variavel CmdAtrib : LadoEsquerdo ATRIB ENDER Variavel PVIRG PVIRG

{{switch ($1) {switch ($1) {case INTEIRO: case CARACTERE: case INTEIRO: case CARACTERE: case REAL: case LOGICO :case REAL: case LOGICO :Incompatibilidade Incompatibilidade ("Tipos incompativeis numa atribuicao"); break;("Tipos incompativeis numa atribuicao"); break;default:default:if ($1 == PTRINT && $4 != INTEIRO ||if ($1 == PTRINT && $4 != INTEIRO || $1 == PTRREAL && $4 != REAL ||$1 == PTRREAL && $4 != REAL || $1 == PTRLOGIC && $4 != LOGICO ||$1 == PTRLOGIC && $4 != LOGICO || $1 == PTRCARAC && $4 != CARACTERE)$1 == PTRCARAC && $4 != CARACTERE)Incompatibilidade Incompatibilidade ("Tipos incompativeis numa atribuicao");("Tipos incompativeis numa atribuicao");}}

}};;

Page 104: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.3.6 – Comentários sobre o poder dos 6.3.6 – Comentários sobre o poder dos atributosatributos

Como já foi visto, Como já foi visto, YaccYacc possibilita que os possibilita que os terminais e os não-terminais da gramática terminais e os não-terminais da gramática carreguem consigo carreguem consigo atributos compostosatributos compostos

Isso dá um Isso dá um poderpoder muito grande aos seus muito grande aos seus programasprogramas

Na Na reduçãoredução de uma produção, os de uma produção, os campos do campos do atributoatributo no não-terminal à no não-terminal à esquerda esquerda podem podem ser calculados em função daqueles dos ser calculados em função daqueles dos símbolos da direitasímbolos da direita

Page 105: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Esses Esses atributosatributos calculados são usados para o calculados são usados para o cálculo de cálculo de outros atributosoutros atributos, em outras , em outras reduçõesreduções

É um cálculo É um cálculo bottom-upbottom-up dos atributos dos dos atributos dos elementos da elementos da árvore sintáticaárvore sintática do programa do programa analisadoanalisado

Como escolher Como escolher quais camposquais campos terá o terá o atributoatributo de um não-terminal?de um não-terminal?

Depende do Depende do papelpapel desse não-terminal no desse não-terminal no processo de compilaçãoprocesso de compilação

Page 106: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Por exemplo, um não-terminal envolvido na Por exemplo, um não-terminal envolvido na formação de expressõesformação de expressões é usado: é usado:

Em testes de Em testes de compatibilidade de tiposcompatibilidade de tipos entre operadores e operandosentre operadores e operandos

Para determinar os Para determinar os operandos das operandos das quádruplasquádruplas com operadores aritméticos, com operadores aritméticos, relacionais e lógicos, na geração do código relacionais e lógicos, na geração do código intermediáriointermediário

Para guardar valores intermediários no Para guardar valores intermediários no cálculo de expressõescálculo de expressões

Page 107: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Portanto é útil que seu Portanto é útil que seu atributoatributo tenha tenha camposcampos para guardar:para guardar:

O O tipo do operandotipo do operando que ele representa numa que ele representa numa operaçãooperação aritmética ou lógica (inteiro, real, aritmética ou lógica (inteiro, real, caractere, lógico, etc.)caractere, lógico, etc.)

O O tipo do operandotipo do operando ou resultado (variável, ou resultado (variável, constante, etc.) da constante, etc.) da quádruplaquádrupla gerada para a gerada para a tradução da tradução da operaçãooperação aritmética ou lógica em aritmética ou lógica em que está envolvidoque está envolvido

Mais Mais informaçõesinformações sobre os sobre os operandos das operandos das quádruplasquádruplas (nome de variável, valor de (nome de variável, valor de constante, etc.);constante, etc.);

Valores intermediáriosValores intermediários usados no cálculo de usados no cálculo de uma uma expressãoexpressão aritmética ou lógica, etc. aritmética ou lógica, etc.

Page 108: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Outros não terminaisOutros não terminais podem ter campos dos mais podem ter campos dos mais variadosvariados tipos e complexidade: tipos e complexidade:

Lista de Lista de rótulosrótulos de comandos de comandos casecase

Lista de Lista de tipos dos argumentostipos dos argumentos de chamada de chamada de funçõesde funções

Número de Número de argumentosargumentos, número de , número de índicesíndices de elementos de variáveis indexadas, etcde elementos de variáveis indexadas, etc..

Esses campos vão Esses campos vão aparecendoaparecendo no projeto do no projeto do compilador, conforme sua compilador, conforme sua necessidadenecessidade::

Ao implementar determinados Ao implementar determinados testes testes semânticossemânticos

Ao implementar a geração de Ao implementar a geração de quádruplasquádruplas, etc., etc.

Page 109: CES-41 COMPILADORES Capítulo VI Análise Semântica.

AtributosAtributos podem ser dados às podem ser dados às açõesações no meio no meio das produçõesdas produções

Foi visto que em Foi visto que em YaccYacc, , açõesações no meio das no meio das produções geram produções geram produções vazias de não produções vazias de não terminais fictíciosterminais fictícios, que passam a ter tais , que passam a ter tais ações no finalações no final

Com esses atributos de ações, consegue-se Com esses atributos de ações, consegue-se transmitir transmitir informações de uma ação para informações de uma ação para outraoutra, numa mesma produção, numa mesma produção

Page 110: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.3.7 – Testes relativos à sub-6.3.7 – Testes relativos à sub-programaçãoprogramação

a) Abrangência da abordagema) Abrangência da abordagem

Aqui serão vistos testes de Aqui serão vistos testes de compatibilidadecompatibilidade entre:entre:

ArgumentosArgumentos de chamadas das funções e de chamadas das funções e seus respectivos seus respectivos parâmetrosparâmetros

Tipo das Tipo das expressões retornadasexpressões retornadas por uma por uma função e função e tipo declaradotipo declarado da própria função da própria função

Page 111: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Para ilustrar esta Para ilustrar esta Seção 6.3.7Seção 6.3.7 adotar-se-á o adotar-se-á o modelo da modelo da Linguagem CLinguagem C, no tocante à , no tocante à passagem de parâmetrospassagem de parâmetros

Então só será abordada a Então só será abordada a passagempassagem de de parâmetros por parâmetros por valorvalor

A A passagem por referênciapassagem por referência será simulada pelo será simulada pelo uso de uso de ponteirosponteiros e pelo e pelo operador &operador & que que manipula o endereço de variáveismanipula o endereço de variáveis

Para evitar ambiguidades, o operador Para evitar ambiguidades, o operador ANDAND será será representado por representado por “&&”“&&”

Para Para simplificarsimplificar, supõe-se que a linguagem não , supõe-se que a linguagem não trabalhe com trabalhe com blocosblocos

Page 112: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Os testes aqui estudados, relacionados com a Os testes aqui estudados, relacionados com a compatibilidadecompatibilidade entre os entre os argumentos de argumentos de chamadachamada e os e os parâmetrosparâmetros de uma função, de uma função, são os seguintes:são os seguintes:

O O número de argumentosnúmero de argumentos de chamada de chamada deve ser igual ao deve ser igual ao número de parâmetrosnúmero de parâmetros

Os Os tipos dos argumentostipos dos argumentos de chamada de chamada devem ser compatíveis com os devem ser compatíveis com os tipos dos tipos dos parâmetrosparâmetros

Page 113: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Tabela de compatibilidade adotada nesta Tabela de compatibilidade adotada nesta abordagem:abordagem:

** Se o parâmetro for um ** Se o parâmetro for um vetorvetor, o argumento pode , o argumento pode ser uma ser uma linhalinha de uma de uma matriz bi-dimensionalmatriz bi-dimensional, , desde que seus elementos sejam de desde que seus elementos sejam de mesmo tipomesmo tipo e em e em mesmo númeromesmo número dos elementos do dos elementos do parâmetroparâmetro

Page 114: CES-41 COMPILADORES Capítulo VI Análise Semântica.

b) Preparo da tabela de símbolosb) Preparo da tabela de símbolos

É útil cada É útil cada identificador de funçãoidentificador de função conter em conter em sua célula na tabela de símbolos: sua célula na tabela de símbolos:

Um campo com o Um campo com o númeronúmero de seus de seus parâmetrosparâmetros; seja ; seja nparamnparam o nome desse o nome desse campocampo

Um campo com a lista de células de seus parâmetros; seja ListParam o nome dessa lista

Page 115: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo:Exemplo:

Seja o trechoSeja o trechode programa:de programa:

// Escopo global// Escopo globalfloat x; . . .float x; . . .int ff (int b, . . .) {int ff (int b, . . .) {

int a, . . .int a, . . .. . . . .. . . . .

}}

##global

IDGLOB

tidListVarDec

lListFu

nc

escopo

# - - - -

- - - - #

x IDVAR FALSO

REALtid para

mtvar

escopo

b IDVAR VERD INTtid para

mtvar

escopo

a IDVAR FALSO

INTtid para

mtvar

escopo

# - - - -

ff IDFUNC

tidListVarDec

l

ListPara

m

escopoINT 1+..

.

tvar nparam

# - - - -

Page 116: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programação no não-terminal Prog:Programação no não-terminal Prog: ProgProg : {: {

InicTabSimb (); InicTabSimb (); declparam = FALSO;declparam = FALSO;

} } DeclGlobais FuncoesDeclGlobais Funcoes;;

Indicando que parâmetros não estão sendo declarados

Page 117: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programação no não-terminal Prog:Programação no não-terminal Prog: ProgProg : {: {

InicTabSimb (); declparam = FALSO;InicTabSimb (); declparam = FALSO;escopo = simb = escopo = simb =

InsereSimb ("global##", IDGLOB, NAOVAR, InsereSimb ("global##", IDGLOB, NAOVAR, NULL);NULL);

} } DeclGlobais FuncoesDeclGlobais Funcoes;; ##glob

alIDGLOB

tidListVarDec

lListFu

nc

escopo

##

escopo

simb

InsereSimb aloca o nó-líder de ListVarDecl e ListFunc

Page 118: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programação no não-terminal Prog:Programação no não-terminal Prog: ProgProg : {: {

InicTabSimb (); declparam = FALSO;InicTabSimb (); declparam = FALSO;escopo = simb = escopo = simb =

InsereSimb ("global##", IDGLOB, NAOVAR, InsereSimb ("global##", IDGLOB, NAOVAR, NULL);NULL);pontvardecl = simb->listvardecl;pontvardecl = simb->listvardecl;pontfunc = simb->listfunc;pontfunc = simb->listfunc;

} } DeclGlobais FuncoesDeclGlobais Funcoes;; ##glob

alIDGLOB

tidListVarDec

lListFu

nc

escopo

##pontvard

ecl

escopo

pontfunc

simb

Prepara para inserir a primeira variável global e a primeira função nas listas do escopo global

Page 119: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programação no não-terminal Cabecalho:Programação no não-terminal Cabecalho: CabeçalhoCabeçalho : Tipo ID {: Tipo ID {

escopo = simb = escopo = simb = InsereSimb ($2, IDFUNC, tipocorrente, InsereSimb ($2, IDFUNC, tipocorrente,

escopo);escopo);

}} ABPAR {declparam = VERDADE;} Listparam ABPAR {declparam = VERDADE;} Listparam FPARFPAR

;;

pontfunc

##global

IDGLOB

tidListVarDec

lListFu

nc

escopo

##

#

ff IDFUNC

tidListVarDec

l

ListPara

m

escopo

#

INTtvar npara

m

pontfunc

simb

escopopontvard

ecl simb

escopo

Page 120: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programação no não-terminal Cabecalho: Programação no não-terminal Cabecalho: CabeçalhoCabeçalho : Tipo ID {: Tipo ID {

escopo = simb = escopo = simb = InsereSimb ($2, IDFUNC, tipocorrente, InsereSimb ($2, IDFUNC, tipocorrente,

escopo);escopo);pontvardecl = simb->listvardecl;pontvardecl = simb->listvardecl;pontparam = simb->listparam;pontparam = simb->listparam;

}} ABPAR {declparam = VERDADE;} Listparam ABPAR {declparam = VERDADE;} Listparam FPARFPAR

;; ##global

IDGLOB

tidListVarDec

lListFu

nc

escopo

##

#

ff IDFUNC

tidListVarDec

l

ListPara

m

escopo

#

INTtvar npara

m

pontfunc

pontvardecl

simb

escopo

pontparam

Prepara para inserir a primeira variável local e o primeiro parâmetro nas listas do escopo da função

pontvardecl

Page 121: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programação no não-terminal Cabecalho: Programação no não-terminal Cabecalho: CabeçalhoCabeçalho : Tipo ID {: Tipo ID {

escopo = simb = escopo = simb = InsereSimb ($2, IDFUNC, tipocorrente, InsereSimb ($2, IDFUNC, tipocorrente,

escopo);escopo);pontvardecl = simb->listvardecl;pontvardecl = simb->listvardecl;pontparam = simb->listparam;pontparam = simb->listparam;

}} ABPAR ABPAR {declparam = VERDADE;}{declparam = VERDADE;} Listparam Listparam FPAR FPAR {declparam = FALSO;}{declparam = FALSO;}

;;

Indicando que parâmetros não mais estão sendo declarados

Indicando que parâmetros começam a ser declarados

Page 122: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Nova função InsereSimb:Nova função InsereSimb:

simbolo InsereSimbsimbolo InsereSimb (char *cadeia, int tid, int tvar, (char *cadeia, int tid, int tvar, simbolo escoposimbolo escopo) {) {int i; simbolo aux, s;int i; simbolo aux, s;

/*/* Codigo comum a todos os identificadores */Codigo comum a todos os identificadores */

i = hash (cadeia);i = hash (cadeia); aux = tabsimb[i];aux = tabsimb[i];s = tabsimb[i] = malloc (sizeof (celsimb));s = tabsimb[i] = malloc (sizeof (celsimb));s->cadeia = malloc ((strlen(cadeia)+1)* s->cadeia = malloc ((strlen(cadeia)+1)* sizeof(char));sizeof(char));strcpy (s->cadeia, cadeia);strcpy (s->cadeia, cadeia);s->prox = aux; s->prox = aux; s->tid = tid;s->tid = tid; s->tvar = tvar; s->tvar = tvar;s->escopo = escopo;s->escopo = escopo;

Page 123: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/*/* Codigo para parametros e variáveis globais e locais Codigo para parametros e variáveis globais e locais */ */

if (declparam)if (declparam) {{s->inic = s->ref = s->param = VERDADE;s->inic = s->ref = s->param = VERDADE;

}}else {else {s->inic = s->ref = s->param = FALSO;s->inic = s->ref = s->param = FALSO;

}}

O identificador inserido é um parâmetroTodo parâmetro é considerado referenciado e inicializado

Page 124: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/*/* Codigo para parametros e variáveis globais e locais Codigo para parametros e variáveis globais e locais */ */

if (declparam)if (declparam) {{s->inic = s->ref = s->param = VERDADE;s->inic = s->ref = s->param = VERDADE;if (s->tid == IDVAR)if (s->tid == IDVAR)InsereListSimb (s, &pontparam);InsereListSimb (s, &pontparam);s->escopo->nparam++;s->escopo->nparam++;}}else {else {s->inic = s->ref = s->param = FALSO;s->inic = s->ref = s->param = FALSO;

}}

Insere o parâmetro na lista de parâmetros de seu escopo

Acrescenta 1 ao número de parâmetros de seu escopo

Page 125: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/*/* Codigo para parametros e variáveis globais e locais Codigo para parametros e variáveis globais e locais */ */

if (declparam)if (declparam) {{s->inic = s->ref = s->param = VERDADE;s->inic = s->ref = s->param = VERDADE;if (s->tid == IDVAR)if (s->tid == IDVAR)InsereListSimb (s, &pontparam);InsereListSimb (s, &pontparam);s->escopo->nparam++;s->escopo->nparam++;}}else {else {s->inic = s->ref = s->param = FALSO;s->inic = s->ref = s->param = FALSO;if (s->tid == IDVAR)if (s->tid == IDVAR)InsereListSimb (s, &pontvardecl);InsereListSimb (s, &pontvardecl);}}

Insere uma variável na lista de variáveis globais ou locais de uma função

Page 126: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/*/* Codigo para identificador global ou nome de Codigo para identificador global ou nome de função */função */

if (tid == IDGLOB || tid == IDFUNC) {if (tid == IDGLOB || tid == IDFUNC) {s->listvardecl = (elemlistsimb *) s->listvardecl = (elemlistsimb *) malloc malloc (sizeof (elemlistsimb));(sizeof (elemlistsimb));s->listvardecl->prox = NULL;s->listvardecl->prox = NULL;}}if (tid == IDGLOB) {if (tid == IDGLOB) {s->listfunc = (elemlistsimb *) s->listfunc = (elemlistsimb *) malloc malloc (sizeof (elemlistsimb));(sizeof (elemlistsimb));s->listfunc->prox = NULL;s->listfunc->prox = NULL;}}

Insere o nó-líder da lista de variáveis globais ou locais de uma função

Insere o nó-líder da lista de funções do escopo global

Page 127: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/*/* Codigo para nome de função e retorno de Codigo para nome de função e retorno de InserirInserir */ */

if (tid == IDFUNC) {if (tid == IDFUNC) {s->listparam = (elemlistsimb *) s->listparam = (elemlistsimb *)

malloc malloc (sizeof (elemlistsimb));(sizeof (elemlistsimb));s->listparam->prox = NULL;s->listparam->prox = NULL;s->nparam = 0;s->nparam = 0;

InsereListSimb (s, &pontfunc);InsereListSimb (s, &pontfunc);}}return s;return s;

}}

Insere o nó-líder da lista de parâmetros do escopo de uma função

Inicializa com zero o número de parâmetros de uma função

Insere o nome da função na lista de funções do escopo global

Page 128: CES-41 COMPILADORES Capítulo VI Análise Semântica.

c) Teste de compatibilidade entre c) Teste de compatibilidade entre parâmetros e argumentos escalaresparâmetros e argumentos escalares

Quando os Quando os parâmetrosparâmetros e os e os argumentosargumentos envolvidos são envolvidos são escalaresescalares, os testes de , os testes de compatibilidade são mais compatibilidade são mais simplessimples

É necessário calcular o É necessário calcular o número de número de argumentosargumentos de chamada e formar uma lista de chamada e formar uma lista com os com os tipos dos argumentostipos dos argumentos

Esses, em seguida, podem ser comparados com Esses, em seguida, podem ser comparados com o o número de parâmetrosnúmero de parâmetros e com a e com a listalista dos dos mesmos já organizada na mesmos já organizada na tabela de símbolostabela de símbolos

Page 129: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: seja o seguinte códigoseja o seguinte código

int ff1 (int a, float b, logic c)int ff1 (int a, float b, logic c){ - - - - - - - - - - }{ - - - - - - - - - - }int ff2 ( - - - - - )int ff2 ( - - - - - ){ {

- - - - - - - - - - - - - - - - - - - - a = ff1 (expr1, expr2, expr3);a = ff1 (expr1, expr2, expr3);

- - - - - - - - - - - - - - - - - - - - }}

ff1 IDFUNC

3tid npara

mListPara

m

#

a IDVAR INTEIRO

tid

escopo

tvar

b IDVAR REALtid

escopo

tvar

c IDVAR LOGICO

tid

escopo

tvar

Na chamada de ff1:•O número de expressões deve ser 3•Deve haver compatibilidade entre (expr1, a), (expr2, b) e (expr3, c)

Page 130: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Produções envolvidas:Produções envolvidas:

CallFuncCallFunc : ID ( Argumentos ): ID ( Argumentos )ArgumentosArgumentos : : εε | ListExpr | ListExprListExprListExpr : Expressao | ListExpr , : Expressao | ListExpr , Expressao Expressao

É conveniente que os não-terminais É conveniente que os não-terminais ListExprListExpr e e Argumentos Argumentos tenham como atributos: tenham como atributos:

Número de argumentosNúmero de argumentos (expressões) (expressões) Lista de tiposLista de tipos dos argumentos (tipos das dos argumentos (tipos das

expressões)expressões)typedef struct infolistexpr infolistexpr;struct infolistexpr { pontexprtipo listtipo; int nargs; };

Page 131: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Acrescenta-se a seguinte declaração na Acrescenta-se a seguinte declaração na %union%union::

infolistexpr infolexpr;infolistexpr infolexpr;

E a seguinte declaração de E a seguinte declaração de atributoatributo de não- de não-terminais:terminais:

%type%type <infolexpr> ListExpr Argumentos<infolexpr> ListExpr Argumentos

A seguir a programação nos três não-terminais A seguir a programação nos três não-terminais envolvidosenvolvidos

Page 132: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Nos não-terminais Nos não-terminais ListExpr ListExpr e e ArgumentosArgumentos : :

ListExpr ListExpr : Expressao {: Expressao {$$.nargs = 1; $$.listtipo = InicListTipo ($1.tipo);$$.nargs = 1; $$.listtipo = InicListTipo ($1.tipo);}}| ListExpr VIRG Expressao {| ListExpr VIRG Expressao {$$.nargs = $1.nargs + 1;$$.nargs = $1.nargs + 1;$$.listtipo = $$.listtipo = ConcatListTipo ($1.listtipo, InicListTipo ($3.tipo));ConcatListTipo ($1.listtipo, InicListTipo ($3.tipo));}}

;;

ArgumentosArgumentos : : {$$.nargs = 0; $$.listtipo = NULL;} {$$.nargs = 0; $$.listtipo = NULL;} | ListExpr /* default: $$ = $1; */| ListExpr /* default: $$ = $1; */

Page 133: CES-41 COMPILADORES Capítulo VI Análise Semântica.

No não-terminal No não-terminal CallFuncCallFunc : :

CallFuncCallFunc : ID ABPAR {: ID ABPAR {simb = ProcuraSimb ($1, escopo->escopo);simb = ProcuraSimb ($1, escopo->escopo);if (! simb) if (! simb) NaoDeclarado ($1);NaoDeclarado ($1);else if (simb->tid != IDFUNC)else if (simb->tid != IDFUNC)TipoInadequado ($1);TipoInadequado ($1);$<simb>$ = simb;$<simb>$ = simb;} Argumentos FPAR { } Argumentos FPAR { $$ = $<simb>3;$$ = $<simb>3;if ($$ && $$->tid == IDFUNC) {if ($$ && $$->tid == IDFUNC) {if ($$->nparam != $4.nargs)if ($$->nparam != $4.nargs)Incompatibilidade Incompatibilidade ("Numero de argumentos diferente do numero de ("Numero de argumentos diferente do numero de parametros");parametros");ChecArgumentos ($4.listtipo, $$->listparam); ChecArgumentos ($4.listtipo, $$->listparam); }}}}

;;A seguir a função ChecArgumentos

Necessário para calcular o tipo de Fator na produção

Fator : CallFunc

Atributo de CallFunc:

Ponteiro para o nome da função na TabSimb

Necessário: %type <simb>

CallFunc

Page 134: CES-41 COMPILADORES Capítulo VI Análise Semântica.

void ChecArgumentos (pontexprtipo Ltiparg, listsimb void ChecArgumentos (pontexprtipo Ltiparg, listsimb Lparam) {Lparam) {

pontexprtipo p; pontelemlistsimb q;pontexprtipo p; pontelemlistsimb q;p = Ltiparg->prox; q = Lparam->prox;p = Ltiparg->prox; q = Lparam->prox;

ff1 IDFUNC

3tid npara

mListPara

m

#

a IDVAR INTEIRO

tid

escopo

tvar

b IDVAR REALtid

escopo

tvar

c IDVAR LOGICO

tid

escopo

tvar

########

INTEIRO

INTEIRO

LOGICO

Ltiparg

Lparam

pq

Page 135: CES-41 COMPILADORES Capítulo VI Análise Semântica.

while (p != NULL && q != NULL) {while (p != NULL && q != NULL) {switch (q->simb->tvar) {switch (q->simb->tvar) {case INTEIRO: case CARACTERE:case INTEIRO: case CARACTERE:if (p->tipo != if (p->tipo != INTEIRO && p->tipo != CARACTERE)INTEIRO && p->tipo != CARACTERE)Incompatibilidade("....");Incompatibilidade("....");break;break;case REAL:case REAL:if (p->tipo != if (p->tipo != INTEIRO && p->tipo != CARACTERE && INTEIRO && p->tipo != CARACTERE && p->tipo != REAL)p->tipo != REAL)Incompatibilidade("....");Incompatibilidade("...."); break;break;case LOGICO:case LOGICO:if (p->tipo != if (p->tipo != LOGICO)LOGICO)Incompatibilidade("....");Incompatibilidade("....");break;break;default:default:if (q->simb->tvar != p->tipo)if (q->simb->tvar != p->tipo)Incompatibilidade("....");Incompatibilidade("....");break;break;}}p = p->prox; q = q->prox;p = p->prox; q = q->prox;}}

}}

Page 136: CES-41 COMPILADORES Capítulo VI Análise Semântica.

d) Teste de compatibilidade entre parâmetros d) Teste de compatibilidade entre parâmetros e argumentos do tipo variável indexadae argumentos do tipo variável indexada

Esse teste exige Esse teste exige alteraçõesalterações na função na função ChecArgumentosChecArgumentos, bem como nas , bem como nas açõesações de de algumas produções da gramáticaalgumas produções da gramática

Se um parâmetro for uma Se um parâmetro for uma variável indexadavariável indexada, o , o argumento correspondente deve ser uma argumento correspondente deve ser uma variável de variável de mesmo tipo e dimensãomesmo tipo e dimensão

Se esse parâmetro for um Se esse parâmetro for um vetorvetor, o argumento , o argumento pode ser um pode ser um vetorvetor ou uma ou uma linhalinha de uma de uma matriz matriz bi-dimensionalbi-dimensional de mesma dimensão de mesma dimensão

Page 137: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo: Exemplo: seja o códigoseja o código

int ff (float int ff (float A[ , ]A[ , ], int , int B[ ]B[ ]) {) {- - - - -- - - - -

}}void main ( ) {void main ( ) {

float float X [... , ... , ...]X [... , ... , ...];;int int Y [... , ... , ...]Y [... , ... , ...];;- - - - -- - - - -. . . = . . . . . . ff ( . . . = . . . . . . ff ( X[ ... ]X[ ... ] , , Y[ ... , ... ]Y[ ... , ... ] ) . . . . . . ; ) . . . . . . ;- - - - -- - - - -

}} Expressões contendo um só elemento

É necessário verificar se uma expressão tem um só elemento:

Mais informações nos atributos de expressões

Page 138: CES-41 COMPILADORES Capítulo VI Análise Semântica.

e) Teste de compatibilidade da expressão e) Teste de compatibilidade da expressão retornada por uma funçãoretornada por uma função

Tabela de compatibilidade:Tabela de compatibilidade:

Page 139: CES-41 COMPILADORES Capítulo VI Análise Semântica.

A A programaçãoprogramação para esse teste muito se para esse teste muito se assemelhaassemelha com aquela feita para com aquela feita para comandos de comandos de atribuiçãoatribuição

As produções envolvidas são:As produções envolvidas são:

CmdReturn CmdReturn :: RETURN | RETURN RETURN | RETURN ExpressãoExpressão

É necessário comparar o É necessário comparar o tipo da expressãotipo da expressão com com o o tipo da funçãotipo da função que define o escopo do que define o escopo do comando comando returnreturn

No caso da primeira produção, o tipo da função No caso da primeira produção, o tipo da função deve ser deve ser voidvoid

Page 140: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.4 – Testes Semânticos em 6.4 – Testes Semânticos em Análise PreditoraAnálise Preditora Seja o método apresentado na Seja o método apresentado na Seção 5.4.3Seção 5.4.3

do capítulo sobre análise sintática:do capítulo sobre análise sintática: Cada não-terminal tem seu Cada não-terminal tem seu procedimento (sub-programa) particularprocedimento (sub-programa) particular

Nesse método, as Nesse método, as açõesações para para análise análise semânticasemântica e para e para geração de código geração de código intermediáriointermediário são são recheiosrecheios no no procedimentoprocedimento de cada não-terminal.de cada não-terminal.

Resta apresentar a implementação de Resta apresentar a implementação de atributosatributos para não-terminais nesse método para não-terminais nesse método

Page 141: CES-41 COMPILADORES Capítulo VI Análise Semântica.

141

A idéia é que os procedimentos se tornem A idéia é que os procedimentos se tornem funçõesfunções e os e os atributosatributos sejam os sejam os valores valores retornadosretornados por essas funções por essas funções

Exemplo:Exemplo: seja a gramática para expressões: seja a gramática para expressões:

ExpressãoExpressão TermoTermo EauxEauxEauxEaux OPAD OPAD Termo EauxTermo Eaux | | εεTermoTermo FatorFator TauxTauxTauxTaux OPMULT OPMULT Fator TauxFator Taux| | εεFatorFator CTE | ( CTE | ( ExpressãoExpressão ) | OPNEG ) | OPNEG

FatorFator

A seguir um analisador sintático preditor A seguir um analisador sintático preditor recursivo:recursivo:

Page 142: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programa principal:Programa principal:

voidvoid main () { main () {printf ("Digite a expressao:\n\n");printf ("Digite a expressao:\n\n");fflush (stdin); gets (expressao);fflush (stdin); gets (expressao);printf ("\n"); ptexpr = 0;printf ("\n"); ptexpr = 0;carac = NovoCarac (); NovoAtomo ();carac = NovoCarac (); NovoAtomo ();Expressao ();Expressao ();ifif (atom.tipo != ENDOFFILE) (atom.tipo != ENDOFFILE)

Esperado (ENDOFFILE);Esperado (ENDOFFILE);}}

Page 143: CES-41 COMPILADORES Capítulo VI Análise Semântica.

voidvoid Expressao () {Termo (); Eaux ();} Expressao () {Termo (); Eaux ();}

voidvoid Eaux () { Eaux () {ifif (atom.tipo == OPAD) { (atom.tipo == OPAD) {

NovoAtomo (); Termo (); Eaux ();NovoAtomo (); Termo (); Eaux ();}}

}}

voidvoid Termo () {Fator (); Taux ();} Termo () {Fator (); Taux ();}

voidvoid Taux () { Taux () {ifif (atom.tipo == OPMULT) { (atom.tipo == OPMULT) {

NovoAtomo (); Fator (); Taux ();NovoAtomo (); Fator (); Taux ();}}

}}Todas as funções são do tipo void

Page 144: CES-41 COMPILADORES Capítulo VI Análise Semântica.

voidvoid Fator () { Fator () {switchswitch (atom.tipo) { (atom.tipo) {

casecase CTE: NovoAtomo (); CTE: NovoAtomo (); breakbreak;;casecase ABPAR: NovoAtomo (); Expressao (); ABPAR: NovoAtomo (); Expressao ();

ifif (atom.tipo != (atom.tipo != FPAR) FPAR) Esperado (FPAR);Esperado (FPAR);

NovoAtomo (); NovoAtomo (); breakbreak;;casecase OPNEG: NovoAtomo (); Fator (); OPNEG: NovoAtomo (); Fator (); breakbreak;;defaultdefault: NaoEsperado (atom.tipo); : NaoEsperado (atom.tipo);

NovoAtomo (); NovoAtomo (); breakbreak; ; }}

}}

Page 145: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Este programa pode ser usado como Este programa pode ser usado como esqueletoesqueleto para implementar uma para implementar uma calculadora simplescalculadora simples

No Yacc, usa-se atributos para valores No Yacc, usa-se atributos para valores intermediários e finaisintermediários e finais

Nesta análise preditora, cada função passará a Nesta análise preditora, cada função passará a retornar valores do tipo retornar valores do tipo atribnonterm atribnonterm (equivalentes a atributos no Yacc)(equivalentes a atributos no Yacc)

/*/* Estrutura dos atributos dos não-terminais */ Estrutura dos atributos dos não-terminais */

typedef struct atribnonterm atribnonterm;typedef struct atribnonterm atribnonterm;struct atribnonterm {struct atribnonterm { float valor;float valor; int oper;int oper; };};

Page 146: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Programa principal:Programa principal:

void main () {void main () {atribnonterm x;atribnonterm x;printf ("Digite a expressao:\n\n");printf ("Digite a expressao:\n\n");fflush (stdin); gets (expressao);fflush (stdin); gets (expressao);printf ("\n"); ptexpr = 0;printf ("\n"); ptexpr = 0;carac = NovoCarac (); NovoAtomo ();carac = NovoCarac (); NovoAtomo ();x = Expressao ();x = Expressao ();if (atom.tipo != ENDOFFILE)if (atom.tipo != ENDOFFILE)

Esperado (ENDOFFILE);Esperado (ENDOFFILE);elseelse

printf ("\nValor da expressao: printf ("\nValor da expressao: %g",x.valor);%g",x.valor);

}}Se houver erros além deste, o valor estará errado

Page 147: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Funcao para Expressao *//* Funcao para Expressao */

atribnonterm Expressao ()atribnonterm Expressao () { {atribnonterm x, y;atribnonterm x, y;x = Termo (); y = Eaux ();x = Termo (); y = Eaux ();if (y.oper == MAIS) x.valor += y.valor;if (y.oper == MAIS) x.valor += y.valor;else else x.valor -= y.valor;x.valor -= y.valor;return x;return x;

}}

As funções não são mais do tipo void

Page 148: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Funcao para Eaux *//* Funcao para Eaux */

atribnonterm Eaux () {atribnonterm Eaux () {atribnonterm x, y; long oper;atribnonterm x, y; long oper;x.valor = 0; x.oper = MAIS;x.valor = 0; x.oper = MAIS;if (atom.tipo == OPAD) {if (atom.tipo == OPAD) {

oper = atom.atrib.atr; oper = atom.atrib.atr; NovoAtomo ();NovoAtomo ();x = Termo (); y = Eaux ();x = Termo (); y = Eaux ();if (oper == MENOS) if (oper == MENOS) y.valor *= -1;y.valor *= -1;if (y.oper == MAIS) x.valor += y.valor;if (y.oper == MAIS) x.valor += y.valor;else x.valor -= y.valor;else x.valor -= y.valor;x.oper = oper;x.oper = oper;

}}return x;return x;

}}

Page 149: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Funcao para Termo *//* Funcao para Termo */

atribnonterm Termo ()atribnonterm Termo () { {atribnonterm x, y;atribnonterm x, y;x = Fator (); y = Taux ();x = Fator (); y = Taux ();if (y.oper == VEZES) x.valor *= y.valor;if (y.oper == VEZES) x.valor *= y.valor;else x.valor /= y.valor;else x.valor /= y.valor;return x;return x;

}}

Page 150: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Funcao para Taux *//* Funcao para Taux */

atribnonterm Taux ()atribnonterm Taux () { {atribnonterm x, y; long oper;atribnonterm x, y; long oper;x.valor = 1; x.oper = VEZES;x.valor = 1; x.oper = VEZES;if (atom.tipo == OPMULT) {if (atom.tipo == OPMULT) {

oper = atom.atrib.atr; oper = atom.atrib.atr; NovoAtomo ();NovoAtomo ();x = Fator (); y = Taux ();x = Fator (); y = Taux ();if (oper == DIV) y.valor = 1 / y.valor;if (oper == DIV) y.valor = 1 / y.valor;if (y.oper == VEZES) x.valor *= y.valor;if (y.oper == VEZES) x.valor *= y.valor;else x.valor /= y.valor;else x.valor /= y.valor;x.oper = oper;x.oper = oper;

}}return x;return x;

}}

Page 151: CES-41 COMPILADORES Capítulo VI Análise Semântica.

/* Funcao para Fator *//* Funcao para Fator */

atribnonterm Fator ()atribnonterm Fator () { {atribnonterm x;atribnonterm x;switch (atom.tipo) {switch (atom.tipo) {

case CTE: case CTE: x.valor = atom.atrib.valor;x.valor = atom.atrib.valor; NovoAtomo (); break;NovoAtomo (); break;

case ABPAR: NovoAtomo (); case ABPAR: NovoAtomo (); x = Expressao ();x = Expressao ();if (atom.tipo != if (atom.tipo != FPAR) Esperado (FPAR);FPAR) Esperado (FPAR);NovoAtomo (); break;NovoAtomo (); break;

case OPNEG: NovoAtomo (); case OPNEG: NovoAtomo (); x = Fator (); x.valor *= -1; x = Fator (); x.valor *= -1; break;break;

default: NaoEsperado (atom.tipo); default: NaoEsperado (atom.tipo); NovoAtomo (); break;NovoAtomo (); break;

}}return x;return x;

}}

Page 152: CES-41 COMPILADORES Capítulo VI Análise Semântica.

No exemplo visto, os No exemplo visto, os atributosatributos de todos de todos os não-terminais são do os não-terminais são do mesmo tipomesmo tipo e e tem dois campos: tem dois campos: valorvalor e e operoper..

Em gramáticas mais complexas, os tipos Em gramáticas mais complexas, os tipos podem podem variar de não-terminal para variar de não-terminal para não-terminalnão-terminal..

Page 153: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.5 – Formalização de Análise 6.5 – Formalização de Análise SemânticaSemântica

6.5.1 – Esquemas de tradução6.5.1 – Esquemas de tradução

O processo de O processo de análise semânticaanálise semântica apresentado até aqui tem caráter um apresentado até aqui tem caráter um tanto tanto informalinformal; bem mais informal que ; bem mais informal que os processos de os processos de análise sintáticaanálise sintática vistos. vistos.

Por exemplo, as Por exemplo, as especificações especificações semânticassemânticas das linguagens foram feitas das linguagens foram feitas quase que quase que desassociadasdesassociadas das produções das produções das das gramáticasgramáticas..

Page 154: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Para resolver os Para resolver os testes semânticostestes semânticos foram usadas inúmeras foram usadas inúmeras variáveis variáveis globaisglobais, tais como , tais como pilhaspilhas, , flagsflags, etc., , etc., que que nada têm a ver com a gramáticanada têm a ver com a gramática da linguagem analisada.da linguagem analisada.

Se o Se o YaccYacc não usasse não usasse atributosatributos associados aos símbolos nas reduções, associados aos símbolos nas reduções, seriam necessárias muitas seriam necessárias muitas outras pilhas outras pilhas e flagse flags, para a análise semântica e , para a análise semântica e outros recheios da análise sintática.outros recheios da análise sintática.

Page 155: CES-41 COMPILADORES Capítulo VI Análise Semântica.

A A literaturaliteratura sobre compiladores sobre compiladores apresenta um certo grau de apresenta um certo grau de formalizaçãoformalização da análise semântica e da análise semântica e desses outros recheios.desses outros recheios.

O nome dado a essa formalização é O nome dado a essa formalização é esquema de traduçãoesquema de tradução e isso engloba a e isso engloba a utilização de utilização de atributosatributos dos símbolos. dos símbolos.

Page 156: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Esquema de traduçãoEsquema de tradução é uma é uma generalizaçãogeneralização de gramática livre de de gramática livre de contexto na qual:contexto na qual:

Cada ocorrência de símbolo em uma Cada ocorrência de símbolo em uma produção tem associado um produção tem associado um conjunto de conjunto de atributosatributos;;

Esses atributos são Esses atributos são definidosdefinidos e e computadoscomputados através de através de regras regras semânticassemânticas (ações) inseridas em (ações) inseridas em determinadas determinadas posiçõesposições das produções das produções da gramática (no início, meio e fim).da gramática (no início, meio e fim).

Page 157: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Tal como já foi visto, esses Tal como já foi visto, esses atributosatributos podem podem ser valores de ser valores de constantesconstantes numéricas ou numéricas ou não, ponteiros para um não, ponteiros para um símbolosímbolo da tabela da tabela de símbolos, de símbolos, listaslistas de símbolos ou tipos ou de símbolos ou tipos ou constantes, etc..constantes, etc..

Também como já foi visto, na Também como já foi visto, na árvore árvore sintáticasintática de uma sentença ou programa, de uma sentença ou programa, esses esses atributosatributos ficam localizados em seus ficam localizados em seus nósnós..

AtributoAtributo não é não é propriedadepropriedade de uma de uma produção, mas sim de uma produção, mas sim de uma instância de instância de produçãoprodução no processo de análise no processo de análise

Page 158: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Exemplo 6.11:Exemplo 6.11: Seja o seguinte Seja o seguinte esquema de esquema de traduçãotradução para expressões aritméticas: para expressões aritméticas:

L L E ‘\n’ E ‘\n’ {L.fict {L.fict Imprimir (E.val)} Imprimir (E.val)}E E E E11 ‘+’ T ‘+’ T {E.val {E.val E E11.val + T.val}.val + T.val}E E T T {E.val {E.val T.val} T.val}T T T T11 ‘*’ F ‘*’ F {T.val {T.val T T11.val * F.val}.val * F.val}T T F F {T.val {T.val F.val} F.val}F F ‘(’ E ‘)’ ‘(’ E ‘)’ {F.val {F.val E.val} E.val}F F num num {F.val {F.val num.lexval} num.lexval}

Árvore sintática com atributos

para

25 * 4 + 10 \n

Para ações sem atribuições, cria-se atributos fictícios para serem lados-esquerdos

Page 159: CES-41 COMPILADORES Capítulo VI Análise Semântica.

L L E ‘\n’ E ‘\n’ {L.fict {L.fict Imprimir (E.val)} Imprimir (E.val)}E E E E11 ‘+’ T ‘+’ T {E.val {E.val E E11.val + T.val}.val + T.val}E E T T {E.val {E.val T.val} T.val}T T T T11 ‘*’ F ‘*’ F {T.val {T.val T T11.val * F.val}.val * F.val}T T F F {T.val {T.val F.val} F.val}F F ‘(’ E ‘)’ ‘(’ E ‘)’ {F.val {F.val E.val} E.val}F F num num {F.val {F.val num.lexval} num.lexval}

Uma ação só pode ser executada, quando seus operandos estiverem disponíveis

No início, os únicos atributos disponíveis são os lexval’s

Page 160: CES-41 COMPILADORES Capítulo VI Análise Semântica.

L L E ‘\n’ E ‘\n’ {L.fict {L.fict Imprimir (E.val)} Imprimir (E.val)}E E E E11 ‘+’ T ‘+’ T {E.val {E.val E E11.val + T.val}.val + T.val}E E T T {E.val {E.val T.val} T.val}T T T T11 ‘*’ F ‘*’ F {T.val {T.val T T11.val * F.val}.val * F.val}T T F F {T.val {T.val F.val} F.val}F F ‘(’ E ‘)’ ‘(’ E ‘)’ {F.val {F.val E.val} E.val}F F num num {F.val {F.val num.lexval} num.lexval}

Agora, as ações que podem ser executadas são as do tipo

F.val num.lexval

Page 161: CES-41 COMPILADORES Capítulo VI Análise Semântica.

L L E ‘\n’ E ‘\n’ {L.fict {L.fict Imprimir (E.val)} Imprimir (E.val)}E E E E11 ‘+’ T ‘+’ T {E.val {E.val E E11.val + T.val}.val + T.val}E E T T {E.val {E.val T.val} T.val}T T T T11 ‘*’ F ‘*’ F {T.val {T.val T T11.val * F.val}.val * F.val}T T F F {T.val {T.val F.val} F.val}F F ‘(’ E ‘)’ ‘(’ E ‘)’ {F.val {F.val E.val} E.val}F F num num {F.val {F.val num.lexval} num.lexval}

Agora, as ações que podem ser executadas são as do tipo

T.val F.val

Page 162: CES-41 COMPILADORES Capítulo VI Análise Semântica.

L L E ‘\n’ E ‘\n’ {L.fict {L.fict Imprimir (E.val)} Imprimir (E.val)}E E E E11 ‘+’ T ‘+’ T {E.val {E.val E E11.val + T.val}.val + T.val}E E T T {E.val {E.val T.val} T.val}T T T T11 ‘*’ F ‘*’ F {T.val {T.val T T11.val * F.val}.val * F.val}T T F F {T.val {T.val F.val} F.val}F F ‘(’ E ‘)’ ‘(’ E ‘)’ {F.val {F.val E.val} E.val}F F num num {F.val {F.val num.lexval} num.lexval}

Agora, a ação a ser executada é

T.val T1.val * F.val

Page 163: CES-41 COMPILADORES Capítulo VI Análise Semântica.

L L E ‘\n’ E ‘\n’ {L.fict {L.fict Imprimir (E.val)} Imprimir (E.val)}E E E E11 ‘+’ T ‘+’ T {E.val {E.val E E11.val + T.val}.val + T.val}E E T T {E.val {E.val T.val} T.val}T T T T11 ‘*’ F ‘*’ F {T.val {T.val T T11.val * F.val}.val * F.val}T T F F {T.val {T.val F.val} F.val}F F ‘(’ E ‘)’ ‘(’ E ‘)’ {F.val {F.val E.val} E.val}F F num num {F.val {F.val num.lexval} num.lexval}

Agora, a ação a ser executada é

E.val T.val

Page 164: CES-41 COMPILADORES Capítulo VI Análise Semântica.

L L E ‘\n’ E ‘\n’ {L.fict {L.fict Imprimir (E.val)} Imprimir (E.val)}E E E E11 ‘+’ T ‘+’ T {E.val {E.val E E11.val + T.val}.val + T.val}E E T T {E.val {E.val T.val} T.val}T T T T11 ‘*’ F ‘*’ F {T.val {T.val T T11.val * F.val}.val * F.val}T T F F {T.val {T.val F.val} F.val}F F ‘(’ E ‘)’ ‘(’ E ‘)’ {F.val {F.val E.val} E.val}F F num num {F.val {F.val num.lexval} num.lexval}

Agora

E.val E1.val + T.val

Page 165: CES-41 COMPILADORES Capítulo VI Análise Semântica.

L L E ‘\n’ E ‘\n’ {L.fict {L.fict Imprimir (E.val)} Imprimir (E.val)}E E E E11 ‘+’ T ‘+’ T {E.val {E.val E E11.val + T.val}.val + T.val}E E T T {E.val {E.val T.val} T.val}T T T T11 ‘*’ F ‘*’ F {T.val {T.val T T11.val * F.val}.val * F.val}T T F F {T.val {T.val F.val} F.val}F F ‘(’ E ‘)’ ‘(’ E ‘)’ {F.val {F.val E.val} E.val}F F num num {F.val {F.val num.lexval} num.lexval}

E finalmente

L.fict Imprimir (E.val)

Page 166: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.5.2 – Atributos sintetizados e 6.5.2 – Atributos sintetizados e hereditárioshereditários

No exemplo anterior, os No exemplo anterior, os atributos em um nóatributos em um nó da árvore sintática são calculados em função da árvore sintática são calculados em função dos dos atributos dos filhosatributos dos filhos desse nó. desse nó.

Atributos com essa característica recebem o Atributos com essa característica recebem o nome de nome de atributos sintetizadosatributos sintetizados..

Atributos sintetizadosAtributos sintetizados são transmitidos pela são transmitidos pela árvore na direção árvore na direção bottom-upbottom-up..

É concebível também uma É concebível também uma outra modalidadeoutra modalidade de atributos que são transmitidos pela árvore de atributos que são transmitidos pela árvore na direção na direção top-downtop-down..

Page 167: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Por exemplo, pode ser útil, para um Por exemplo, pode ser útil, para um não não terminalterminal, informação sobre o , informação sobre o escopoescopo onde ele está sendo processado.onde ele está sendo processado.

EscopoEscopo é uma típica informação a ser é uma típica informação a ser transmitida na direção transmitida na direção top-downtop-down..

Atributos com essa característica recebem Atributos com essa característica recebem o nome de o nome de atributos hereditáriosatributos hereditários..

Numa árvore sintática, os Numa árvore sintática, os atributos atributos hereditários hereditários de um nó são calculados em de um nó são calculados em função dos função dos atributos dos pais e irmãosatributos dos pais e irmãos desse nó.desse nó.

Page 168: CES-41 COMPILADORES Capítulo VI Análise Semântica.

168

Exemplo:Exemplo: Esquema de tradução com Esquema de tradução com atributos atributos hereditárioshereditários (declaração de (declaração de tipos de variáveis)tipos de variáveis)

Recorda-se que, em Yacc, usou-se a variável tipocorrente para armazenar o tipo de uma variável na TabSimb

Tal variável nada tem a ver com as produções da gramática

A seguir um esquema de tradução para esse armazenamento:

Page 169: CES-41 COMPILADORES Capítulo VI Análise Semântica.

169

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {L1.her {L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

Árvore sintática para a sentençaÁrvore sintática para a sentença float id1, float id1, id2, id3id2, id3::

Page 170: CES-41 COMPILADORES Capítulo VI Análise Semântica.

170

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {L1.her {L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

Árvore sintática para a sentençaÁrvore sintática para a sentença float id1, float id1, id2, id3id2, id3::

O atributo her é hereditário

Na produçãoL L1 , id

L1.her é função de her do nó pai

Na produçãoD T L

her é função de tipo do nó irmão

Page 171: CES-41 COMPILADORES Capítulo VI Análise Semântica.

171

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {L1.her {L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

Árvore sintática para a sentençaÁrvore sintática para a sentença float id1, float id1, id2, id3id2, id3::

O atributo her é hereditário

IntrodTipo coloca o valor de her na célula que guarda id na TabSimb

fict é um atributo fictício para receber IntrodTipo, que não retorna valor

O atributo entr de id é uma referência à TabSimb

Page 172: CES-41 COMPILADORES Capítulo VI Análise Semântica.

172

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {L1.her {L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

Árvore sintática para a sentençaÁrvore sintática para a sentença float id1, float id1, id2, id3id2, id3::

Atributos são associados aos símbolos da linguagem

Cada nó da árvore pode possuir um ou mais atributos

Cada atributo de um nó é calculado por um comando das ações do esquema de tradução

Page 173: CES-41 COMPILADORES Capítulo VI Análise Semântica.

173

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {{T.tipo T.tipo REAL REAL}}L L L1 , id L1 , id {L1.her {L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

Inicialmente:

T.tipo REAL

Page 174: CES-41 COMPILADORES Capítulo VI Análise Semântica.

174

D D T L T L {{L.her L.her T.tipo T.tipo}}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {L1.her {L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

Em seguida:

L.her T.tipo

Page 175: CES-41 COMPILADORES Capítulo VI Análise Semântica.

175

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {{L1.her L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her) IntrodTipo (id.entr, L.her)}}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

Depois:

L.fict IntrodTipo (id.entr, L.her)L1.her L.her

Page 176: CES-41 COMPILADORES Capítulo VI Análise Semântica.

176

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {{L1.her L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her) IntrodTipo (id.entr, L.her)}}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

Ainda depois:

L.fict IntrodTipo (id.entr, L.her)L1.her L.her

Page 177: CES-41 COMPILADORES Capítulo VI Análise Semântica.

177

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {L1.her {L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}L L id id {{L.fict L.fict IntrodTipo (id.entr, L.her) IntrodTipo (id.entr, L.her)}}

E finalmente:

L.fict IntrodTipo (id.entr, L.her)

Page 178: CES-41 COMPILADORES Capítulo VI Análise Semântica.

178

D D T L T L {L.her {L.her T.tipo} T.tipo}T T int int {T.tipo {T.tipo INTEIRO} INTEIRO}T T float float {T.tipo {T.tipo REAL} REAL}L L L1 , id L1 , id {L1.her {L1.her L.her; L.her; L.fict L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}L L id id {L.fict {L.fict IntrodTipo (id.entr, L.her)} IntrodTipo (id.entr, L.her)}

O atributo her é calculado na direção top-down na árvore

Page 179: CES-41 COMPILADORES Capítulo VI Análise Semântica.

179

Em Em YaccYacc, trabalha-se com , trabalha-se com atributos atributos sintetizadossintetizados; atributos de um nó da árvore ; atributos de um nó da árvore sintática podem influir no cálculo dos sintática podem influir no cálculo dos atributos de seus ancestraisatributos de seus ancestrais..

Além disso, numa produção, os Além disso, numa produção, os atributosatributos dos dos símbolos dos símbolos dos dois ladosdois lados podem ser calculados podem ser calculados uns em função dos outros, uns em função dos outros, indistintamenteindistintamente. .

Não é possível, em Não é possível, em YaccYacc,, que o que o atributo de atributo de um nóum nó influa no cálculo dos influa no cálculo dos atributos de atributos de seus descendentesseus descendentes na árvore, com a na árvore, com a exceçãoexceção daqueles de daqueles de seus filhosseus filhos..

Exemplo 6.13: Exemplo 6.13: Programa em Programa em YaccYacc para a para a gramáticagramática

S S a b A c D a b A c D A A a b A c | a b A c | ε ε D D d d D | d d D | εε

Page 180: CES-41 COMPILADORES Capítulo VI Análise Semântica.

180

%token a%token a %token b%token b%token c%token c %token d%token d%token dolar%token dolar %token erro%token erro%%%%SSSS :: S dolar S dolar {{

printf ("Fim da analise\n");printf ("Fim da analise\n");return 0;}return 0;}

;;SS :: a {$1 = 5;} b {$$ = 8;}a {$1 = 5;} b {$$ = 8;}

A {$5 = $1 + 2; $3 = $4 + $5;} c D {A {$5 = $1 + 2; $3 = $4 + $5;} c D {$$ = $1 + $3 + $5 + 10; $8 = 10 * $$;$$ = $1 + $3 + $5 + 10; $8 = 10 * $$;printf ("$$ = %d; $8 = %d;\n", $$, $8);printf ("$$ = %d; $8 = %d;\n", $$, $8);

}} ;;

AA ::|| a b A ca b A c ;;

DD ::|| d d Dd d D ;;

%%%%

yylex () { char x; x = getchar (); while (x == ' ' || x == '\n' || x == '\t' || x == '\r') x = getchar (); printf ("Caractere lido: %c\n", x); if (x == 'a') return a; if (x == 'b') return b; if (x == 'c') return c; if (x == 'd') return d; if (x == '$') return dolar; return erro;}

Saída para abcdd$ : Caractere lido: aCaractere lido: bCaractere lido: cCaractere lido: dCaractere lido: dCaractere lido: $$$ = 37; $8 = 370;Fim da analise

Page 181: CES-41 COMPILADORES Capítulo VI Análise Semântica.

181

Ainda em Ainda em YaccYacc, numa mesma produção, não se pode , numa mesma produção, não se pode referenciar à esquerdareferenciar à esquerda de um símbolo o seu de um símbolo o seu atributo.atributo.

Exemplo : Exemplo : Trocando no exemplo anterior as ações da Trocando no exemplo anterior as ações da produção de produção de SS por: por:

SS :: a {$1 = 5;} b {$$ = 8;}a {$1 = 5;} b {$$ = 8;}A {$5 = $1 + 2; $8 = $4 + $5;} c DA {$5 = $1 + 2; $8 = $4 + $5;} c D{{$$ = $1 + $3 + $5 + 10; $8 = 10 * $$;$$ = $1 + $3 + $5 + 10; $8 = 10 * $$;printf ("$$ = %d; $8 = %d;\n", $$, $8);printf ("$$ = %d; $8 = %d;\n", $$, $8);}};;

Ou seja, Ou seja, referenciando $8referenciando $8, que é o , que é o atributo de Datributo de D, à , à esquerda de Desquerda de D, a execução do , a execução do Yacc Yacc acusará acusará erroerro..

Page 182: CES-41 COMPILADORES Capítulo VI Análise Semântica.

182

Numa Numa análise preditora recursiva análise preditora recursiva procedimental:procedimental:

Atributos Atributos hereditárioshereditários podem ser podem ser passados como passados como parâmetrosparâmetros para os para os procedimentos dos não-terminais procedimentos dos não-terminais

Conforme já foi visto, atributos Conforme já foi visto, atributos sintetizadossintetizados podem ser valores podem ser valores retornadosretornados desses procedimentos. desses procedimentos.

Page 183: CES-41 COMPILADORES Capítulo VI Análise Semântica.

6.5.3 – Grafo de dependências dos 6.5.3 – Grafo de dependências dos atributosatributos

O fato de O fato de atributos de alguns nósatributos de alguns nós de de uma árvore sintática serem calculados uma árvore sintática serem calculados em funçãoem função daqueles de daqueles de outros nósoutros nós concebe um concebe um grafo de dependênciasgrafo de dependências

Exemplo 6.15: Exemplo 6.15: Grafo de dependências Grafo de dependências da árvore da árvore

Page 184: CES-41 COMPILADORES Capítulo VI Análise Semântica.

O grafo deve ser acíclico, senão está errado

Page 185: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Sendo esse grafo acíclico, a Sendo esse grafo acíclico, a execução das execução das açõesações do esquema deve obedecer a uma do esquema deve obedecer a uma ordenação topológicaordenação topológica do grafo do grafo

Ordenação topológica:Ordenação topológica: tipo1 REALher3 tipo1fict3 IntrodTipo (entr3, her3)her2 her3fict2 IntrodTipo (entr2, her2)her1 her2fict1 IntrodTipo (entr1, her1)

Page 186: CES-41 COMPILADORES Capítulo VI Análise Semântica.

Muitos Muitos esquemas de traduçãoesquemas de tradução dispensam a construção de dispensam a construção de árvores árvores sintáticassintáticas

Mas o uso de atributos Mas o uso de atributos sintetizadossintetizados e e hereditárioshereditários fica bem determinado fica bem determinado se essas existirem.se essas existirem.

Assim, conceitualmente falando, dado Assim, conceitualmente falando, dado um um esquema de traduçãoesquema de tradução e uma e uma sentençasentença a ser analisada, pode-se a ser analisada, pode-se realizar os seguintes realizar os seguintes passospassos::

Page 187: CES-41 COMPILADORES Capítulo VI Análise Semântica.