universidade federal da paraíba departamento de informática construção de compiladores análise...
TRANSCRIPT
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;