Sie sind auf Seite 1von 13

Sintaxe e Semântica

Linguagens de Programacão I
mleal@inf.puc-rio.br 1

Fases da Compilação
programa fonte
scanner
(análise léxica)
tokens
parser
(análise sintática)
parse tree
análise semântica e
árvore anotada ou outra geração de código intermediário
forma intermediária otimização de código
(independente da máquina)
código intermediário
geração de código objeto
código objeto
otimização de código
código objeto (dependente da máquina)
otimizado

Linguagens de Programacão I
mleal@inf.puc-rio.br 2

1
Sintaxe
Sintaxe é um conjunto de regras que define a forma de uma
linguagem, estabelecendo como são compostas as suas
estruturas básicas (palavras).
A sintaxe de uma LP é formada por regras léxicas e regras
sintáticas:
As regras lexicas descrevem as combinações válidas de
caracteres que formam os tokens da LP (palavras reservadas,
identificadores, operadores, etc).
As regras sintáticas descrevem como os tokens podem ser
combinados para formar instruções válidas (comandos,
expressões, subrotinas, etc).

Linguagens de Programacão I
mleal@inf.puc-rio.br 3

Sintaxe - Diagramas Sintáticos


Um método simples de
descrever a sintaxe de
uma LP.
Permite visualizar
facilmente suas
construções sintáticas.
Foi usado inicialmente
na definição da
linguagem Pascal.

Linguagens de Programacão I
mleal@inf.puc-rio.br 4

