2. 1.
1 Introdução
Descrição concisa e inteligível de uma
linguagem;
Problema da definição de uma linguagem: fazer-
P bl d d fi i ã d li f
se entender sua descrição;
Manual de referência da linguagem;
Estudo das linguagens de programação:
◦ Sintaxe: regras de definição das expressões, instruções
e unidades de programa;
◦ Semântica: verificação do significado do que foi
estruturado na sintaxe.
3. 1.
1 Introdução
if (<expr>) <instrução>
Sintaxe de if em C;
Semântica: se o valor total da expressão
for verdadeiro, a instrução incorporada
verdadeiro
será selecionada para execução (ufa!!!);
if x > 0 y = 1/x;
if 0 1/ Erro de sintaxe!
if (x == 0) y = 1/x;
( ) y / ; Erro de semântica!
Correto: if (x > 0) y =
1/x;
4. 1.
1 Introdução
Linguagens são conjuntos de seqüências de
caracteres de algum alfabeto;
◦ S üê i sentenças ou instruções.
Seqüências: i õ
Regras de sintaxe especificam quais seqüências
g p q q
fazem parte da linguagem.
Uma análise léxica descreve que lexema fazem
parte da descrição da linguagem;
Lexemas: identificadores, literais, operadores e
p
palavras especiais.
p
5. 1.
1 Introdução
Símbolo (token): categoria de lexemas
Instrução em C: index = 2 * cont + 17;
Lexemas Símbolos
index identificador
= sinal_igual
2 int_literal
* op_mult
cont identificador
+ op_soma
op soma
17 int_literal
; p
ponto_e_virgula
g
6. 1.
1 Introdução
Descrição da sintaxe da linguagem
◦ Reconhecedor
linguagem L alfabeto Σ reconhecedor R
L, Σ, R.
R identifica se seqüência criada a partir de Σ pertence a
L.
◦ Gerador
Estrutura com regras d formação para geração de novas
Et t de f ã ã d
seqüências.
7. 2. Métodos formais para descrição
da sintaxe
Tais mecanismos são chamados de
gramáticas.
Noam Chomsky descreveu, na década de
N Ch k d dé d d
50, quatro gramáticas para definir novas
classes d linguagens.
l de li
◦ Dentre elas: gramática livre de contexto.
Busca da natureza teórica das linguagens
B d ó d l
naturais.
◦ Li
Linguagens i i d programação podem
inteiras de ã d
ser descritas por ela.
8. 2. Métodos formais para descrição
da sintaxe
John Backus, 1959
◦ Descrição do ALGOL 58, notação formal para
especificar a sintaxe de uma LP;
Peter Naur, 1960
◦ Modificou a notação de Backus para o
ALGOL 60
◦ O método revisado tornou-se conhecido
como forma de Backus-Naur ou BNF.
◦ BNF é quase idêntica à idéia de gramática
livre de contexto.
9. 2. Métodos formais para descrição da sintaxe
BNF é a metalinguagem das linguagens de programação;
Usa abstrações para estruturas sintáticas (regra ou
produção):
◦ <atribuição> -> <var> = <expressão>
ç p
símbolos símbolos
não-terminais terminais
◦ total = sub1 + sub2
l b1 b2
Gramática: conjunto de regras;
if em C:
◦ <inst_if> -> if <expr_lógica> <inst>
<inst_if> -> if <expr_lógica> <inst> else <inst>
_ p_ g
Ou
◦ <inst_if> -> if <expr_lógica> <inst>
| if <expr_lógica> <inst> else <inst>
10. 2. Métodos formais para descrição
da sintaxe
Gramática para uma pequena linguagem:
<programa> -> begin <lista_inst> end
<lista_inst> -> <inst>
| <inst>; <lista_inst>
<inst> -> <var> = <expressão>
<var> -> A | B | C
<expressão> -> <var> + <var>
| <var> - <var>
| <var>
11. 2. Métodos formais para descrição
da sintaxe
Uma d i ã d
U derivação de um programa nessa linguagem:
li
<programa> => begin <lista_inst> end
=> begin <inst>; <lista inst> end
> <lista_inst>
=> begin <var> = <expressão>; <lista_inst> end
=> begin A = <expressão>; <lista_inst> end
=> begin A = <var> + <var>; <lista_inst> end
=> begin A = B + <var>; <lista_inst> end
=> begin A = B + C; <lista inst> end
<lista_inst>
=> begin A = B + C; <inst> end
=> begin A = B + C; <var> = <expressão> end
=> begin A = B + C; B = <expressão> end
=> begin A = B + C; B = <var> end
=> b i A = B + C; B = C end
begin C d
12. 2. Métodos formais para descrição
da sintaxe
<atribuição> -> <id> = <expr>
<id> -> A | B | C
<expr> -> <id> + <expr>
| <id> * <expr>
| ( <expr> )
| <id>
Com a gramática acima, como alcançar a
instrução a seguir?
A = B * (A + C )
13. 2. Métodos formais para descrição
da sintaxe
<atribuição> => <id> = <expr>
=> A = <expr>
=> A = <id> * <expr>
=> A = B * <expr>
=> A = B * ( <expr> )
=> A = B * ( <id> + <expr> )
=> A = B * ( A + <
<expr> )
>
=> A = B * ( A + <id> )
=> A = B * ( A + C )
>
14. 2. Métodos formais para descrição
da sintaxe
Árvore de análise (parse tree)
<atribuição>
<id> = <expr>
A <id> * <expr>
B ( <expr> ) Procedência
P dê i
de operadores
<id> + p
<expr>
A <id>
C
15. 2. Métodos formais para descrição da
sintaxe
BNF Estendida (Extended BNF – EBNF)
◦ Não aumenta o poder descritivo das expressões, mas
sua legibilidade e capacidade de escrita;
1ª extensão: parte opcional com uso de colchetes
<seleção> -> if ( <expressão> ) <instrução> [ else
>
<instrução> ];
2ª extensão: uso de chaves indicando repetição
p ç
indefinida ou omissão
<lista_ident> -> <identificador> { , <identificador> };
3ª extensão: múltipla escolha entre parênteses.
Uso do operador | , OU
<inst_for> -> for <var> := <expr> (to | downto) <expr>
do <inst>
17. 2. Métodos formais para descrição da sintaxe
p
Grafo de sintaxe: BNF e EBNF representados por grafos
dirigidos (de arestas direcionais)
inst_if if condição then inst
end_if
end if ;
else_if else inst
else_if else_if condição then inst
<inst_if > -> if <condição> then <inst> { <else_if> }
[ else <inst> ] end if
<else_if> -> elseif <condição> then <inst>
_ ç
Grafo de sintaxe e descrição EBNF da instrução Ada if.
18. 3.
3 Gramática de atributos
Extensão de uma gramática livre de contexto.
Uma das soluções para descrição da
semântica estática com a BNF...
â ti táti BNF
Semântica estática
◦ Se relaciona indiretamente com o significado
do programa em execução...
p g ç
◦ Verificação com as formas legais do programa
Restrição e compatibilidade de tipos;
Tempo de compilação (estática!).
Exemplo em Java: double x = 4; int y = 4 5;
4.5;
19. 3.
3 Gramática de atributos
São gramáticas com a adição de:
◦ Atributos: símbolos gramaticais;
◦ Funções de computação de atributos:
(ou funções semânticas) especificam a
computação dos valores dos atributos;
◦ Funções predicadas: declaram a sintaxe
ç p
relacionadas às regras gramaticais.
20. 3.
3 Gramática de atributos
Procedimento em Ada (aplicação da
semântica estática):
◦ Regra de sintaxe:
<def_proc> ‐> procedure <nome_proc>[1]
<corpo_do_proc> end <nome_proc>[2]
◦ Regra de semântica:
<nome_proc>[1] = <nome_proc>[2]
21. 3. Gramática de atributos
1. Regra de sintaxe: <atribuição> -> <var> = <expr>
Regra semântica: <expr>.tipo_esperado <- <var>.tipo_efetivo
2.
2 Regra de sintaxe: <expr> -> <var>[2] + <var>[3]
2 3
Regra semântica: <expr>.tipo_efetivo <-
if ( <var>[2].tipo efetivo = int ) e
var [2].tipo_efetivo
( <var>[3].tipo_efetivo = int )
then int Pesquisa nome de
variável na tabela d
iá l b l de
else real símbolos e retorna o
end if tipo da mesma
Predicado: <expr> tipo efetivo = <expr>.tipo_esperado
<expr>.tipo_efetivo <expr> tipo esperado
3. Regra de sintaxe: <expr> -> <var>
Regra semântica: <expr>.tipo_efetivo <- <var>.tipo_efetivo
Predicado: <expr>.tipo_efetivo <- <var>.tipo_esperado
4. Regra de sintaxe: <var> -> A | B | C
Regra semântica: <var>.tipo_efetivo < look up ( <var> string )
<var> tipo efetivo <- look-up <var>.string
22. 3.
3 Gramática de atributos
Um conjunto de atributos A(X) está associado a cada símbolo gramatical X
X.
<atribuição>
<expr>
S(X) – atributo
sintetizado
<var> <var>[2] <var>[3]
I(X) – atributo
( )
herdado
A = A + B
23. 3.
3 Gramática de atributos
<atribuição>
tipo_esperado
<expr>
tipo_efetivo
tipo_efetivo
<var> <var>[2] <var>[3]
tipo_efetivo tipo_efetivo
A = A + B
Fluxo dos atributos na árvore
árvore.
24. 3.
3 Gramática de atributos
<atribuição>
tipo_esperado = tipo_real
<expr> tipo_efetivo = tipo_real
tipo_efetivo
tipo efetivo = <var> <var>[2] tipo efetivo =
tipo_efetivo <var>[3] tipo efetivo =
tipo_efetivo
tipo_real tipo_real tipo_int
A = A + B
Árvore de análise completamente atribuída.
25. 4.
4 Semântica dinâmica
Nenhuma notação universalmente aceita;
4.1. Semântica operacional
Descrever o significado d um programa ao
D i ifi d de
executar suas instruções em uma máquina, real ou
simulada;
Isso exige a construção de uma máquina para
execução do interpretador do código de máquina;
Essa máquina pode ser virtual
◦ para simular os efeitos de uma máquina real;
◦ Evita conflito com configurações do sistema operacional
e/ou hardware.
26. 4.
4 Semântica dinâmica
Descrição da semântica de uma linguagem
L por um método operacional:
◦ T d t das i t õ em L para uma
Tradutor d instruções
linguagem de baixo nível;
◦ C nstr çã da má ina virtual para a
Construção máquina irt al ara
simulação do software: registradores,
memória,
memória informações de status e processo de
execução.
Depende de algoritmos não da
algoritmos,
matemática.
27. 4.
4 Semântica dinâmica
4.2.
4 2 Semântica axiomática
Baseada na lógica formal, foi idealizada
como ferramenta para provar a exatidão
dos programas;
p g ;
soma = 2 * x + 1 { soma > 1 }
predicado pré- e
ou asserção pós-condição
28. 4.
4 Semântica dinâmica
4.3.
4 3 Semântica denotacional
Objetos matemáticos são usados para
representar os significados das construções
g g ;
de linguagens;
Exemplo: sintaxe dos números binários
<num_bin> ‐> 0
<n m bin> > 0
| 1
| <num_bin> 0
| bi 0
| <num_bin> 1
29. 4.
4 Semântica dinâmica
Mbin(‘0’) = 0
Mbin(‘1’) = 1
Mbin(<num bin> ‘0’) = 2*Mbin(<num bin>)
(<num_bin> 0 ) = 2 M (<num_bin>)
Mbin(<num_bin> ‘1’) = 2*Mbin(<num_bin>) + 1
6
<num_bin> <num_bin>
3
<num_bin>
<num bin> 0 <num_bin>
<num bin> 0
1
<num_bin> 1 <num_bin> 1
1 1
Árvore de análise para
p Árvore de análise com objetos
j
o número binário 110. denotados para 110.
30. 5.
5 Revisão
Sintaxe e semântica;
Lexema, token e gramática;
Gramática livre de contexto e BNF;
Gramática de atributos;
Semântica dinâmica.