Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise...

Preview:

Citation preview

Universidade Federal da ParaíbaDepartamento de Informática

Construção de Compiladores

Análise Semântica

Exemplos sob a Perspectiva da Implementação

Universidade Federal da ParaíbaDepartamento de Informática

Abre escopo

Fechar escopo

Análise Semântica

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

Procedimento analisador_sintático { pilhaEsc = new Pilha(); obtenha_símbolo(); PROG();}Procedimento PROG { se simbolo_lido.token != “Programa” então ERRO(“falta programa”); senão { pilhaEsc.push(“$”); obtenha_símbolo(); se simbolo_lido.tipo == IDENT então pilhaEsc.add(simbolo_lido.token);

obtenha_símbolo(); se simbolo_lido.token == “;” então

DECL(); …

}

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

pilhaEsc = new Pilha();

8

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

$

pilhaEsc.push(“$”);

8

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

pilhaEsc.push(exemplo);

exe..

8

simbolo_lido.token

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

pilhaEsc.push(a);

8

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.push(b);

8

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.push(b);

p

8

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.push(“$”);

p

8

$

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.push(x);

p

x

8

$

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.push(b);

p

x

b

8

$

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.push(c);

p

x

b

8 c

$

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.procurar(b);

p

x

b

8 c

Observação 2: Como saber se identificar é declarado ou usado?

$

$

Observação 1: Note que a pilha retorna a referência correta

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

pilhaEsc.procurar(b);

Observação 2: Como saber se identificar é declarado ou usado?

x 0;…se simbolo_lido.tipo == IDENT então { se (x==0) pilhaEsc.add(simbolo_lido.token); senão pilhaEsc.procurar(simbolo_lido.token); obtenha_símbolo(); …}

se simbolo_lido.token == BEGIN então x++;se simbolo_lido.token == END então x--;

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.procurar(x);

p

x

b

8 c

$

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

pilhaEsc.procurar(y);

p

x

b

8 c

ERRO

$

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

While (topo != “$”) pilhaEsc.pop()pilhaEsc.pop() // retirar $

p

x

b

8 c

$

$

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

a

exe..

b

p

x

b

8 c

exemplo;

$

$

Observação 3: E o identificador do programa?

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

Procedimento COM_COMP { se simbolo_lido.token != “begin” então; ERRO(“falta begin”); senão { obtenha_símbolo(); COM_OPC(); se simbolo_lido.token != “end” então ERRO(“falta end”); senão x--;

fecharEscopo(); obtenha_símbolo();

…}

ERRADO

Observação 4: Como fechar o escopo?

Universidade Federal da ParaíbaDepartamento de Informática

Análise Semântica

Procedimento COM_COMP { se simbolo_lido.token != “begin” então ERRO(“falta begin”); senão { obtenha_símbolo(); COM_OPC(); se simbolo_lido.token != “end” então ERRO(“falta end”); senão x--; se (x == 0) então

fecharEscopo(); obtenha_símbolo();

…}

fecharEscopo

Observação 4: Como fechar o escopo?

C := 10;

Recommended