Você está na página 1de 79

Capítulo 3

Descrevendo Sintaxe e
Semântica
Conceitos de Linguagens de Programação – Robert W. Sebesta

Introdução
Tópicos do Capítulo 3
O problema geral de descrever sintaxe
Métodos formais para descrever sintaxe
Gramáticas de atributos
Descrevendo o significado de programas: semântica dinâmica
Conceitos de Linguagens de Programação – Robert W. Sebesta

Introdução
Sintaxe: a forma de suas expressões, sentenças e unidades de
programas
Semântica: o significado dessas expressões, sentenças e unidades
de programas
Sintaxe e semântica fornecem uma definição da linguagem

while (expressão_booleana) sentença


Conceitos de Linguagens de Programação – Robert W. Sebesta

Conceitos iniciais
Uma linguagem, seja natural (como a língua inglesa) ou artificial
(como Java), é um conjunto de cadeias de caracteres formadas a
partir de um alfabeto
Uma sentença é uma cadeia de caracteres formada a partir do
alfabeto da linguagem
Um lexema é a unidade sintática de mais baixo nível de uma
linguagem (por exemplo, *, sum, begin)
Um token é uma categoria de lexemas (por exemplo,
identificador)
O problema geral de descrever
Conceitos de Linguagens de Programação – Robert W. Sebesta

sintaxe:
Sentença: index = 2 * count + terminologia
17;
Conceitos de Linguagens de Programação – Robert W. Sebesta

Usuários de uma definição de linguagem


Outros desenvolvedores de linguagem
Implementadores
Programadores (os usuários da linguagem)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Construção das Linguagens de Programação


Introdução
Estudar a teoria da computação providencia conceitos e princípios
que ajudam a entender a natureza geral da computação.
Para estudar esses princípios básicos constroem-se modelos de
computadores abstratos para resolução de pequenos, mas não
fúteis, problemas.
Para modelar o hardware de um computador é introduzido o
conceito de autômatos.
Um autômato é uma construção que possui todas as
características indispensáveis de um computador digital:
entrada, saída, armazenagem temporária, tomadas de decisão.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Introdução
Construção das Linguagens de Programação (cont…)
Um autômato é um reconhecedor da linguagem. Através dos
reconhecedores é possível identificar se a cadeia de símbolos pertence
ou não a uma linguagem.
Linguagem formal é uma abstração das características gerais de uma
linguagem de programação. Assim, possui um conjunto de símbolos,
regras de formação de sentenças, etc.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Construção das Linguagens de Programação (cont…) Introdução


Estudar computação do ponto de vista teórico é sinônimo de
caracterizar o que é ou não é computável.
Para tanto, é preciso obter um modelo matemático que represente o
que se entende por computação.
Existem vários modelos. Nessa disciplina será dado enfoque nas
Máquinas de Turing. Com a Máquina de Turing podem-se verificar os
limites da computação e a complexidade computacional de um
sistema. A Máquina de Turing também é um reconhecedor.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Definição formal de linguagens


Reconhecedores
Um dispositivo de reconhecimento lê cadeias de caracteres a
partir do alfabeto da linguagem e indica se a cadeia pertence ou
não à linguagem
Exemplo: parte de análise sintática de um compilador
Geradores
Um dispositivo que gera sentenças de uma linguagem
Pode determinar se a sintaxe de uma sentença em particular
está sintaticamente correta comparando à estrutura do gerador
Conceitos de Linguagens de Programação – Robert W. Sebesta

BNF e gramáticas livres de contexto


Gramáticas livres de contexto
Desenvolvido por Noam Chomsky no meio dos anos 1950
Geradores de linguagem, feitos para descrever a sintaxe de
linguagens naturais
Define uma classe de linguagens chamadas de livres de contexto
Conceitos de Linguagens de Programação – Robert W. Sebesta

BNF e gramáticas livres de contexto


Forma de Backus-Naur (1959)
Inventada por John Backus para descriver Algol 58
BNF é equivalente às gramáticas livres de contexto
Conceitos de Linguagens de Programação – Robert W. Sebesta

