Você está na página 1de 33

Universidade Federal Rural de Pernambuco

Departamento de Estatística e Informática

Sintaxe e Semântica

Prof.: Gláucya Carreiro Boechat


glaucyacboechat@gmail.com
Sintaxe e Semântica
 Provêm a definição da linguagem
 Sintaxe
 A forma ou estrutura das expressões, das instruções e das
unidades de programas
 Estrutura formada de acordo com Regras Gramaticais da
Linguagem. (Estruturas Sintáticas)
 Exemplo (condição diferente)
 Pascal ( <> ) ; C = ( != ) ; Ada ( /= )

 Semântica
 O significado das expressões, das instruções e das unidades
de programas
 Identificação das seqüências de símbolos validos que constituem
estruturas sintáticas

Paradigmas de Programação - 2
prof Gláucya Carreiro Boechat
Sintaxe e Semântica

 Exemplo: comando if na linguagem C


 Sintaxe
 if (<expr>) <instrução>

 Semântica
 Se o valor da expressão for verdadeiro, a instrução será
executada

Paradigmas de Programação - 3
prof Gláucya Carreiro Boechat
Descrevendo a sintaxe: terminologia
 Uma linguagem é uma conjunto de sentenças
 Uma sentença é uma cadeia de tokens
 Um lexema é a unidade sintática de mais baixo nível
de uma linguagem
 Exemplos:
 *, sum, begin, if

 Um token é uma categoria dos lexemas


 Seqüência de caracteres sobre um alfabeto
 Exemplo:
 identificador, op_mult

Paradigmas de Programação - 4
prof Gláucya Carreiro Boechat
Descrevendo a sintaxe: terminologia
 Exemplo (C)
 Resultado = 45 + Cont * 5;

Lexema Token
resultado identificador
= sinal_igual
45 int_literal
+ op_soma
Cont Identificador
* op_mult
5 int_literal
; ponto_e_virgula

Paradigmas de Programação - 5
prof Gláucya Carreiro Boechat
Definição formal de linguagens
 Reconhecedores de linguagens
 Dispositivo que recebe um token como entrada e verifica se
o mesmo pertence a linguagem
 Exemplo:
 Análise Sintática (parte de um compilador)

 Geradores de linguagens
 Dispositivo que gera sentenças da linguagem
 Determinando se a sintaxe de uma sentença em particular
está correta
 Através de comparações com a estrutura da linguagem gerada
 If <condição = true> then <instrução>

Paradigmas de Programação - 6
prof Gláucya Carreiro Boechat
Métodos formais para descrever a sintaxe

 Forma de Backus-Naur (BNF)


 Método mais usado para descrever a sintaxe das
linguagens de programação
 Uma metalinguagem é usada para descrever outras
linguagens

 Extended Backus Naur Form (EBNF)


 Por apresentar algumas inconveniências a BNF foi
estendida
 Aumenta Legibilidade e Capacidade escrita da BNF

Paradigmas de Programação - 7
prof Gláucya Carreiro Boechat
Gramáticas Livres de Contexto

 Gramáticas Livres de Contexto


 Desenvolvida por Noam Chomsky nos meados da
década de 1950
 Define uma classe de linguagens chamadas de
linguagens livres de contexto
 Objetivo
 Descrever a sintaxe das linguagens naturais
 São gramáticas onde as regras de produção são
definidas de forma mais livre

Paradigmas de Programação - 8
prof Gláucya Carreiro Boechat
Backus-Naur Form (BNF)

 Backus-Naur Form (1959)


 Inventada por John Backus para descrever o
Algol 58 (International Algorithmic Language)
 BNF é equivalente a gramáticas livre de contexto
 BNF é uma metalinguagem usada para descrever
outras linguagens
 Em BNF, abstrações são usadas para
representar classes de estruturas sintáticas
 Agem como variáveis sintáticas (também chamadas de
símbolos não-terminais)

