Você está na página 1de 38

COMPILADO

RES
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br

CONCEITOS
BSICOS
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br

Linguagem (Definio)
Um conjunto (possivelmente infinito) de
strings
Vrios formalismos para definir tal conjunto
Expresses Regulares (ER)
Gramticas Livre de Contexto (BNF)

Linguagem (Definio)
Um conjunto (possivelmente infinito) de
strings
Vrios formalismos para definir tal conjunto
Expresses Regulares (ER)
Gramticas Livre de Contexto (BNF)

Simplicidade vs.
expressividade

Especificao de uma
Linguagem de Programao
Nosso objetivo principal na disciplina;
Descrio da sintaxe:
especificao dos tokens (ER)
especificao da gramtica (BNF)

Descrio da semntica:
normalmente informal
formal: semntica operacional,
denotacional, de aes, etc.

Expresso Regular
Linguagem de especificao de tokens
Exemplo: nmeros e identificadores de uma
linguagem

Tokens:
x2 := 10.28 + y ;

Identificadores :

letter (letter |
digit) *

Gramtica Livre de
Contexto
Um conjunto de smbolos terminais
Um conjunto de smbolos noterminais
Um no terminal designado inicial
Um conjunto de produes
cada produo consiste de um noterminal, uma seta, e uma seqncia
de smbolos terminais e no terminais

Exemplo
list g list + digit
list g list - digit
list g digit
digit g 0
digit g 1

digit g 9

Exemplo modificado

list g list + digit | list - digit | digit


digit g 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Deriva-se strings de uma


gramtica G a partir do seu
smbolo inicial e repetidamente
substituindo no-terminais
pelo corpo de uma produo

Deriva-se
strings
de uma
A linguagem
(conjunto
de
gramtica
a partir do por
seu G
strings) reconhecida
smbolo
inicial
repetidamente
chama-se
L(G).e Inclui
todas as
substituindo
strings que no-terminais
possvel se obter
pelo
corpo
uma produo
atravs
dede
derivaes
em G.

Linguagem reconhecida por


G
Para a gramtica G abaixo:
list g list + digit | list - digit | digit
digit g 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Quais so as strings vlidas?

Linguagem reconhecida por


G
Para a gramtica G abaixo:
list g list + digit | list - digit | digit
digit g 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

L(G) = {0,1,...,0+1, 0+2, ...}

Exemplo
call g id ( X )
X g Y|
Y g Y , id | id

O smbolo ou representam
string vazia

Exerccio 1
Proponha definio alternativa para
evitar o uso do smbolo
call g id ( X )
X g Y|
Y g Y , id | id

Resposta
Proponha definio alternativa para
evitar o uso do smbolo
call g id () | id (Y)
Y g Y , id | id

Exerccio 2
Defina uma gramtica para a linguagem de
parnteses. (), ()(), (()()), ()(()), etc.

Considere o smbolo no terminal A como as


expresses vlidas, ou seja, (), ()(), (()()), ()(()),
(A), (A)(A), ((A)(A)), (A)((A)), so strings vlidas.

Resposta
Defina uma gramtica para a
linguagem de parnteses. (), ()(), (()
()), ()(()), etc.
A g ( A ) | A A | ()

Ag(A)|AA|

A linguagem desta
gramtica inclui a
string vazia.

Exemplo
// s a produo inicial
s : atribuicao
c: e f ;
e : e '*' e | e '/' e | e '+' e | e '-' e | '(' e ')' | INT |
atribuicao
f : '; | ';' c
INT :
DIGIT+
DIGIT : [0-9]
VARIAVEL : [a-z] | [A-Z];
ID :
VARIAVEL (VARIAVEL | DIGIT)*
atribuicao : ID ':=' c

rvores Sintticas (Parse


Tree)
Parsing o processo de gerar um parse tree a
partir de uma string
Parse tree descreve a derivao da string de
fonte
entrada

Lexer
tokens

Parser
Parse trees

Symbol Table

Exemplo
list
list

rvore
sinttica
para 9 5
+2

digit
digit

list

digit

list g list + digit | list - digit | digit


digit g 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Parse Trees: Definio

A raiz o smbolo inicial


Cada folha um terminal ou ()
Cada n interior um no-terminal
Se A um no-terminal e X1, X2,...,Xn
so labels de filhos deste n, deve
haver uma produo A g X1 X2 ... Xn

Ambiguidade
Uma gramtica ambgua pode gerar
mais de uma parse tree para a
mesma string

A interpretao pode ser


diferente de acordo com a
estrutura derivada!

Ambiguidade - Exemplo
string g string + string
| string - string
|0|1|2|3|4|5|6|7|8|9

Duas parse trees para a entrada 9 5 + 2:


string
strin
+ string
g
string
- string
2
9

strin
g
string 9

string
5

string
+ string
2

Ambiguidade
Solues
Reescrever gramtica
Usar gramticas ambguas com
informaes adicionais sobre como
resolver ambigidades

Associatividade de
Operadores
Na maioria das linguagens de
programao +, , * e / associam
esquerda
Exemplo: 9 5 + 2 equivale a (9-5)+2

Atribuio e exponenciao associam


direita
Exemplo: a = b = c equivale a
= c)

a = (b

Exemplo: associatividade
direita
Note posio da
recurso
right g letter = right | letter
letter g a | b | | z

Exerccio 3
Modifique a gramtica abaixo para
que expresses aritmticas associem
a esquerda
string g string + string
| string - string
|0|1|2|3|4|5|6|7|8|9

Dica: inclua uma nova varivel

Resposta
Modifique a gramtica abaixo para
que expresses aritmticas associem
a esquerda
string g string + string
| string - string
|0|1|2|3|4|5|6|7|8|9

string g string + val | string val | val


val g 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Precedncia de operadores
Multiplicao e diviso tem
precedncia sobre adio e
subtrao
Exemplo: 9 + 5 * 2 equivale a 9 + (5 *
2)

Precedncia de operadores
expr g expr + term | expr term | term
term g term * factor | term / factor | factor
factor g digit | ( expr )
digit g 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
stmt g if (expr ) then stmt
| for ( optexpr ; optexpr ; optexpr )
stmt
| atrib
optexpr g expr |
atrib g id := expr ;

No-terminais adicionais so
usados para definir os nveis

Top-down ou bottom-up
parsers
Refere-se ordem em que os ns da
parse tree so criados.
Top-down: mais fceis de escrever
mo
Bottom-up: suportam uma classe
maior de gramticas e de esquemas
de traduo;
mais usados por geradores de parsers.

Construindo um parser topdown


Constri-se a rvore de derivao,
lendo a sentena de esquerda para a
direita, e substituindo sempre o noterminal mais esquerda.

Construindo um parser topdown


Para algumas gramticas basta uma
nica travessia da esquerda para a
direita da string de entrada
Exemplo:
for ( ; expr ; expr ) other

Token corrente chamado de lookahead


symbol!

Backtracking
A escolha de uma produo pode
exigir tentativa-e-erro
Backtracking a ao de tentar uma
nova escolha

O parsing sem backtracking


chamado de predictive-parsing.

Exemplo: Backtracking
Backtracking necessrio ao se perceber que no
possvel fazer parsing de 9 + 5 * 2 a partir de stmt
gexpr gexpr
termg term | expr + term | expr term
term g term * factor | term / factor |
factor
factor g digit | ( expr )
digit g 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
stmt g if (expr ) stmt
| for ( optexpr ; optexpr ;
optexpr ) stmt
| expr
optexpr g expr |

Exemplo: Backtracking

DVIDAS