Alfabetos, Cadeias e Linguagens


Uma definição informal de uma linguagem poderia ser dada como
sendo um sistema capaz de expressar ideias, fatos, conceitos e que
inclui um conjunto de símbolos e regras para sua manipulação. Ou
ainda, define-se linguagem como o uso da palavra articulada ou
escrita como meio de expressão e comunicação entre pessoas.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Um alfabeto é um conjunto finito de símbolos.


Alfabetos
Um símbolo de um alfabeto é uma entidade abstrata básica,
podendo representar números, letras, desenhos etc, por exemplo:
1, 0, a, b, c.
Um alfabeto é representado por: Σ (lê-se sigma)
Assim são alfabetos:
Σ = {}
Σ = {0, 1}
Σ = {a, b}
Conceitos de Linguagens de Programação – Robert W. Sebesta

Cadeias
Uma cadeia de caracteres sobre um alfabeto á uma sequencia finita
de símbolos (do alfabeto) justapostos.
Seja o alfabeto Σ = {a, b}
Então as cadeias (w) possíveis são:
w = λ representa a cadeia vazia, ou seja, não possui símbolos
w=a
w=b
w = ab
w = ba
w = aab
Conceitos de Linguagens de Programação – Robert W. Sebesta

Linguagens
Uma linguagem é um conjunto de palavras sobre um alfabeto.
Se Σ representa um alfabeto, então Σ* representa o conjunto de todas
as palavras possíveis sobre Σ.
e Σ+ representa o conjunto de todas as palavras excetuando a palavra
vazia.
Assim pode-se dizer que
Σ* = { λ, a, b, ab, ba, aab, abb, aaaa, ....}
Σ+ = Σ* - {λ} = {a, b, ab, ba, aab, abb, aaaa, ....}
Uma linguagem (L) é geralmente definida como um subconjunto de Σ*.
Uma sentença é geralmente definida como uma cadeia pertencente à
linguagem L.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Assim pode-se dizer que


Linguagens
Σ* = { λ, a, b, ab, ba, aab, abb, aaaa, ....}
Σ+ = Σ* - {λ} = {a, b, ab, ba, aab, abb, aaaa, ....}
Uma linguagem (L) é geralmente definida como um subconjunto de
Σ*.
Uma sentença é geralmente definida como uma cadeia pertencente
à linguagem L.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Tamanho ou comprimento
O tamanho ou comprimento de uma cadeia w, representado por |
w|, é o número de símbolos que compõem a cadeia.
Por exemplo:
w = λ |w| = 0
w = a |w| = 1
w = ab |w| = 2
w = abb |w| = 3
w = bbaa |w| = 4
Conceitos de Linguagens de Programação – Robert W. Sebesta

Reverso
O reverso de uma cadeia é obtido pela ordem inversa dos símbolos
da cadeia.
Se w = a1a2...an
Então o reverso, wR = an...a2a1

Por exemplo:
Seja w = ababab então wR = bababa
Seja v = cdcdcdcd então vR = dcdcdcdc
Conceitos de Linguagens de Programação – Robert W. Sebesta

Reverso
A concatenação de duas cadeias w e v é a cadeia obtida pela adição
dos símbolos de v no final da cadeia w. Nenhum símbolo pode ser
mudado de lugar no momento da concatenação.
Se w = a1a2...an e v = b1b2....bm
Então a concatenação, w U v = a1a2...an b1b2....bm

Por exemplo:
Seja w = ababab e v = cdcdcdcd
Então w U v = abababcdcdcdcd
Conceitos de Linguagens de Programação – Robert W. Sebesta

Símbolos não terminais:


Fundamentos de BNF
Em BNF, abstrações são usadas para representar classes de
estruturas sintáticas.
elas agem como variáveis sintáticas (também chamadas de
símbolos não terminais, ou simplesmente não terminais)
Terminais são lexemas ou tokens

Regra de abstração sintática da atribuição Lado direito (RHS)

Lado esquerdo (LHS)


