Você está na página 1de 45

Sintaxe e Semntica

George Darmiton da Cunha Cavalcanti


(gdcc@cin.ufpe.br)

Tpicos Introduo O problema de descrever a sintaxe Mtodos formais para descrever a sintaxe Gramticas de atributos Descrevendo o significado dos programas: semntica dinmica

Semntica
Descreve o significado das expresses, das instrues e das unidades de programas Razes para descrever a semntica
Saber precisamente o que as instrues de uma linguagem fazem As provas de exatido do programa recorrem a descrio formal da semntica da linguagem

No existe uma notao ou um formalismo amplamente aceito para descrever semntica


Semntica Operacional Semntica Axiomtica Semntica Denotacional

Tipos de Semntica Formal


Semntica Operacional
Como o programa executado? Que operaes so realizadas?

Semntica Denotacional
O que o programa significa? Que objetos matemticos ele denota?

Semntica Axiomtica
Quais proposies lgicas so vlidas para um programa? ex.:{x = 4} x = x + 1 {x = 5}

Semntica Operacional Descreve o significado de um programa pela execuo de suas instrues em uma mquina, seja ela real ou simulada As mudanas no estado da mquina (memria, registradores, etc.) definem o significado da instruo

Semntica Operacional
Para usar a semntica operacional em linguagens de alto nvel, uma mquina virtual necessria Um interpretador puro (hardware) seria muito caro Um interpretador puro (software) possui problemas
Os detalhes de um computador em particular (do hardware e do sistema operacional) tornariam algumas aes de difcil entendimento Tal definio semntica apenas estaria disponvel quelas pessoas com um computador identicamente configurado

Esses problemas podem ser evitados substituindo um computador real por uma computador virtual

Semntica Operacional Uma alternativa melhor


Uma simulao completa por computador

O processo:
Construir um tradutor (traduzir o cdigofonte para o cdigo de mquina de um computador idealizado) Construir um simulador para o computador idealizado

Semntica Operacional
Esse processo bsico das semnticas operacionais no incomum.
usado nos livros didticos de programao e nos manuais de consulta das linguagens

Por exemplo, a semntica da construo do for em C


Instruo C
for (expr1; expr2; expr3) { ... }

Semntica Operacional expr1;


loop: if expr2 = 0 goto out ... expr3 goto loop out:...

Semntica Operacional: Avaliao

Bom se usado informalmente (manuais da linguagem, etc.) Extremamente complexo se usado formalmente

Semntica Axiomtica
Baseada em lgica (clculo de predicados) Propsito original
Verificao formal de programas

Axiomas ou regras de inferncia so definidas para cada tipo de instruo na linguagem (para permitir transformaes de expresses para outras expresses) As expresses so chamadas de asseres (predicados)

Semntica Axiomtica
Pr-condio
Uma assero que precede imediatamente uma instruo de programa e descreve as variveis dela nesse ponto

Ps-condio
Uma assero que segue imediatamente a uma instruo e descreve as novas restries a essas variveis (e possivelmente a outras) depois da execuo da instruo

Exemplo
soma = 2*x + 1 {soma >1} Uma pr-condio possvel {x > 10}

Ps-condio

Semntica Axiomtica
A pr-condio mais fraca a menos restritiva que garantir a validade da ps-condio associada. Exemplo
soma = 2*x + 1 {soma >1}

Nesse exemplo existem vrias pr-condies possveis {x>10}, {x>100}, {x>1000} Entretanto, a mais fraca de todas as pr-condies, nesse caso, {x>0}

Forma da Semntica Axiomtica


Forma:
pr-condio {P} e ps-condio {Q} {P} statement {Q}

Um exemplo
a = b + 1
{b > 10}

{a > 1}

Uma pr-condio possvel pr-condio mais fraca


{b > 0}

Processo de Prova de Programa


