Você está na página 1de 63

INF25 Compiladores

Anlise Sinttica

Etapas da Compilao
Anlise Lxica

Anlise Sinttica

Front-End (Anlise)

Analise Semntica Gerao de Cdigo Intermedirio Gerao de Cdigo Final

Back-End (Sntese)
2

Anlise Sinttica

Alguns autores consideram que a anlise sinttica envolve tudo que diz respeito verificao do formato do cdigo fonte

Inclui a anlise lxica como subfase Viso mais coerente, porm o livro texto que usamos tem outra viso...
3

Anlise Sinttica

Entenderemos anlise sinttica como sendo apenas a segunda fase dessa verificao de formato:

a fase que analisa os tokens para descobrir a estrutura gramatical do cdigo fonte Tambm chamada Reconhecimento (Parsing) Porm, um nome melhor seria Anlise Gramatical
4

Gramticas Livres de Contexto

Gramticas

So usadas para organizar os tokens em frases de sentido lgico Definem regras de formao recursivas
expresso CTE_INT | ID | expresso + expresso

Gramticas

As gramticas livres de contexto possuem quatro elementos:


Smbolos terminais Smbolos no-terminais Smbolo inicial Produes !

Gramticas

Elementos das gramticas livres de contexto:

Smbolos terminais:

Smbolos assumidos como atmicos, indivisveis Em compiladores, so os tokens

Smbolos no-terminais:

Usados para organizar os tokens em frases Representam elementos abstratos do programa


8

Gramticas

Elementos das gramticas livres de contexto:

Smbolo inicial:

No-terminal a partir do qual so derivadas cadeias de smbolos terminais Geralmente um no-terminal chamado programa

Produes:

So as regras de formao Definem as frases de terminais vlidas na linguagem


9

Notaes

Notao formal tpica


Smbolo no-terminal: letras maiscula Smbolo terminal: letras minsculas, sinais, etc.
E T | T + E T x | i

10

Notaes

Notao BNF

Smbolo no-terminal delimitado por < e >

<expressao> ::= <termo> | <termo> "+" <expressao> <termo> ::= "x" | "i"

11

Notaes

Notaes EBNF (existem vrias verses)


No-terminais sem delimitadores BNF + operadores de expresses regulares

expressao = termo {"+" termo}* termo = "x" | "i"

12

Notaes

Notaes que usaremos

Formal: para mostrar conceitos mais tericos BNF e EBNF: para os exemplos prticos

13

Gramticas

A partir do smbolo inicial, podemos derivar (gerar) as cadeias (palavras) de terminais que so vlidas na linguagem

14

Derivao

Seja a gramtica BNF anterior

Derivar a cadeia i+i+x

<expressao> <termo> + <expressao> i + <expressao> i + <termo> + <expressao> i + i + <expressao> i + i + <termo> i + i + x

Esta uma derivao mais esquerda


15

Derivao

Seja a gramtica BNF mostrada antes

Derivao mais direita da cadeia i+i+x

<expressao> <termo> + <expressao> <termo> + <termo> + <expressao> <termo> + <termo> + <termo> <termo> + <termo> + x <termo> + i + x i + i + x

16

Derivao

O processo de derivao consiste em substituir cada ocorrncia de um no-terminal pelo lado direito (corpo) de alguma de suas produes

Derivao mais esquerda: substituir sempre o no-terminal mais esquerda Derivao mais direita: anlogo

A derivao pra quando sobrarem apenas terminais e o resultado a cadeia


17

rvore de Derivao

A rvore dos exemplos anteriores


expressao

termo

expressao

termo

expressao

i a cadeia gerada pode ser percebida nas folhas, analisandoas da esquerda para a direita

termo

x
18

rvore de Derivao

A mesma rvore reorganizada


expressao

termo

expressao

termo

expressao

termo

x
19

a seqncia de terminais (cadeia) gerada

rvore de Derivao

Mostra de maneira esttica as produes aplicadas

No diferencia se foi uma derivao mais esquerda ou mais direita que gerou a cadeia

Forma

Tem o smbolo inicial como raiz No-terminais formam ns intermedirios As folhas so os terminais (tokens) da cadeia

20

Gramticas Ambguas