Conceitos de Linguagens de Programação – Robert W. Sebesta

Regra de abstração:
Fundamentos de BNF
Tem um lado esquerdo (LHS), que representa um não terminal
Tem um lado direito (RHS), que representa uma cadeia de não
terminais e terminais
Podem representar mais de uma forma sintática da linguagem

Regra de abstração sintática da atribuição

2
Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramática: coleção de regras


Fundamentos de BNF
Um símbolo inicial é um elemento especial dos não terminais de
uma gramática
Conceitos de Linguagens de Programação – Robert W. Sebesta

Regras de BNF
Uma abstração (ou símbolo não terminal) pode ter mais de um RHS
<stmt> → <single_stmt>
| begin <stmt_list> end
Conceitos de Linguagens de Programação – Robert W. Sebesta

Descrevendo listas
Listas de elementos sintáticos em BNF são descritas pelo uso de
recursão.

<ident_list> → ident | ident, <ident_list>


Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramática e derivação
Uma gramática é um dispositivo de geração para definir linguagens
Uma derivação é uma aplicação de regras repetida, começando
com um símbolo inicial e terminando com uma sentença (todos
símbolos terminais)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Um exemplo de gramática
<program> → <stmts>
<stmts> → <stmt> | <stmt> ; <stmts>
<stmt> → <var> = <expr>
<var> → a | b | c | d
<expr> → <term> + <term> | <term> - <term>
<term> → <var> | const
Conceitos de Linguagens de Programação – Robert W. Sebesta

Um exemplo de derivação
<program> => <stmts> => <stmt>
=> <var> = <expr>
=> a = <expr>
=> a = <term> + <term>
=> a = <var> + <term>
=> a = b + <term>
=> a = b + const
Conceitos de Linguagens de Programação – Robert W. Sebesta

Derivações
Cada cadeia de símbolos em uma derivação é chamada de forma
sentencial
Uma sentença é uma forma sentencial que tem apenas símbolos
terminais
Uma derivação mais à esquerda é uma em que o não terminal mais
à esquerda em cada forma sentencial é expandido
Uma derivação pode ser nem mais à esquerda nem mais à direita
Conceitos de Linguagens de Programação – Robert W. Sebesta

Um exemplo de derivação
Conceitos de Linguagens de Programação – Robert W. Sebesta

Um exemplo de derivação
Conceitos de Linguagens de Programação – Robert W. Sebesta

Árvores de análise sintáticaÁrvore de análise sintática


Representação hierárquica de uma derivação
Cada nó interno de uma árvore de análise sintática é rotulado com um
símbolos não terminal;
Cada folha é rotulada com um símbolo terminal.
Cada subárvore de uma árvore de análise sintática descreve uma
instância de uma abstração da sentença.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Árvore de análise sintática


Conceitos de Linguagens de Programação – Robert W. Sebesta

Ambiguidade em gramáticas
Uma gramática é ambígua se gera uma forma sentencial com duas
ou mais árvores de análise sintática distintas
Determinar se uma gramática é ambígua:
Se a gramática gera uma sentença com mais de uma derivação
mais à esquerda;
Se a gramática gera uma sentença com mais de uma derivação
mais à direita;
Uma gramática de expressão ambígua
Conceitos de Linguagens de Programação – Robert W. Sebesta

(Exemplo
Duas árvores para a expressão A = B + C3.3)
*A
Uma gramática de expressão não
Conceitos de Linguagens de Programação – Robert W. Sebesta

ambígua
Se usarmos a árvore de análise sintática para indicar níveis de
precedência dos operadores, não podemos ter a ambiguidade
Uma gramática de expressão não
Conceitos de Linguagens de Programação – Robert W. Sebesta

Se usarmos a árvore de análise sintática para indicar níveis de


ambígua
precedência dos operadores, não podemos ter a ambiguidade
Uma gramática de expressão não
Conceitos de Linguagens de Programação – Robert W. Sebesta

ambígua
Uma gramática de expressão não
Conceitos de Linguagens de Programação – Robert W. Sebesta

