05 Analise Sintatica.pdf

63
INF25 – Compiladores Análise Sintática

Transcript of 05 Analise Sintatica.pdf

Page 1: 05 Analise Sintatica.pdf

INF25 – Compiladores

Análise Sintática

Page 2: 05 Analise Sintatica.pdf

2

Etapas da Compilação

Front-End(Análise)

Back-End(Síntese)

Análise Léxica

Análise Sintática

Analise Semântica

Geração de CódigoIntermediário

Geração de CódigoFinal

Page 3: 05 Analise Sintatica.pdf

3

Análise Sintática Alguns autores consideram que a

análise sintática envolve tudo que diz respeito à verificação do formato do código fonte

Inclui a análise léxica como subfase

Visão mais coerente, porém o livro texto que usamos tem outra visão...

Page 4: 05 Analise Sintatica.pdf

4

Análise Sintática Entenderemos análise sintática como sendo

apenas a segunda fase dessa verificação de formato:

“É a fase que analisa os tokens para descobrir a estrutura gramatical do código fonte”

Também chamada “Reconhecimento” (Parsing)

Porém, um nome melhor seria “Análise Gramatical”

Page 5: 05 Analise Sintatica.pdf

Gramáticas Livres de Contexto

Page 6: 05 Analise Sintatica.pdf

6

Gramáticas São usadas para organizar os tokens

em “frases” de sentido lógico

Definem regras de formação recursivas

expressão → CTE_INT| ID| expressão + expressão

Page 7: 05 Analise Sintatica.pdf

7

Gramáticas As gramáticas livres de contexto

possuem quatro elementos:

Símbolos terminais Símbolos não-terminais Símbolo inicial Produções !

Page 8: 05 Analise Sintatica.pdf

8

Gramáticas Elementos das gramáticas livres de

contexto:

Símbolos terminais: Símbolos assumidos como atômicos, indivisíveis Em compiladores, são os tokens

Símbolos não-terminais: Usados para organizar os tokens em “frases” Representam elementos abstratos do programa

Page 9: 05 Analise Sintatica.pdf

9

Gramáticas Elementos das gramáticas livres de

contexto:

Símbolo inicial: Não-terminal a partir do qual são derivadas “cadeias” de

símbolos terminais Geralmente é um não-terminal chamado programa

Produções: São as regras de formação Definem as “frases” de terminais válidas na linguagem

Page 10: 05 Analise Sintatica.pdf

10

Notações Notação formal típica

Símbolo não-terminal: letras maiúscula Símbolo terminal: letras minúsculas, sinais,

etc.

E → T| T + E

T → x| i

Page 11: 05 Analise Sintatica.pdf

11

Notações Notação BNF

Símbolo não-terminal delimitado por “<“ e “>”

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

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

Page 12: 05 Analise Sintatica.pdf

12

Notações Notações EBNF (existem várias versões)

Não-terminais sem delimitadores BNF + operadores de expressões regulares

expressao = termo {"+" termo}*

termo = "x"| "i"

Page 13: 05 Analise Sintatica.pdf

13

Notações Notações que usaremos

Formal: para mostrar conceitos mais teóricos

BNF e EBNF: para os exemplos práticos

Page 14: 05 Analise Sintatica.pdf

14

Gramáticas A partir do símbolo inicial, podemos

derivar (gerar) as cadeias (palavras) de terminais que são válidas na linguagem

Page 15: 05 Analise Sintatica.pdf

15

Derivação Seja a gramática BNF anterior

Derivar a cadeia “i+i+x”

Esta é uma derivação mais à esquerda

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

Page 16: 05 Analise Sintatica.pdf

16

Derivação Seja a gramática BNF mostrada antes

Derivação 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

Page 17: 05 Analise Sintatica.pdf

17

Derivação O processo de derivação consiste em

substituir cada ocorrência de um não-terminal pelo lado direito (corpo) de alguma de suas produções Derivação mais à esquerda: substituir sempre o

não-terminal mais à esquerda Derivação mais à direita: análogo

A derivação pára quando sobrarem apenas terminais e o resultado é a cadeia

Page 18: 05 Analise Sintatica.pdf

18

Árvore de Derivação

A árvore dos exemplos anterioresexpressao

expressao

i

+

i

+

x

termo

termo expressao

a cadeia gerada pode ser percebida nas folhas, analisando-

as da esquerda para a direita

termo

Page 19: 05 Analise Sintatica.pdf

19

Árvore de Derivação

A mesma árvore reorganizada

expressao

expressao

i + i + x

termo

termo expressao

a seqüência de terminais (cadeia) gerada

termo

Page 20: 05 Analise Sintatica.pdf

20

Árvore de Derivação Mostra de maneira estática as produções

aplicadas Não diferencia se foi uma derivação mais à

esquerda ou mais à direita que gerou a cadeia

Forma Tem o símbolo inicial como raiz Não-terminais formam nós intermediários As folhas são os terminais (tokens) da cadeia

Page 21: 05 Analise Sintatica.pdf

