Вы находитесь на странице: 1из 21

ANLISE SINTTICA

GRAMTICAS
Compiladores
Departamento de Computao
UEPB

Fabiano de Miranda Silva


ANLISE SINTTICA

Parser

2
ANLISE SINTTICA

Objetivos desta etapa da compilao


A anlise sinttica agrupa os tokens em uma rvore
sinttica de acordo com a estrutura do programa (e a
gramtica da linguagem)

3
ANLISE SINTTICA

Objetivos desta etapa da compilao


Entrada: sequncia de tokens fornecida pelo
analisador lxico
Sada: rvore sinttica do programa

Analisador Analisador
Lxico Sinttico
Cdigo-
=
fonte
Identificador : a
a 42
Igualdade : =
Numeral : 42
4
ANLISE SINTTICA

Programa

if (i == j)\n\tz = 0;\nelse\n\tz = 1;

Tokens

IF PAR_E ID EQ ID PAR_D ID ATR NUM PV ELSE ID EQ NUM PV

rvore?
5
ANLISE SINTTICA

Nem todas as sequncias de tokens so programas


vlidos

O analisador sinttico precisa distinguir entre


sequncias vlidas e invlidas

necessrio uma ferramenta que nos permita


descrever as sequncias vlidas de tokens e a
estrutura do programa
Gramticas

Gramticas Livres de Contexto (GLC) so uma


notao natural para esse tipo de estrutura recursiva 6
ANLISE SINTTICA

Uma gramtica livre de contexto (CFG)


formada por:
Um conjunto de terminais (T)
Um conjunto de no-terminais (V)
Um no-terminal inicial (S)
Um conjunto de produes (P)

7
ANLISE SINTTICA

Produo: par de um no-terminal e uma cadeia


de terminais e no-terminais

No-terminal ao lado esquerdo da regra e a


cadeia ao lado direito

Apenas as produes so suficientes para


descrever a gramtica (com a ajuda de algumas
convenes)

8
ANLISE SINTTICA
Quais das cadeias abaixo esto na gramtica
dada?

9
Como definida formalmente esta gramtica?
ANLISE SINTTICA

rvore Sinttica (rvore de parse)


Possui smbolos terminais nas folhas
No-terminais nos demais ns

Percorrer as folhas da rvore em ordem d a


cadeia sendo derivada

A rvore sinttica d a estrutura e


associatividade das operaes que a cadeia
original no mostra

10
ANLISE SINTTICA

Derivaes mais esquerda e mais direita


(substituies no terminal mais esquerda ou
mais direita)

11
ANLISE SINTTICA

Ambiguidade
Podemos ter vrias derivaes para a mesma cadeia
w, mas todas devem gerar a mesma rvore sinttica
A estrutura do programa definida pela rvore
sinttica!
Diferena entre rvores sintticas geradas por
derivaes mais esquerda e mais direita so
esperadas

12
ANLISE SINTTICA

Ambiguidade
Podemos ter duas rvores sintticas diferentes para a
cadeia num * num + num

13
ANLISE SINTTICA

Ambiguidade
Primeira rvore sinttica: comece aplicando a
produo 2 da gramtica;
Segunda rvore sinttica: comece aplicando a
produo 3 da gramtica.

14
ANLISE SINTTICA

Ambiguidade
Gramtica ambgua se existe mais de uma derivao
esquerda para a mesma cadeia
Da mesma forma para a derivao direita
Ambiguidade leva a interpretaes no equivalentes
entre diferentes compiladores

15
ANLISE SINTTICA

Ambiguidade
Como corrigir a ambiguidade da gramtica do slide
13?
Verificar precedncia de operadores
* tem precedncia sobre +

Cada nvel de precedncia deve ter seu prprio terminal

Verificar associatividade de operadores

* e + so associativos esquerda por padro

Ento: recurso esquerda

16
ANLISE SINTTICA

Ambiguidade
Correo de ambiguidade na gramtica do slide 13

S -> E
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> num
17
ANLISE SINTTICA

Ambiguidade
Adicione as operaes subtrao, diviso e
exponenciao gramtica abaixo, respeitando suas
ordens de precedncia e associatividade:

S -> E
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> num
18
ANLISE SINTTICA

Caso clssico de ambiguidade: IF-ELSE

Onde est a ambiguidade na gramtica abaixo?

O ELSE de um IF aninhado pode ser considerado o


ELSE do IF mais externo 19
ANLISE SINTTICA

Como corrigir a ambiguidade do IF-ELSE?

Esta soluo apresenta algo ruim do ponto de


vista de um programador que utilizar a
linguagem? 20
ANLISE SINTTICA

Altere a gramtica abaixo deixando-a semelhante


estrutura de IF-ELSE utilizada em Java e C

21

Вам также может понравиться