ambígua
Se usarmos a árvore de análise sintática para indicar níveis de
precedência dos operadores, não podemos ter a ambiguidade

<expr> → <expr> - <term> | <term>


<term> → <term> / const| const
Conceitos de Linguagens de Programação – Robert W. Sebesta

Associatividade de operadores
Associatividade de um operador também pode ser indicada por
uma gramática
<expr> -> <expr> + <expr> | const (ambígua)
<expr> -> <expr> + const | const (não ambígua)
Conceitos de Linguagens de Programação – Robert W. Sebesta

BNF estendida
BNF estendida
Partes opcionais são delimitadas por colchetes [ ]
<proc_call> -> ident [(<expr_list>)]
Partes alternativas de RHSs são colocadas entre parênteses e
separadas com barras verticais
<term> → <term> (+|-) const
Repetições (0 ou mais) são colocadas entre chaves { }
<ident> → letter {letter|digit}
Conceitos de Linguagens de Programação – Robert W. Sebesta

BNF
BNF e EBNF
<expr> → <expr> + <term>
| <expr> - <term>
| <term>
<term> → <term> * <factor>
| <term> / <factor>
| <factor>
EBNF
<expr> → <term> {(+ | -) <term>}
<term> → <factor> {(* | /) <factor>}
Conceitos de Linguagens de Programação – Robert W. Sebesta

Recentes variações em EBNF

RHSs alternativas são colocadas em linhas separadas


Uso de dois pontos em vez de =>
Uso de opt para partes opcionais
Uso de oneof para escolhas
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semânticas estáticas

Não têm a ver com o significado


Gramáticas livres de contexto (CFGs) não podem descrever todas as sintaxes
de linguagens de programação
Categorias de construtores que são problemas:
Livres de contexto (por exemplo, tipos de operandos em expressões)
Não livres de contexto (por exemplo, variáveis precisam ser declaradas antes de
serem usadas)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramáticas de atributos

Uma gramática de atributos (AG) é uma extensão de uma gramática livre de


contexto (CFG)
Valores primários de gramáticas de atributos:
Especificação de semânticas estáticas
Compilação (verificação de semânticas estáticas)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramáticas de atributos: definição

Def: Uma gramática de atributo é uma gramática com os seguintes recursos


adicionais:
Associado a cada símbolo X da gramática está um conjunto de atributos A (X)
Associado a cada regra gramatical está um conjunto de funções semânticas e um
conjunto possivelmente vazio de funções de predicado sobre os atributos dos
símbolos na regra gramatical
Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramáticas de atributos: definição

Deixe X0 → X1 ... Xn ser uma regra


Funções semânticas da forma S(X0) = f(A(X1), ... , A(Xn)) definem atributos
sintetizados
Funções da forma I(Xj) = f(A(X0), ... , A(Xn)), for i <= j <= n, definem
atributos herdados
Atributos intrínsecos são atributos sintetizados de nós folha cujos valores são
determinados fora da árvore de análise sintática
Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramáticas de atributos: um exemplo

Sintaxe
<assign> -> <var> = <expr>
<expr> -> <var> + <var> | <var>
<var> A | B | C
actual_type: sintetizado para <var> e <expr>
expected_type: herdado para <expr>
Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramática de atributos

Regra sintática: <expr> → <var>[1] + <var>[2]


Regra semântica:
<expr>.actual_type ← <var>[1].actual_type
Predicado:
<var>[1].actual_type == <var>[2].actual_type
<expr>.expected_type == <expr>.actual_type

Regra sintática : <var> → id


Regra semântica:
<var>.actual_type ← lookup (<var>.string)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramática de atributos

Como são computados os valores dos atributos?


Se todos os atributos forem herdados, a árvore pode ser decorada na ordem
decrescente.
Se todos os atributos forem sintetizados, a árvore pode ser decorada na ordem
crescente.
Em muitos casos, ambos os tipos de atributos são usados, e uma combinação de
crescente e decrescente precisa ser usada.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Gramática de atributos

<expr>.expected_type ← inherited from parent