Paradigmas de Programação - 9
prof Gláucya Carreiro Boechat
BNF - Fundamentos
 Terminais: lexemas e tokens
 Não-terminais: BNF abstrações
 Atual como variáveis
 Gramática: uma coleção de regras
 Exemplos de regras BNF:
 Atribuição em C(Representada pela abstração)
 <Atribuição>  -->  <var> = <expressão> 

 <ident_list> -> identifier | identifier , <ident_list>


 <if_stmt> -> if <expr_logica> then <stmt>
 <if_stmt> -> if <expr_logica> then <stmt> else <stmt>

Paradigmas de Programação - 10
prof Gláucya Carreiro Boechat
Regras BNF
 Uma regra possui
 um lado esquerdo (LHS - Left Hand Side)
 consiste de símbolos não-terminais
 um lado direito (RHS - Right Hand Side),
 consiste de símbolos terminais e não-terminais

 Uma gramática é um conjunto não vazio de regras

 Uma abstração (ou símbolo não-terminal) pode ter


mais de um RHS
<stmt> -> <single_stmt>
| begin <stmt_list> end

Paradigmas de Programação - 11
prof Gláucya Carreiro Boechat
Listas Sintáticas

 Listas sintáticas são descritas usando recursão


<ident_list> -> ident
| ident , <ident_list>

 Derivação
 Aplicação de regras repetidas vezes,
 começando com um símbolo inicial
 finalizando com uma sentença (símbolos terminais)

Paradigmas de Programação - 12
prof Gláucya Carreiro Boechat
Uma gramática para uma pequena
linguagem
<program> -> begin <stmts> end

<stmts> -> <stmt>


| <stmt> ; <stmts>

<stmt> -> <var> = <expr>

<var> -> a | b | c | d

<expr> -> <term> + <term>


| <term> - <term>

<term> -> <var> | const

Paradigmas de Programação - 13
prof Gláucya Carreiro Boechat
Exemplo gramática para uma pequena linguagem

<program>
<program> => <stmts>
=> <stmt> <stmts>

=> <var> = <expr>


<stmt>
=> a = <expr>
=> a = <term> + <term>
<var> = <expr>
=> a = <var> + <term>
=> a = b + <term> a <term> + <term>
=> a = b + const
<var> const

Paradigmas de Programação - 14
prof Gláucya Carreiro Boechat
Uma gramática para instruções de
atribuição simples
<assign> -> <id> = <expr>
<id> -> A | B | C
<expr> -> <id> + <expr>
| <id> * <expr>
| ( <expr> )
| <id>

Paradigmas de Programação - 15
prof Gláucya Carreiro Boechat
Árvore de Análise (Parse Tree)

Paradigmas de Programação - 16
prof Gláucya Carreiro Boechat
Ambigüidade em gramáticas

 Uma gramática é ambígua se e somente se


ela gera uma sentença que possui duas ou
mais árvores de análise distintas

Paradigmas de Programação - 17
prof Gláucya Carreiro Boechat
Uma gramática ambígua para
instruções de atribuição simples
<assign> -> <id> = <expr>
<expr> -> <expr> + <expr>
| <expr> * <expr>
| ( <expr> )
| <id>
<id> -> A | B | C

Paradigmas de Programação - 18
prof Gláucya Carreiro Boechat
Duas árvores de análise para a
mesma sentença
 A=B+C*A

Paradigmas de Programação - 19
prof Gláucya Carreiro Boechat
Uma gramática não-ambígua para expressões

 indicar os níveis de precedência de operadores,


não teremos ambigüidade

<assign> -> <id> = <expr>


<expr> -> <expr> + <term>
| <term>
<term> -> < term > * <factor>
| <factor>
<factor> -> ( <expr> )
| <id>
<id> -> A | B | C

Paradigmas de Programação - 20
prof Gláucya Carreiro Boechat
A árvore de análise única para a expressão

A =B+C*A

Paradigmas de Programação - 21
prof Gláucya Carreiro Boechat
Exemplo – Sintaxe para expressões
 Calculadora simples
Com -> Expr
Expr -> Num
| Expr + Num
| Expr - Num
| Expr * Num
| Expr / Num
Num -> Dig
|Num Dig
Dig -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Paradigmas de Programação - 22
prof Gláucya Carreiro Boechat
Exemplo2 – Priorização em linguagens de
Programação
 1ª Prioridade : *, /, and, ...
 2ª Prioridade : +, -, or, ...
 3ª Prioridade : =, >, <, ...

