Você está na página 1de 6

Compilao tpica com FLEX

Edio do texto de especificao


No arquivo minhas_regras.l
3 partes:

Compiladores
Anlise sinttica (1)
Noes sobre
Gramticas Livres de contexto

Declaraes
Regras (ERs -> Ao)
Procedimentos anexos.

flex minha_regras.l
minha_regras.l
O programa C resultado se encontra em lex.yy.c
Contm a rotina yylex() que efetua a anlise lexical.

gcc o analisador lex.yy.c


lex.yy.c lfl
Compila e amarra o analisador com a biblioteca libfl.a
O executvel se encontra em analisador

Especificao (F)lex
Definies
%%
Regras
%%
Subrotinas opcionais(cdigo C)

Lex define vrias variveis globais:


yytext e yyleng
Lexema corrente e seu tamanho

yylval
De tipo YYSTYPE, a partir de #defines
Depende do parser, voc escolhe

Escolha das regras


Quando h ambigidade entre regras, o LEX
escolhe a que prov o lexema maior.
A ao default copiar para a sada o texto de
entrada.
A regra r1/r2 reconhece r1 somente se r2
aparece aps (aceitao condicional).
Quando se encontra o lexema r1r2, o r2 descartado
e colocado de volta no buffer de entrada. r1
reconhecido.

A seo das regras


Consiste de linhas do tipo:
ER { ao }
A ER especificada conforma a sintaxe de LEX,
ou pode ser uma varivel.
{ } a ao nula no faz nada.
Retorna para o yylex() que analisar o prximo token!
Usado para detectar os brancos.

{ printf( isso a\n);} a ao que consiste


em imprimir uma mensagem na tela.

Plano da aula
Introduo: porque a anlise sinttica?
Noes sobre Gramticas Livres de
Contexto:
Definio
Propriedades
Derivaes
rvore de derivao

Transformaes de GLC
Eliminao de
Eliminao da recursividade esquerda
Fatorao

Anlise Sinttica
programa
fonte

token

Analisador
Analisador
yylex()
Sinttico
Lxico

Erros
Lxicos

Os erros tpicos so sintticos

rvore de
derivao

Ripley e Druseikis [78]


Prximos
Estgios

Erros
Sintticos

Erros em uma amostra de


programas Pascal de
estudantes
60% semntica e
sintaticamente corretos
Erros:
60% erros de pontuao
(uso incorreto do ;)
20% operadores
15% palavras-chave
5% outros

1. program prmax(input, output) ;


2. var
3.
x, y : integer;
4. function max (i: integer, j: integer) :
integer
5. { return maximum of integers i and j }
6. begin
7.
if i > j then max = i;
8.
else max := j
9. end;
10. begin
11. readln (x, y);
12. writeln (max (x, y))
13. end.

Usando Gramticas

Notao e Definies

Muitas construes de linguagens de


programao so recursivas

Gramtica Formal
G := {S, P, N, T}

S: Smbolo Inicial (S N)
P: Conjunto de produes

se S1 e S2 so enunciados e E uma
expresso, ento:

T: conjunto de terminais

if E then S1 else S2 um enunciado

N: conjunto de no terminais

Vocabulrio:

uv

Exemplo de definio graas a gramtica:

Palavras ou tokens da linguagem

Smbolos que podem ser substitudos

V: alfabeto

V = N T (N T = )

cmd if expr then cmd else cmd


expr ( bool ) | expr && expr | expr || expr
bool true | false

u: string pertencente a V
Smbolo Vazio
BNF: Backus-Naur form
<u> ::= <v> | <w>
Igual a { uv, uw } em P

Definio da
Linguagem Gerada

Derivaes
Seja A N, p = { A v } P, e w, z quaisquer.
Ento
wAz wvz
derivao em um passo usando p

A linguagem gerada G (L(G)):


Conjunto formado por todos os strings de smbolos terminais derivveis
a partir do smbolo inicial S
L(G) = {s | s um elemento de T* e S + s}

Equivalncia:
G1 e G2 so equivalentes se L(G1) = L(G2)
Todos strings gerados esto em L
Todos strings w L podem ser gerados

Se w1 w2 w3 wn ento podemos dizer


w1 * wn
derivao em mltiplos (0 ou mais) passos; tambm
+ (um ou mais)

Convenes
Smbolos que representam terminais em minsculos:
u, v, x, y, ...
Smbolos que representam no-terminais em maisculos:
X, Y, TERM, S,...
Smbolos que representam formas sentenciais (seqncias de
terminais e no-terminais): letras gregas ou sublinhadas:
, , , w, z

Definio de Gramtica Regular


Gramtica regular:

Exemplo G={N,T,P,S}
N = {S, B, C, D}

produes exclusivamente da forma:


A wB
A w,
onde w T* e A, B N (gramtica linear direita)

A linguagem gerada por uma gramtica


regular regular.

T = {0, 1}
S -> 0B | 1C
B -> 1S
C -> 0C | 0D | 1
D -> 0
S
Fornecer expresso regular para a gramtica acima ?
(01)*10*(00 | 1)

Hierarquia de Chomsky

rvore de derivao (Parse Tree)

Sem restrio
recur. enum.
Sensvel ao
contexto

Qualquer u v desde
que u seja no vazio

Tipo 2

Livre do
contexto