<var>[1].actual_type ← lookup (A)


<var>[2].actual_type ← lookup (B)
<var>[1].actual_type =? <var>[2].actual_type

<expr>.actual_type ← <var>[1].actual_type
<expr>.actual_type =? <expr>.expected_type
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semânticas

Não há nenhuma notação única amplamente aceitável ou formalismo para


descrever semântica
Diversas necessidades de uma metodologia e notação para a semântica
Programadores precisam saber o que a sentença de uma linguagem significa
Desenvolvedores de compiladores devem saber exatamente o que as construções
da linguagem significam
Geradores de compilação seriam possíveis
Projetistas poderiam detectar ambiguidades e inconsistências
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica operacional

Semântica Operacional
Descrever o significado de uma sentença ou programa pela especificação dos
efeitos de rodá-lo em uma máquina. A mudança no estado de máquina (memória,
registros, etc.) define o significado da sentença
Para usar semântica operacional em uma linguagem de alto nível, é necessária
uma máquina virtual
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica operacional

Um interpretador puro de hardware seria muito caro


Um interpretador puro de software também tem problemas
As características detalhadas de um computador em particular deixaria ações
difíceis de entender
Uma definição semântica seria dependente da máquina
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica operacional

Uma melhor alternativa: uma completa simulação


O processo:
Construir um interpretador (transforma código de origem em código de máquina
de um computador idealizado)
Construir um simulador para o computador idealizado
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semânticas operacionais
Usos de semânticas operacionais:
Manuais de linguagem e livros-texto de programação
Ensino de linguagens de programação
Dois níveis diferentes de uso de uma semântica operacional:
Semântica operacional natural
Semântica operacional estrutural
Avaliação
Boa se usada informalmente
Extremamente complexa se usada formalmente
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semânticas denotacionais

Baseada na teoria de funções recursivas


O método de descrição semântica mais abstrato
Originalmente desenvolvida por Scott e Strachey (1970)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semânticas denotacionais

O processo de construir uma especificação denotacional para uma linguagem:


Define um objeto matemático para cada entidade da linguagem
Define uma função que mapeia as instâncias dessa entidade de linguagem para
instâncias do objeto matemático correspondente
O significado da construção de linguagem é definido apenas pelos valores das
variáveis de programas
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semânticas denotacionais: o estado de um programa

O estado de um programa são os valores atuais de todas as suas variáveis


s = {<i1, v1>, <i2, v2>, …, <in, vn>}
Considere VARMAP uma função que, quando dado um nome de variável e
estado, retorna o atual valor da variável
VARMAP(ij, s) = vj
Conceitos de Linguagens de Programação – Robert W. Sebesta

Números 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 ('1') = 1, …, Mdec ('9') = 9


Mdec (<dec_num> '0') = 10 * Mdec (<dec_num>)
Mdec (<dec_num> '1’) = 10 * Mdec (<dec_num>) + 1

Mdec (<dec_num> '9') = 10 * Mdec (<dec_num>) + 9
Conceitos de Linguagens de Programação – Robert W. Sebesta

Expressões

Expressões formam o conjunto Z ∪ {error}


Assumimos que expressões são números decimais, variáveis ou expressões
binárias tendo um operador aritimético e dois operando, cada um pode ser uma
expressão
Conceitos de Linguagens de Programação – Robert W. Sebesta

Expressões
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)
...
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças de atribuição
Funções de mapeamento mapeiam listas de sentenças e estados para estados ∪
{error}
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,
if ij == x
then vj’ = Me(E, s)
else vj’ = VARMAP(ij, s)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Laços lógicos com pré-teste

Funções de mapeamento mapeiam listas de sentenças e estados para estados U


{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))
Conceitos de Linguagens de Programação – Robert W. Sebesta

Significado do laço

O significado do laço é o valor das variáveis do programa após as sentenças no


laço terem sido executadas o número de vezes necessário, assumindo que não
ocorreram erros
Essencialmente, o laço foi convertido de iteração para recursão, onde o
controle da recursão é definido matematicamente por outras funções recursivas
de mapeamento de estado
A recursão é mais fácil de descrever com rigor matemático do que a iteração
Conceitos de Linguagens de Programação – Robert W. Sebesta