A ps-condio do programa inteiro o resultado desejado
Volte no programa at a primeira instruo Se a pr-condio da primeira instruo a mesma da especificao do programa, ento o programa correto Ou seja, a primeira pr-condio declara as condies sob as quais se computar os resultados desejados

Axioma
uma afirmao lgica que se presume verdadeira

Regra de inferncia
um mtodo de suposio da verdade de uma assero, baseando-se nos valores de outras asseres

Instrues de Atribuio a = b/21 {a<10} A pr-condio mais fraca ser computada da seguinte maneira b/2-1 < 10 b < 22

Semntica Axiomtica

Instrues de Atribuio Prova de exatido de programas Um outro exemplo {x>3} x = x 3 {x>0} Usando o axioma de atribuio em x = x 3 {x>0} Produz {x>3}, que a pr-condio dada Portanto, provamos a instruo lgica acima

Semntica Axiomtica

Semntica Axiomtica

Instrues de Atribuio Entretanto, nesse caso {x>5} x = x 3 {x>0} A pr-condio no a mesma que a assero produzida pelo axioma. Porm, {x>5}{x>3} Para usarmos isso numa prova, precisamos de uma regra de inferncia, chamada regra de conseqncia
{P} S {Q}, P' P, Q Q' {P'} S {Q'}

Instrues de Atribuio A regra de conseqncia bastante til em provas Se admitirmos que P {x>3}, que Q e Q so {x>0} e P {x>5}, teremos
{P} S {Q}, P' P, Q Q' {P'} S {Q'}

Semntica Axiomtica

{x>3} x=x3 {x>0},{x>5}{x>3}, {x>0}{x>0} {x>5} x=x3 {x>0}

Semntica Axiomtica: Seqncias


Seqncia de instrues: S1 e S2 {P1} S1 {P2} {P2} S2 {P3} A regra de inferncia para essa seqncia de duas instrues ser

{P1} S1 {P2}, {P2} S2 {P3} {P1} S1; S2 {P3}

Semntica Axiomtica: Seqncias Exemplo


y = 3 * x + 1 x = y + 3 {x < 10} A pr-condio para a ltima instruo de atribuio y < 7 A pr-condio para a primeira instruo de atribuio 3 * x + 1 < 7 x < 2

Semntica Axiomtica: Seleo


{B and P} S1 {Q}, {(not B) and P} S2 {Q} {P} if B then S1 else S2 {Q}
Supondo que a ps-condio {Q} {y > 0}

Exemplo if (x>0) y = y 1 else y = y + 1

Axioma de atribuio para o then y = y 1 {y>0}, produzir y>1 Axioma de atribuio para o else y = y + 1 {y>0}, produzir y>-1

Sabendo que {y>1}{y>-1}, a regra de conseqncia nos permite usar {y>1} para a pr-condio da instruo de seleo.

Semntica Axiomtica: Laos de Pr-teste Lgico


Regra de inferncia para laos de pr-teste lgico {P} while B do S end {Q}
(I and B) S {I} {I} while B do S {I and (not B)}

I a invariante do lao (hiptese indutiva) I uma assero crucial para encontrar a prcondio mais fraca

Semntica Axiomtica: Laos de Pr-teste Lgico


Caractersticas do invariante do lao: I deve seguir as seguintes condies:
PI {I} B {I}
-- o invariante de lao deve ser verdadeiro inicialmente -- avaliao Boolean no deve mudar a validade de I -- I no modificada pela execuo do corpo do lao -- se I verdadeiro e B falso, ento o lao

{I and B} S {I}
finalizado

(I and (not B)) Q

Semntica Axiomtica: Laos de Pr-teste Lgico Exemplo: til tratarmos o processo de produo de uma condio mais fraca como uma funo, wp wp(instruo, ps-condio) = pr-condio while y<>x do y=y+1 end {y=x}

Semntica Axiomtica: Laos de Pr-teste Lgico