2
Sintaxe - BNF
A sintaxe de uma LP usualmento é definida através de um conjunto de
regras representadas através de uma gramática livre de contexto. A
notação utilizada é conhecida como Backus-
Backus-Naur Form (BNF) .
Esta notação utiliza dois conjuntos de símbolos:
terminais representam os símbolos da linguagem que está sendo definida,
por exemplo: while,
while, for,
for, =, [.
não–
não–terminias são abstrações utilizadas para representar as construções
da linguagem, e são apresentadas sempre entre <>, como por exemplo:
exemplo:
<expressão>, <declaração>, etc.

São utilizados ainda dois meta-


meta-símbolos:
::= significa “é definido como."
| significa “ou."

Linguagens de Programacão I
mleal@inf.puc-rio.br 5

Sintaxe - BNF
Regras léxicas:
<digit>::= 0 | 1 | ... | 9

<number>::= <digit> | <digit><number> | -<number>

<identifier>::= <letter> | <identifier><letter> |


<identifier><digit>

<letter>::= a | b | c | ... | z

<operator>::= + | - | * | /

<relation>::= <= | >= | == | > | < | !=

Linguagens de Programacão I
mleal@inf.puc-rio.br 6

3
Sintaxe - BNF
Regras sintáticas:
<program>::= program <identifier> ; <block>

<block>::= <declaration seq> begin <command seq> end.


<declaration seq>::= ε| <declaration><declaration seq>
<declaration> ::= var <variable list> : <type>;
<type>;
<type>::= boolean | integer | real | string
<command seq>::= <command> | <command><command seq>
<commmand>::= <variable>=<expression> |
if <boolean expr> then <command seq> end |
` while <boolean expr> do <command seq> end |
...

Linguagens de Programacão I
mleal@inf.puc-rio.br 7

Sintaxe - BNF
As regras léxicas de uma LP são verificadas
através de um scanner, que a partir do
programa fonte gera uma lista de palavras
(tokens) válidos.
As regras sintáticas são verificadas através
de um parser, que tenta validar a estrutura do
programa através da derivação de uma
árvore (parse tree) que obedece a descrição
(BNF) da LP.

Linguagens de Programacão I
mleal@inf.puc-rio.br 8

4
Sintaxe - Exemplo
Como derivar a parse tree para a expressão a*x+b :
Î <expression>::= indentifier | number | -<expression> |
<expression> <operator> <expression>

<expression>::= <expression> <operator> <expression>


<expression>::= <expression> <operator> indentifier
<expression>::= <expression> + indentifier
<expression>::= <expression> <operator> <expression> + indentifier
<expression>::= <expression> <operator> indentifier + indentifier
<expression>::= <expression> * indentifier + indentifier
<expression>::= indentifier(a) * indentifier(x) + indentifier(b)

Linguagens de Programacão I
mleal@inf.puc-rio.br 9

Sintaxe - Exemplo
Parse Tree
expression

expression operator expression

+
identifier
(b)

expression operator expression

identifier * identifier
(a) (x)

Linguagens de Programacão I
mleal@inf.puc-rio.br 10

5
Sintaxe
Uma parse tree contém informações
importantes para validar a estrutura sintática
do programa, mas que não são efetivamente
necessárias para a sua representação.
Uma forma mais simples de representar a
estrutura sintática de um programa utiliza
árvores sintáticas (abstract syntax tree ou
simplesmente syntax tree).

Linguagens de Programacão I
mleal@inf.puc-rio.br 11

Sintaxe - Exemplo
Syntax Tree
+

* identifier
(b)

identifier identifier
(a) (x)

Linguagens de Programacão I
mleal@inf.puc-rio.br 12

6
Sintaxe - EBNF
Uma variação bastante utilizada da notação BNF é
conhecida como Extended BNF (EBNF), que
incorpora alguns símbolos usados na definição de
expressões regulares como * (0 ou mais) e + (1 ou
mais).
Î <programa>:: = {<comandos>*}
A partir da descrição sintática de uma LP em BNF ou
EBNF pode-
pode-se gerar automaticamente parsers e
scanners usando aplicativos como yacc, lex, flex e
bison.

Linguagens de Programacão I
mleal@inf.puc-rio.br 13

Semântica
A semântica descreve o significado de construções
sintáticas válidas.
Não existe uma notação padrão equivalente a BNF
para a descrição da semântica de LPs.
Diferentes formalismos foram desenvolvidos para
atender a diferentes objetivos.
Geralmente uma LP é descrita informalmente,
utilizando-
utilizando-se linguagem natural (inglês, português,
etc).
Linguagens de Programacão I
mleal@inf.puc-rio.br 14

7
Semânticas Formais
Semânticas fomais são usadas principalmente para provar
propriedades de LPs, construções semânticas e algoritmos.
Semântica Operacional - Tem como objetivo descrever como uma
computação é processada. Geralmente faz uso de uma máquina
abstrata e de regras que descrevem as mudanças de estado
associadas a cada comando.
Semântica Denotacional - Descreve um programa através de
objetos matemáticos como conjuntos, funções, valores e as
relações entre estes.
Semântica Axiomática – Baseada em métodos de dedução lógica,
descreve uma linguagem através de axiomas. Usualmente é
utilizada para provar propriedades de algoritmos.

Linguagens de Programacão I
mleal@inf.puc-rio.br 15

Structural Operational Semantics


(SOS)
Exemplo de semântica formal que permite provar
propriedades de programas ou de estruturas de uma
LP.
A semântica operacional tradicional especifica uma
LP em termos da execução de um programa em uma
máquina abstrata.
Em SOS o processamento da máquina abstrata
segue regras de dedução com a forma:
premissa1 premissa2 ... premissan
condição
conclusão

Linguagens de Programacão I
mleal@inf.puc-rio.br 16

8
SOS - Exemplo
n : iexp n ∈ Num
id : iexp id ∈ Id
ie : iexp
Î Sintaxe − ie : iexp
ie1 : iexp ie2 : iexp
iop ∈ Iop
ie1 iop ie2 : iexp
n ∈ N = conjunto dos números inteiros
ie1 : iexp ie2 : iexp
b ∈ {true, false} rop ∈ Rop
ie1 rop ie2 : bexp
id ∈ Id = conjunto dos identificadores inteiros
be1 : bexp be2 : bexp
bid ∈ Bid = conjunto dos identificadores boolenanos rop ∈ Rop
be1 rop be2 : bexp
iop ∈ {+, -, *, /}
ie : iexp
rop ∈ {<, <=, =, >, >=, =!} id ∈ Id
id := ie : cmd
ie ∈ Iexp = conjunto das expressões inteiras c1 : cmd c2 : cmd
be ∈ Bexp = conjunto das expressões booleanas c1 ; c 2 : cmd
cmd ∈ Cmd = conjunto dos comandos be : bexp c1 : cmd c2 : cmd
if be then c1 else ce2 : cmd
be : bexp c : cmd
while be do c : cmd

Linguagens de Programacão I
mleal@inf.puc-rio.br 17

SOS - Exemplo
Î Semântica das expressões
A memória da máquina abstrata é representada por uma
estrutura de dados (sto
(sto).
).
Os diferentes estados são representados entre < > e as
transições de estado são indicadas por
A máquina abstrata possui apenas três funções:
applySto(sto,x) recupera o valor da variável x;
updateSto(sto,x, n) atualiza o valor da variável x (x=n);
compute (op, num1, num2) calcula o valor da expressão (num1
op num2)

Linguagens de Programacão I
mleal@inf.puc-rio.br 18

9
SOS - Exemplo
Î Usando estas regras podemos
< ie1 , sto >→< ie1 ' , sto >
deduzir a semântica da expressão
(1)
< ie1 iop ie2 , sto >→< ie1 ' iop ie2 , sto >
x + y + 6 onde y = 25 e x = 17
< ie2 , sto >→< ie2 ' , sto >
(2)
< n iop ie2 , sto >→< n iop ie2 ' , sto >
(a) < y , sto >→< 25, sto > já que usando (4) temos applySto( sto, y ) = 25
(3) < n1 iop n2 , sto >→< compute(iop, n1 , n2 ), sto >
(b) < y + 6, sto >→< 25 + 6, sto > usando (1)
(4) < id , sto >→< applySto( sto, id ), sto >
(c) < 25 + 6, sto >→< 31, sto > já que usando (3) temos compute(+,25,6) = 31
(d ) < x, sto >→< 17, sto > já que usando (4) temos applySto( sto, x) = 17
(e) < x + y + 6, sto >→< 17 + 31, sto > usando (1)
(f) < 17 + 31, sto >→< 48, sto > já que usando (3) temos compute(+,17,31) = 48
( g ) < x + y + 6, sto >→< 48, sto >

Linguagens de Programacão I
mleal@inf.puc-rio.br 19

SOS - Exemplo
Î Semântica dos comandos
Para definir a semântica de comandos expandimos a
máquina abstrata utilizando duas novas estruturas (in
(in
e out)
out) para representar a entrada e a saída de
dados.
Os estados da máquina abstrata correspondem
portanto a tuplas com a forma <in, out, sto>.

Linguagens de Programacão I
mleal@inf.puc-rio.br 20

10
Linguagens de Programacão I
mleal@inf.puc-rio.br 21

Gramática de Atributos
Uma gramática de atributos pode ser informalmente definida
como uma gramática livre de contexto estendida através do uso
de atributos, condições e regras de avaliação.
Associa atributos aos diferentes símbolos de uma gramática a
partir das produções.
Permite definir o significado de produções e impor regras
semânticas.
Introduz sensibilidade ao contexto, e pode ser usada, por
exemplo, para checar o tipo das variáveis e validar expressões.
Usualmente é utilizada conjuntamente com rotinas de ação
(action routines).
Linguagens de Programacão I
mleal@inf.puc-rio.br 22

11
Gramática de Atributos

(1+3)*2
Linguagens de Programacão I
mleal@inf.puc-rio.br 23

Gramática de Atributos
<delcaration>::= var <identifier> <type> ;
if <identifier> not in <var-
<var-list> then
<var-list>  (<identifier>, <type>)
<var-
else error(“
error(“duplicate variable”
variable”)

<int expression>::= <identifier1> <operator> <number>


if getType(<varlist>, <identifier1>) ≠ integer then
error(“
error(“wrong type”
type”)

Linguagens de Programacão I
mleal@inf.puc-rio.br 24

12
Rotinas de Ações
Definem rotinas que são invocadas pelo compilador
sempre que uma produção é prevista.
Muitos analisadores semânticos são implementados
automaticamente através destas construções.
<declaration)::= var <identifier>: <type>;
{declare_name(identifier, type)}
...
<expr1>::= <expr2> <operator> <expr3>
{check_types(expr1, expr2, expr3);
expr1.val = calc(operator, expr2, expr3}

Linguagens de Programacão I
mleal@inf.puc-rio.br 25

Semântica Estática X Dinâmica


As regras semânticas podem ser classificadas em estáticas ou
dinâmicas dependendo do momento em que são checadas
(compilação ou em tempo de execução).
Exemplos de regras estáticas:
Todo identificador deve ser declarado antes de ser usado;
Os parâmetros utilizados na chamada de uma função têm o tipo
correto.
Exemplos de regras dinâmicas:
O índice de um array está dentro do limite correto;
Variáveis nunca são utilizadas antes de serem inicializadas;
Divisão por zero.
Linguagens de Programacão I
mleal@inf.puc-rio.br 26

13

Das könnte Ihnen auch gefallen