Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
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
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
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
2
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.
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
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
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
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
Semânticas estáticas
Gramáticas de atributos
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
Gramática de atributos
Gramática de atributos
<expr>.actual_type ← <var>[1].actual_type
<expr>.actual_type =? <expr>.expected_type
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semânticas
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
Semântica operacional
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
Semânticas denotacionais
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')
Expressões
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
Significado do laço
Semântica axiomática
Semântica axiomática
Provas de programas
Invariante de repetição
Resumo