Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise...
Transcript of Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise...
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;