21

Gramáticas Ambíguas Uma gramática é dita ambígua se ela

puder gerar duas árvores de derivação distintas para uma mesma cadeia

Veremos uma gramática equivalente à anterior, porém ambígua...

Page 22: 05 Analise Sintatica.pdf

22

Gramáticas Ambíguas Exemplo

Mostrar duas árvores de derivação para “i+i+x”

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

Page 23: 05 Analise Sintatica.pdf

23

Gramáticas Ambíguas Gramáticas ambíguas são, em geral,

inadequadas para uso em compiladores Dificultam a construção do analisador

sintático

Em alguns casos, são usadas gramáticas ambíguas junto com restrições adicionais Exemplo: precedência e associatividade

Page 24: 05 Analise Sintatica.pdf

24

Análise Sintática Vimos que gramáticas são formalismos

que geram cadeias

Em compiladores, não vamos gerar uma cadeia, mas já temos a cadeia de terminais (ou seja, de tokens) pronta...

Diante disso, qual seria a função do analisador sintático?

Page 25: 05 Analise Sintatica.pdf

Introdução à Análise Sintática

Page 26: 05 Analise Sintatica.pdf

26

Análise Sintática O objetivo

Descobrir como uma sequência de tokens pode ser gerada pela gramática da linguagem

Em outras palavras Entrada: sequência de tokens Saída: árvore

Page 27: 05 Analise Sintatica.pdf

27

Análise Sintática O módulo de software responsável por

essa etapa pode ser chamado de Analisador sintático ou parser

(reconhecedor)

Existem duas estratégias algorítmicas que podem ser adotadas Bottom-up / ascendente Top-down / descendente

Page 28: 05 Analise Sintatica.pdf

28

Análise Sintática Usaremos a seguinte gramática não-

ambígua para ilustrar, a seguir, as duas estratégias de análise sintática

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

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

Page 29: 05 Analise Sintatica.pdf

29

