Escolar Documentos
Profissional Documentos
Cultura Documentos
p4 Semantico 2p
p4 Semantico 2p
INTRODUÇÃO
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 1
COMPILADORES
Se o número máximo de caracteres em um nome for limitado e pequeno (até 16
caracteres), o campo nome de uma entrada da ts pode ser simplesmente um arranjo
de caracteres (alocação estática).
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 2
COMPILADORES
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 3
COMPILADORES
Em ambos os casos, o nome não pode estar na ts (se estiver é um símbolo sendo
redeclarado), devendo ser inserido.
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 4
COMPILADORES
c*n*(n+e)
Se c fosse, por exemplo, 0,001 segundo, então o tempo total gasto na gerência
da ts seria de 110 segundos. Pode parecer pouco, mas se considerarmos agora que
n e e foram multiplicados por 10, teríamos o custo multiplicado por 100!
Por essa razão, em geral tabelas de símbolos são implementadas como tabelas
de acesso direto ("hash table").
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 5
COMPILADORES
Uma tabela de acesso direto consiste basicamente de:
c*n*(n+e)/m
Desde que m pode ser feito tão grande quanto desejarmos, até mesmo n, esse
método é, via de regra, mais eficiente que listas lineares e é usado na maioria das
implementações de compiladores.
Como exemplo, indicamos abaixo uma função hash boa na maioria das
aplicações de tabelas de símbolos.
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 7
COMPILADORES
início
PRIMO = elementos na tabela de índices;
h = g = 0;
g = h .AND. 0xF0000000
se g != 0 então faça {
h = h .XOR. ( g >> 24 );
h = h .XOR. g;
}
}
h = h .MOD. PRIMO;
fim
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 8
COMPILADORES
EXPRESSÕES ARITMÉTICAS
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 9
COMPILADORES
Vejamos um exemplo com a gramática abaixo:
EA ::= T E'
E' ::= + T E' | &
T ::= F T'
T' ::= * F T' | &
F ::= ident | número_inteiro | número_real | ( EA )
F ::= ident
F ::= número_inteiro
F ::= número_real
nós sabemos o tipo de cada operando possível (de identificador obtém-se com
consulta à tabela de símbolos, de número é informado pelo analisador léxico).
Vamos simplesmente empilhar o tipo do operando na PcT. A ação semântica
associada a cada regra seria empilhar o tipo do operador na PcT.
para linguagens de programação que não admitem misturas de tipos como Pascal.
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 11
COMPILADORES
As regras ficariam:
tipo1 = pop(PcT);
tipo2 = pop(PcT);
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 12
COMPILADORES
COMANDOS DE ATRIBUIÇÃO
A regra ficaria:
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 13
COMPILADORES
EXPRESSÕES RELACIONAIS
A verificação de tipos pode ser feita com o uso de duas ações semânticas:
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 14
COMPILADORES
EXPRESSÕES LÓGICAS
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 15
COMPILADORES
COMANDOS DIVERSOS
<cmdFor> ::= FOR ID <AS_1> = <ea> <AS_2> <passo> <ea> <AS_2> DO <cmd>
<passo> ::= TO | DOWNTO
© UFCG / DSC / PSN, 2005 – Parte 4: Tabela de Símbolos e Análise Semântica – Pág. 16