while y<>x do y=y+1 end {y=x} Para zero iteraes, a pr-condio mais fraca {y=x} Para uma iterao: wp(y=y+1, {y=x}) = {y+1=x}, ou {y=x-1} Para duas iteraes: wp(y=y+1, {y=x-1}) = {y+1=x-1}, ou {y=x-2} Para trs iteraes: wp(y=y+1, {y=x-2}) = {y+1=x-2}, ou {y=x-3}

Semntica Axiomtica: Laos de Pr-teste Lgico Pode-se ver que {y<x} para casos de uma ou mais iteraes Combinando isso com {y=x}, zero iteraes Obtemos {y<=x} O qual pode ser usado como a invariante de lao

Semntica Axiomtica: Laos de Pr-teste Lgico Uma pr-condio para a instruo while pode ser determinada a partir da invariante de lao Nesse caso P = I, pode ser usado Mas devemos assegurar a exigncia dos critrios anteriores

Semntica Axiomtica: Laos de Pr-teste Lgico


Avaliao dos critrios 1. 2. 3. P = I, P I (I = {y<=x}) I no afetada pela avaliao da expresso booleana (y <> x) {I and B} S {I}
{y<=x and y<>x} y = y + 1 {y<=x} Aplicando o axioma da atribuio y=y+1 {y<=x}, obtemos {y+1<=x}, que equivalente a {y<x} O que conseqncia de {y<=x and y<>x} {(y<=x) and not(y<>x)} => {y=x} {(y<=x) and y=x} => {y=x} {y=x} => {y=x} {y<=x} while y<>x do y=y+1 end {y=x}

4.

(I and (not B)) Q


5.

O lao finalizado?

Avaliao da Semntica Axiomtica


Desenvolver axiomas ou regras de inferncia para todas as instrues de uma linguagem difcil uma boa ferramenta para executar provas de exatido de programas um excelente framework para ponderar acerca de programas, mas no fcil de ser usada por usurios das linguagens e nem por codificadores de compiladores bastante til para descrever o significado das linguagens de programao

Semntica Denotacional
Baseado na teoria de funes recursivas O mtodo mais abstrato de descrio da semntica Originalmente desenvolvido Scott e Strachey (1970)

Semntica Denotacional
O processo de construo da especificao denotacional para uma linguagem define um objeto matemtico para cada entidade da linguagem
Define uma funo que mapeia instncias das entidades da linguagem em instncias dos correspondentes objetos matemticos

A idia baseia-se no fato de que h maneiras rigorosas de manipular objetos matemticos, mas no construes de linguagens de programao

Semntica Denotacional: Exemplo Um exemplo simples usando nmeros binrios

<num_bin> 0 |1 | <num_bin> 0 | <num_bin> 1

Semntica Denotacional: Exemplo


Nesse caso, o significado de um nmero binrio ser seu nmero decimal equivalente A funo Mbin relaciona os objetos sintticos com valores decimais Mbin(0) = 0 Mbin(1) = 1 Mbin(<num_bin> 0) = 2* Mbin(<num_bin>) Mbin(<num_bin> 1) = 2* Mbin(<num_bin>)+1

Semntica Denotacional: Exemplo

Essa a semntica dirigida para a sintaxe As entidades sintticas so associadas a objetos matemticos com significado concreto