Análise Top-down Parte da raiz (símbolo 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 produções de cada não-terminal

O processo de construção da árvore lembra uma derivação mais à esquerda da cadeia

Page 30: 05 Analise Sintatica.pdf

30

Análise Top-down O parser vai ter que escolher uma produção

adequada para o símbolo inicial <expressao>

expressao

i + i + x

?

Page 31: 05 Analise Sintatica.pdf

31

Análise Top-down Sabe-se que ambas as produções iniciam com

<termo>, variando o restante

i + i + x

expressao

termo ?

?

Page 32: 05 Analise Sintatica.pdf

32

Análise Top-down Ao ler o token “i”, o parser identifica que é

gerado por <termo>, mas falta decidir o resto...

i + i + x

expressao

termo ?

Page 33: 05 Analise Sintatica.pdf

33

Análise Top-down A descoberta do “+” faz o parser decidir a

produção adequada

expressao

expressao

i + i + x

termo

?

Page 34: 05 Analise Sintatica.pdf

34

Análise Top-down Processo similar acontece após a leitura dos

dois tokens seguintes

expressao

expressao

i + i + x

termo

termo expressao

?

Page 35: 05 Analise Sintatica.pdf

35

Análise Top-down Porém, no último token, <expressão> vai ter

apenas <termo> e o parser encerra no EOF (fim de arquivo)

expressao

expressao

i + i + x

termo

termo expressao

termo

EOF

Page 36: 05 Analise Sintatica.pdf

36

Análise Bottom-up Parte das folhas (tokens) e tenta crescer a

árvore até a raiz (símbolo inicial)

Para isso, compara a sequência de símbolos o lado direito (ou corpo) das produções para tentar criar um ramo da árvore

Diz-se que a sequência é “reduzida” ao não-terminal do lado esquerdo da produção

Page 37: 05 Analise Sintatica.pdf

37

Análise Bottom-up Tenta crescer a árvore usando o corpo das

produções, até chegar ao símbolo inicial

expressao

i + i + x

Page 38: 05 Analise Sintatica.pdf

38

Análise Bottom-up O token “i” é reduzido ao não-terminal

<termo>, devido à produção <termo> ::= “i”

expressao

i + i + x

termo

Page 39: 05 Analise Sintatica.pdf

39

Análise Bottom-up O parser lê o token “+”, mas ainda não pode

fazer uma redução

expressao

i + i + x

termo

Page 40: 05 Analise Sintatica.pdf

40

Análise Bottom-up Mais uma redução ao não-terminal <termo>

expressao

i + i + x

termo termo

Page 41: 05 Analise Sintatica.pdf

41

Análise Bottom-up Apenas continua a leitura

expressao

i + i + x

termo termo

Page 42: 05 Analise Sintatica.pdf

42

Análise Bottom-up Nova redução ao não-terminal <termo>

expressao

i + i + x

termo termo termo

Page 43: 05 Analise Sintatica.pdf

43

Análise Bottom-up Como acabaram-se os tokens, o último <termo>

só pode ser gerado diretamente por <expressao>, então reduz

expressao

i + i + x

termo termo

expressao

termo

EOF

Page 44: 05 Analise Sintatica.pdf

44

Análise Bottom-up Agora, a subcadeia “<termo>+<expressao>”

pode ser reduzida para <expressao>

expressao

i + i + x

termo

expressão

termo

expressão

termo

Page 45: 05 Analise Sintatica.pdf

45

Análise Bottom-up Outra redução, usando a mesma produção

expressao

i + i + x

termo

expressao

expressao

termotermo

Page 46: 05 Analise Sintatica.pdf

46

Exercício Realizar a análise bottom-up da

seguinte gramatica para a cadeia “a + a * a”:E -> E + TE -> TT -> T * FT -> FF -> EE -> a

Page 47: 05 Analise Sintatica.pdf

47

Resposta

Page 48: 05 Analise Sintatica.pdf

48

Top-down x Bottom-up A análise sintática top-down é mais fácil de

entender e de implementar, porém a bottom-up é mais poderosa (aplicável em mais linguagens)

Uso principal das duas estratégias Bottom-up: usada pelos melhores geradores

semi-atomáticos de parsers Top-down: melhor técnica para implementar

manualmente

Page 49: 05 Analise Sintatica.pdf

49

Análise Sintática Além de construir a árvore, outras

atribuições importantes do analisador sintático são:

Reportar erros, o que deve ser feito de maneira clara para permitir ao usuário corrigir o problema

Recuperar-se de erros automaticamente (pouco uso em compiladores comerciais)

Page 50: 05 Analise Sintatica.pdf

50

Análise Sintática Na verdade, a análise sintática não precisa

construir a árvore durante o reconhecimento

Só é necessário construir a árvore se a análise sintática for separada das etapas seguintes

Em todo caso, o parser vai funcionar como se estivesse descobrindo a árvore que seriagerada pela gramática para os tokens dados

Page 51: 05 Analise Sintatica.pdf

Conceitos

Page 52: 05 Analise Sintatica.pdf

52

Conceitos Veremos alguns conceitos adicionais ligados à

fase de análise sintática

Árvore sintática

Sintaxe abstrata

Precedência e associatividade

Sintaxe concreta

Page 53: 05 Analise Sintatica.pdf

53

Árvore Sintática É quase igual à árvore de derivação, porém é

organizada de maneira mais “racional”

Cada nó interior é uma construção da linguagem ou um operador

Cada nó filho é uma parte significativa da construção ou um operando São descartados: pontuação, parênteses, etc.

Page 54: 05 Analise Sintatica.pdf

54

Árvore Sintática Gramática para os exemplos a seguir

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

Page 55: 05 Analise Sintatica.pdf

55

Árvore de Derivação Árvore de derivação de “x*(i+i)”

expressao

expressao

x

*

i

+

i

expressao

expressao expressao

( )expressao

Page 56: 05 Analise Sintatica.pdf

56

Árvore Sintática Árvore sintática de “x*(i+i)”

produto

x

i i

var

soma

var

var

Page 57: 05 Analise Sintatica.pdf

57

Sintaxe Abstrata É comum uma linguagem ser

especificada por meio de uma gramática de sintaxe abstrata Em geral, é ambígua Porém, mais simples de entender

Para resolver as ambiguidades, a especificação precisa definir restrições adicionais

Page 58: 05 Analise Sintatica.pdf

58

Sintaxe Abstrata Um exemplo seria a gramática

mostrada antes

É comum assumir associatividade à esquerda e precedência maior para a multiplicação

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

Page 59: 05 Analise Sintatica.pdf

59

Associatividade Associatividade diz como será aplicada uma

mesma operação binária quando há vários 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))))

Page 60: 05 Analise Sintatica.pdf

60

Precedência Precedência diz qual operação binária será

aplicada primeiro houver operadores diferentes

Exemplo: como interpretar a + b * c + d * e ?

Se o operador * tiver maior precedência: ((a + (b * c)) + (d * e))

Se o operador + tiver maior precedência: (((a + b) * (c + d)) * e)

Page 61: 05 Analise Sintatica.pdf

61

Sintaxe Concreta Por outro lado, a gramática tal como ela

foi usada para implementar o parser é chamada de sintaxe concreta Geralmente não tem ambigüidades Mais fácil de implementar

Específica da implementação Cada compilador (de uma mesma

linguagem) pode criar uma implementação diferente

Page 62: 05 Analise Sintatica.pdf

62

Sintaxe Concreta Exemplo de sintaxe concreta

correspondente à gramática de expressões anteriorexpressao ::= termo + expressao

| termo

termo ::= fator * termo| fator

fator ::= ( expressao )| INTEIRO_LITERAL

Page 63: 05 Analise Sintatica.pdf

63

Bibliografia AHO, A., LAM, M. S., SETHI, R.,

ULLMAN, J. D., Compiladores: princípios, técnicas e ferramentas.Ed. Addison Wesley. 2a Edição, 2008 (Capítulo 4)