Uma gramtica dita ambgua se ela puder gerar duas rvores de derivao distintas para uma mesma cadeia Veremos uma gramtica equivalente anterior, porm ambgua...

21

Gramticas Ambguas

Exemplo
<expressao> ::= <expressao> "+" <expressao> | "x" | "i"

Mostrar duas rvores de derivao para i+i+x

22

Gramticas Ambguas

Gramticas ambguas so, em geral, inadequadas para uso em compiladores

Dificultam a construo do analisador sinttico

Em alguns casos, so usadas gramticas ambguas junto com restries adicionais

Exemplo: precedncia e associatividade


23

Anlise Sinttica

Vimos que gramticas so formalismos que geram cadeias Em compiladores, no vamos gerar uma cadeia, mas j temos a cadeia de terminais (ou seja, de tokens) pronta... Diante disso, qual seria a funo do analisador sinttico?
24

Introduo Anlise Sinttica

Anlise Sinttica

O objetivo

Descobrir como uma sequncia de tokens pode ser gerada pela gramtica da linguagem

Em outras palavras

Entrada: sequncia de tokens Sada: rvore


26

Anlise Sinttica

O mdulo de software responsvel por essa etapa pode ser chamado de

Analisador sinttico ou parser (reconhecedor)

Existem duas estratgias algortmicas que podem ser adotadas


Bottom-up / ascendente Top-down / descendente


27

Anlise Sinttica

Usaremos a seguinte gramtica noambgua para ilustrar, a seguir, as duas estratgias de anlise sinttica
<expressao> ::= <termo> | <termo> "+" <expressao> <termo> ::= "x" | "i"

28

Anlise Top-down

Parte da raiz (smbolo inicial) e tenta criar a rvore de cima para baixo Recursivamente testa se a cadeia de tokens (lida da esquerda para a direita) pode ser gerada pelas produes de cada no-terminal O processo de construo da rvore lembra uma derivao mais esquerda da cadeia
29

Anlise Top-down

O parser vai ter que escolher uma produo adequada para o smbolo inicial <expressao>
expressao

x
30

Anlise Top-down

Sabe-se que ambas as produes iniciam com <termo>, variando o restante


expressao

termo

x
31

Anlise Top-down

Ao ler o token i, o parser identifica que gerado por <termo>, mas falta decidir o resto...
expressao ?

termo

x
32

Anlise Top-down

A descoberta do + faz o parser decidir a produo adequada


expressao

termo

expressao

x
33

Anlise Top-down

Processo similar acontece aps a leitura dos dois tokens seguintes


expressao

termo

expressao

termo

expressao

? i + i + x
34

Anlise Top-down

Porm, no ltimo token, <expresso> vai ter apenas <termo> e o parser encerra no EOF (fim de arquivo)
expressao

termo

expressao

termo

expressao

termo i + i + x
EOF
35

Anlise Bottom-up

Parte das folhas (tokens) e tenta crescer a rvore at a raiz (smbolo inicial) Para isso, compara a sequncia de smbolos o lado direito (ou corpo) das produes para tentar criar um ramo da rvore Diz-se que a sequncia reduzida ao noterminal do lado esquerdo da produo
36

Anlise Bottom-up

Tenta crescer a rvore usando o corpo das produes, at chegar ao smbolo inicial
expressao

x
37

Anlise Bottom-up

O token i reduzido ao no-terminal <termo>, devido produo <termo> ::= i


expressao

termo

x
38

Anlise Bottom-up

O parser l o token +, mas ainda no pode fazer uma reduo


expressao

termo

x
39

Anlise Bottom-up

Mais uma reduo ao no-terminal <termo>

expressao

termo

termo

x
40

Anlise Bottom-up

Apenas continua a leitura

expressao

termo

termo

x
41

Anlise Bottom-up

Nova reduo ao no-terminal <termo>

expressao

termo

termo

termo

x
42

Anlise Bottom-up

Como acabaram-se os tokens, o ltimo <termo> s pode ser gerado diretamente por <expressao>, ento reduz
expressao

expressao

termo

termo

termo
EOF
43

Anlise Bottom-up

Agora, a subcadeia <termo>+<expressao> pode ser reduzida para <expressao>