Semntica Denotacional: Exemplo Um exemplo semelhante para descrever o significado sinttico dos literais decimais
<dec_num> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <dec_num> (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9) As relaes denotacionais para essas regras de sintaxe so: Mdec('0') = 0, Mdec (<dec_num> Mdec (<dec_num> Mdec (<dec_num> Mdec ('1') = 1, , Mdec ('9') = 9 '0') = 10 * Mdec (<dec_num>) '1) = 10 * Mdec (<dec_num>) + 1 '9') = 10 * Mdec (<dec_num>) + 9

Semntica Denotacional vs Operacional Na semntica operacional, as mudanas de estados so definidas por algoritmos codificados Na semntica denotacional, as mudanas de estados so definidas por funes matemticas

Semntica Denotacional: o estado de um programa O estado de um programa denotado pelos valores de todas as variveis correntes
s = {<i1, v1>, <i2, v2>, , <in, vn>} cada i o nome de uma varivel e v o seu valor

Seja VARMAP uma funo que, quando dado o nome da varivel e um estado, retorna o valor corrente da varivel VARMAP(ij, s) = vj

Nmeros Decimais

<dec_num> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <dec_num> (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9) Mdec('0') = 0, Mdec (<dec_num> Mdec (<dec_num> Mdec (<dec_num> Mdec ('1') = 1, , Mdec ('9') = 9 '0') = 10 * Mdec (<dec_num>) '1) = 10 * Mdec (<dec_num>) + 1 '9') = 10 * Mdec (<dec_num>) + 9

Semntica Denotacional: Expresses


<expr> <num_dec> | <var> | <expr_binria> <expr_binria> <expr_esquerda> <operador> <expr_direita> <operador> + | *

Mapeia as expresses no conjunto Z {error} Assumindo que expresses podem ser: nmeros decimais, variveis ou expresses booleanas com um operador aritmtico e dois operandos

Semntica Denotacional: Expresses


Me(<expr>, s) = case <expr> of <dec_num> => Mdec(<dec_num>, s) <var> => if VARMAP(<var>, s) == undef then error else VARMAP(<var>, s)

<binary_expr> => if (Me(<binary_expr>.<left_expr>, s) == undef OR Me(<binary_expr>.<right_expr>, s) = undef) then error else if (<binary_expr>.<operator> == + then Me(<binary_expr>.<left_expr>, s) + Me(<binary_expr>.<right_expr>, s) else Me(<binary_expr>.<left_expr>, s) * Me(<binary_expr>.<right_expr>, s) ...

Semntica Denotacional: Instruo de Atribuio


Mapeamento de um conjunto de estados em outro conjunto de estados
Ma(x := E, s) = if Me(E, s) == error then error else s = {<i1,v1>,<i2,v2>,...,<in,vn>}, where for j = 1, 2, ..., n, vj = VARMAP(ij, s), if ij <> x; = Me(E, s), if ij == x As duas comparaes nas duas ltimas linhas, ij<>x e ij==x, so de nomes, no de valores

Semntica Denotacional: Laos de Pr-teste Lgico


Mapeamento de conjunto de estado em conjunto de estado Para simplificar, duas novas funes so usadas
Ms1 que relaciona listas de instrues com estados Mb que relaciona expresses booleanas com valores booleanos (ou error)

Ml(while B do L, s) = if Mb(B, s) == undef then error else if Mb(B, s) == false then s else if Msl(L, s) == error then error else Ml(while B do L, Msl(L, s))

Significado do Lao
O significado do lao o valor das variveis do programa aps os comandos do lao terem sido executados um nmero pr-determinado de vezes, assumindo que no ocorram erros Na essncia, o lao foi convertido de iterao para recurso, sendo o controle recursivo definido matematicamente por outras funes de mapeamento de estados recursivos Recurso, quando comparada com iterao, mais fcil de descrever com rigor matemtico

Avaliao da Semntica Denotacional


Pode ser usada para provar a correo de um programa Fornece um meio rigoroso para se pensar sobre o programa Pode ser til no projeto da linguagem
Instrues com descries complexas podem ser reavaliadas

Pode ser usada na gerao automtica de compiladores


Somente para linguagens bastante simples

Devido complexidade pouco usada por usurios da linguagem

Resumo
BNF e gramtica livre de contexto so equivalentes a meta-linguagens
Adequadas para descrever a sintaxe de linguagens de programao

Gramtica de atributos um formalismo que permite descrever a sintaxe e a semntica esttica de uma linguagem
A semntica esttica aquela que pode ser verificada em tempo de compilao

Trs mtodos para a descrio da semntica dinmica so


Operacional, Axiomtica, Denotacional