Expr -> tExpr


| tExpr = tExpr
| tExpr < tExpr
| tExpr > tExpr

Paradigmas de Programação - 23
prof Gláucya Carreiro Boechat
Exemplo2 – Priorização em linguagens de
Programação
tExpr -> sExpr
| tExpr + sExpr
| tExpr - sExpr
| tExpr or sExpr

sExpr -> pExpr


| sExpr * pExpr
| sExpr / pExpr
| sExpr and pExpr

pExpr -> Lit


| Var
| (Exp)

Paradigmas de Programação - 24
prof Gláucya Carreiro Boechat
Associatividade de Operadores
 Associatividade de operadores podem ser
indicados pela gramática

 Exemplo
 A = B + C + A (adição é associativa)
 A = B / C / A   (divisão não é associativa)

Paradigmas de Programação - 25
prof Gláucya Carreiro Boechat
Associatividade de Operadores
 Exemplo
 <expr> -> <expr> + <expr> | const (ambígua)
 <expr> -> <expr> + const | const (não-ambígua)

Paradigmas de Programação - 26
prof Gláucya Carreiro Boechat
Árvore de análise associatividade da adição
 A=B+C+A

Paradigmas de Programação - 27
prof Gláucya Carreiro Boechat
BNF estendida
 Adição de novas extensões

 Uso de Colchetes [ ] no RHS


 Partes opcionais
 <proc_call> -> ident [ ( <expr_list> ) ]
 <seleção> -> if ( <expressão> ) <instrução> [else <instrução>]; 

Paradigmas de Programação - 28
prof Gláucya Carreiro Boechat
BNF estendida
 Uso de parenteses ( ) no RHS
 Opções de múltipla escolha, são colocadas dentro de
parênteses e separadas por barras verticais
 <term> -> <term> ( + | - ) const
 <for_stmt> -> for <var> = <expr> ( to | downto ) <expr> do <stmt>

 Uso de chaves { } no RHS


 Indica zero ou repetição indefinida
 <ident> -> letter { letter | digit }

 <lista_ident> -> <identificador> { , <identificador> } 

Paradigmas de Programação - 29
prof Gláucya Carreiro Boechat
BNF e EBNF
 BNF  EBNF
<expr> -> <expr> + <term> <expr> -> <term> { (+ | -) <term> }
| <expr> - <term>
| <term> <term> -> <factor> { (* | / ) <factor> }
<term> -> <term> * <factor>
| <term> / <factor> <factor> -> <exp> { ** <exp> }
| <factor>
<factor> -> <exp> ** <factor> <exp> -> ( <expr> )
| <exp> | id
<exp> -> ( <expr> )
| id

Paradigmas de Programação - 30
prof Gláucya Carreiro Boechat
Exercícios
 Traduzir as seguintes seqüências
 5–6–7
 5*6*7
 5*6–7
 5–3*2–7
 A and B = C
 A or B = C

Paradigmas de Programação - 31
prof Gláucya Carreiro Boechat
Exercícios
 Modificar a sintaxe previamente
estabelecida para as expressões sejam
avaliadas tendo as comparações com
maior precedência (Ex.: A and (B=C)).
Refaça a tradução das expressões
considerando a nova sintaxe estabelecida.

Paradigmas de Programação - 32
prof Gláucya Carreiro Boechat
Exercícios
 Adicionar os operadores unários ‘++’, ‘--’ e
‘not’. Os operadores ‘++’ e ‘--’ devem ter a
mesma prioridade dos seus correspondentes
binários, e devem ser permitidos como ‘pré’
ou ‘pós’. O operador ‘not’ deve possuir uma
prioridade mais alta do que todos os
operadores já definidos.
 Represente as expressões ‘--a+b’, ‘a+b--’, ‘++a*b’
e ‘not A and B’

Paradigmas de Programação - 33
prof Gláucya Carreiro Boechat

Você também pode gostar