Av
(1 smbolo a esquerda)

Tipo 3

regular

A a | aB |
(derivaes a direita)

Tipo 0
Tipo 1

wAz wvz
(w,z so o contexto)

rvore de derivao exemplo 1


Gramtica G = (
{NUMERO, NUM, DIGITO},
{0,1,2,...,9},
P,
NUMERO )

P (regras) =
NUMERO NUM
NUM NUM DIGITO | DIGITO
DIGITO 0|1|...|9

NUMERO
NUM
NUM
DIGITO

DIGITO
5

4
rvore de derivao para
a sentena 45

rvore de derivao:
representao grfica de uma derivao de
sentena
estrutura hierrquica que originou a sentena
A raiz da rvore representa o smbolo inicial
Os vrtices interiores so no-terminais
Os smbolos terminais e a palavra vazia so folhas

Derivao mais esquerda


e mais direita
Derivao mais esquerda de uma
sentena:
seqncia de formas sentenciais que se
obtm derivando sempre o smbolo noterminal mais esquerda.

Derivao mais direita de uma sentena:


seqncia de formas sentenciais que se
obtm derivando sempre o smbolo noterminal mais direita.

Exemplo

rvore de derivao exemplo 2

E E OP E | ( E ) | x
OP * | / | + | -
Considere 5 3 * 2

Gramtica G = ({E}, {+, -, *, /, (, ), x}, P, E) sendo

P = {E E + E | E E| E*E | E/E | (E) | x}

E
+
A mesma rvore pode
representar mais de uma derivao
x E
para uma mesma sentena
x

E
*

E
x

Possveis derivaes para a rvore:


EE+Ex+Ex+E*Ex+x*Ex+x*x
EE+EE+E*EE+E*xE+x*xx+x*x
E E + rvore
E E + de
E * derivao
E x + E *para
Ea
x +sentena
x * E xx+ +x x*x
*x
Problemas: 1- baixo desempenho para compiladores porque as
derivaes no so unvocas
2- e se h uma semntica associada?

Anlise Top-Down vs. Bottom Up


Gramtica: S A B
Ac|
B cbB | ca
Top-Down
S AB
cB
ccbB
ccbca

String:
ccbca

E
E

Outras Classificaes de Gramticas


Gramtica sem ciclos:
Gramtica sem ciclos uma GLC que no
possui derivaes da forma

A + A para algum A N

Bottom-Up
SAB ccbca Acbca
Ac
AcbB
BcbB
AB
Bca
S

Ac
Bca
BcbB
SAB

Outras Classificaes de Gramticas


Gramtica fatorada esquerda:
GLC que no possui produes do tipo A
1| 2 para alguma forma sentencial .

Gramtica recursiva esquerda:


GLC que permite a derivao

Gramtica -livre :
GLC que no possui produes do tipo A
Exceto a produo S (S o smbolo inicial).

Transformaes de GLCs
Eliminao de produes vazias
Eliminao de recursividade esquerda:
recurso direta
recurso indireta
Fatorao de uma gramtica

A A paraTOP-DOWN
algum Ano
aceita
N gramticas
OBS: RECONHECEDOR
recursivas
O no terminal
esquerda
A deriva ele mesmo, de forma direta ou
indireta, como smbolo mais esquerda de uma
subpalavra gerada.
+

Eliminao de produes vazias (1)


Objetivo:
eliminar produes da forma A .
Algoritmo: seja G = (N,T,P,S) uma GLC
Etapa 1:
construir N , o conjunto de no-terminais que
geram a palavra vazia:

N = {A | A };
Repita
N = N {X | X X1...Xn P tq X1,...,Xn
N}
At que o cardinal de N no aumente.

Eliminao de produes vazias


(3)

Etapa 3:
incluir gerao da palavra vazia, se
necessrio.

Se a palavra vazia pertence linguagem,


ento a gramtica resultante
G2 = (N,T,P2,S), onde P2 = P1 {S }

Eliminao de produes vazias (2)


Etapa 2:
construir o conjunto de produes sem produes
vazias:
gera G1 = (N,T,P1,S), onde P1 construdo como
segue:
P1 = {A | };
Repita
Para toda A P1 e X N tal que
= 1X2 e 12
Faa P1 = P1 {A 12}
At que o cardinal de P1 no aumente

Eliminao de recursividade
esquerda
Exemplo
A Aa | b
Com a palavra vazia
A bX
X aX |

Sem a palavra vazia


A b | bX
X a | aX

Obs: pode ainda haver recurso indireta!

Exemplo
E -> E+T | T
T -> T*F | F
F -> (E)| Id
A regra E -> E+T | T se torna:
E -> TE
E -> +TE|
A regra T- > T*F | F se torna:
T -> FT
T-> *FT |

Fatorao de uma gramtica


Elimina indeciso de qual produo
aplicar quando duas ou mais produes
iniciam com a mesma forma sentencial

A 1 | 2
Se torna:

A X
X 1 |2

Exemplo de Fatorao a Esquerda

Prxima aula

Cmd if Expr then Cmd else Cmd


Cmd if Expr then Cmd
Cmd Outro
Anlise sinttica...
Fatorando a esquerda:

Cmd if Expr then Cmd ElseOpc


Cmd Outro
ElseOpc else Cmd |

Como reconhecer uma sentena de uma


GLC?