Avaliação de semântica denotacional

Pode ser usada para provar a corretude de programas


Sugere uma maneira rigorosa para pensar nos programas
Pode ser uma ajuda ao projeto de linguagem
Tem sido usada em sistemas de geração de compilador
Devido a sua complexidade, é de pouco uso para usuários de linguagem
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica axiomática

Baseada em lógica matemática


Propósito original: verificação de programas
Axiomas ou regras de inferência são definidas para cada tipo de sentença da
linguagem (a fim de permitir transformações de expressões de lógica em
expressões de lógica mais formais)
As expressões lógicas são chamadas de asserções
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica axiomática

Uma asserção que precede imediatamente uma sentença (uma pré-condição)


descreve as restrições nas variáveis do programa naquele ponto.
Uma asserção imediatamente após uma sentença é uma pós-condição
Uma pré-condição mais fraca é a menos restritiva que garantirá a validade da
pós-condição associada
Conceitos de Linguagens de Programação – Robert W. Sebesta

Forma da semântica axiomática

Forma sentencial: {P} statement {Q}


Um exemplo
a = b + 1 {a > 1}
Uma pré-condição possível: {b > 10}
Pré-condição mais fraca: {b > 0}
Conceitos de Linguagens de Programação – Robert W. Sebesta

Provas de programas

A pós-condição para o programa completo é o resultado desejado


Volte até a primeira sentença do programa. Se a pré-condição na primeira sentença
é a mesma da especificação do programa, ele está correto.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica axiomática: axiomas

Um axioma para sentença de atribuição (x = E): {Qx->E} x = E {Q}


A Regra de Consequência:
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica axiomática: axiomas

Uma regra de inferência para sequências da forma S1; S2


{P1} S1 {P2}
{P2} S2 {P3}
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica axiomática: axiomas

Uma regra de inferência para um laço de repetição


{P} while B do S end {Q}

onde I é a invariante de laço de repetição


Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica axiomática: axiomas

Características da invariante de laço de repetição: I deve satisfazer os seguintes


requisitos:
P => I -- a invariante de repetição precisa ser verdadeira inicialmente
{I} B {I} -- avaliação de B não pode mudar a validade de I
{I and B} S {I} -- I não é mudado pela execução do corpo da repetição
(I and (not B)) => Q -- se I é verdadeiro e B é falso, Q é incluído
A repetição termina -- pode ser difícil de provar
Conceitos de Linguagens de Programação – Robert W. Sebesta

Invariante de repetição

A invariante de repetição é uma versão enfraquecida da pós-condição de


repetição e é também uma pré-condição.
I deve ser fraco o suficiente para estar preenchido antes do início do ciclo, mas
quando for combinado com a condição de saída do laço deve ser
suficientemente forte para forçar a verdade da pós-condição
Conceitos de Linguagens de Programação – Robert W. Sebesta

Avaliação da semântica axiomática

Desenvolver axiomas ou regras de inferência para todas as sentenças de uma


linguagem é difícil
É uma boa ferramenta para provas de corretude, mas não é útil para usuários de
linguagens e escritores de compiladores
Conceitos de Linguagens de Programação – Robert W. Sebesta

Semântica denotacional × semântica operacional

Na semântica operacional, as mudanças de estado são definidas por algoritmos


codificados
Na semântica denotacional, as mudanças de estado são definidas por funções
matemáticas rigorosas
Conceitos de Linguagens de Programação – Robert W. Sebesta

Resumo

BNF e gramáticas livres de contexto são metalinguagens equivalentes


Bastante adequadas para a tarefa de descrever a sintaxe de linguagens de
programação
Uma gramática de atributos e um formalismo descritivo que pode descrever
tanto a sintaxe quanto a semântica estática de uma linguagem
Três métodos principais de descrição semântica
Operacional, denotacional e axiomática

Você também pode gostar