expressao

expresso

expresso

termo

termo

termo

x
44

Anlise Bottom-up

Outra reduo, usando a mesma produo

expressao

expressao

expressao

termo

termo

termo

x
45

Exerccio

Realizar a anlise bottom-up da seguinte gramatica para a cadeia a + a * a:


E E T T F E -> -> -> -> -> -> E + T T T * F F E a

46

Resposta

47

Top-down x Bottom-up

A anlise sinttica top-down mais fcil de entender e de implementar, porm a bottomup mais poderosa (aplicvel em mais linguagens) Uso principal das duas estratgias

Bottom-up: usada pelos melhores geradores semi-atomticos de parsers Top-down: melhor tcnica para implementar manualmente
48

Anlise Sinttica

Alm de construir a rvore, outras atribuies importantes do analisador sinttico so:

Reportar erros, o que deve ser feito de maneira clara para permitir ao usurio corrigir o problema Recuperar-se de erros automaticamente (pouco uso em compiladores comerciais)
49

Anlise Sinttica

Na verdade, a anlise sinttica no precisa construir a rvore durante o reconhecimento S necessrio construir a rvore se a anlise sinttica for separada das etapas seguintes Em todo caso, o parser vai funcionar como se estivesse descobrindo a rvore que seria gerada pela gramtica para os tokens dados
50

Conceitos

Conceitos

Veremos alguns conceitos adicionais ligados fase de anlise sinttica

rvore sinttica Sintaxe abstrata Precedncia e associatividade Sintaxe concreta


52

rvore Sinttica

quase igual rvore de derivao, porm organizada de maneira mais racional Cada n interior uma construo da linguagem ou um operador Cada n filho uma parte significativa da construo ou um operando

So descartados: pontuao, parnteses, etc.


53

rvore Sinttica

Gramtica para os exemplos a seguir


expressao ::= | | | | | | expressao + expressao expressao - expressao expressao * expressao expressao / expressao ( expressao ) IDENTIFICADOR INTEIRO_LITERAL

54

rvore de Derivao

rvore de derivao de x*(i+i)


expressao

expressao

expressao

expressao

expressao i

expressao i
55

rvore Sinttica

rvore sinttica de x*(i+i)


produto

var

soma

var

var

i
56

Sintaxe Abstrata

comum uma linguagem ser especificada por meio de uma gramtica de sintaxe abstrata

Em geral, ambgua Porm, mais simples de entender

Para resolver as ambiguidades, a especificao precisa definir restries adicionais


57

Sintaxe Abstrata

Um exemplo seria a gramtica mostrada antes


expressao ::= | | | expressao + expressao expressao * expressao ( expressao ) INTEIRO_LITERAL

comum assumir associatividade esquerda e precedncia maior para a multiplicao


58

Associatividade

Associatividade diz como ser aplicada uma mesma operao binria quando h vrios operandos

Exemplo: como interpretar a + b + c + d + e ? Se o operador for associativo esquerda: ((((a + b) + c) + d) + e) Se o operador for associativo direita: (a + (b + (c + (d + e))))
59

Precedncia

Precedncia diz qual operao binria ser aplicada primeiro houver operadores diferentes

Exemplo: como interpretar a + b * c + d * e ? Se o operador * tiver maior precedncia: ((a + (b * c)) + (d * e)) Se o operador + tiver maior precedncia: (((a + b) * (c + d)) * e)
60

Sintaxe Concreta

Por outro lado, a gramtica tal como ela foi usada para implementar o parser chamada de sintaxe concreta

Geralmente no tem ambigidades Mais fcil de implementar

Especfica da implementao

Cada compilador (de uma mesma linguagem) pode criar uma implementao diferente
61

Sintaxe Concreta

Exemplo de sintaxe concreta correspondente gramtica de expresses anterior


expressao ::= termo + expressao | termo termo ::= fator * termo | fator fator ::= ( expressao ) | INTEIRO_LITERAL
62

Bibliografia

AHO, A., LAM, M. S., SETHI, R., ULLMAN, J. D., Compiladores: princpios, tcnicas e ferramentas. Ed. Addison Wesley. 2a Edio, 2008 (Captulo 4)

63

Você também pode gostar