80
1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Embed Size (px)

Citation preview

Page 1: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

1

Análise Sintática

Prof. Alexandre Monteiro

Baseado em material cedido pelo Prof. Euclides Arcoverde

Recife

Page 2: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Contatos

Prof. Guilherme Alexandre Monteiro Reinaldo

Apelido: Alexandre Cordel

E-mail/gtalk: [email protected]

[email protected]

Site: http://www.alexandrecordel.com.br/fbv

Celular: (81) 9801-1878

Page 3: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

3

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 4: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

4

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 5: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

5

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 6: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Gramáticas Livres de Contexto

Page 7: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

7

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 8: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

8

Gramáticas

As gramáticas livres de contexto possuem quatro elementos:

• Símbolos terminais• Símbolos não-terminais • Símbolo inicial• Produções! ou Regras de Produção!

Page 9: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

9

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 (int, +, -, /, identificador,

valores literais, etc)

• Símbolos não-terminais: - Usados para organizar os tokens em “frases”- Representam elementos abstratos do programa (expressões,

termos, etc)

Page 10: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

10

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 11: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

11

Notações

Notação formal típica

• Símbolo não-terminal: letras maiúscula (E, T)

• Símbolo terminal: letras minúsculas, sinais, etc. (x,i)

E → T | T + E T → x | i

Page 12: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

12

Notações

Notação da Gramática BNF (Backus Naur Form)

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

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

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

Page 13: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

13

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 14: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

14

Notações

Notações que usaremos

• Formal: para mostrar conceitos mais teóricos

• BNF e EBNF: para os exemplos práticos

- Tokens aparecerão literalmente se forem simples - Ex.: sinais: “(”, “+”, “;” - palavras-chave: “int”, “for”,

“public”, etc.

- Tokens com várias opções de casamento aparecerão em maiúscula (ex.: identificadores, valores literais)

Page 15: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

15

Gramáticas

A partir do símbolo inicial, podemos derivar (gerar) as cadeias (palavras) de terminais que são válidas na linguagem

Page 16: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

16

Derivação

Seja a gramática BNF anterior• Derivar a cadeia “i+i+x”

• Consideremos que esta é uma derivação mais à esquerda

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

Page 17: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

17

Derivação

Seja a gramática BNF mostrada antes

• Agora a 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 18: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

18

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 19: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

19

Árvore de Derivação

A árvore dos exemplos anteriores

expressao

expressao

i

+

i

+

x

termo

termo expressao

a cadeia gerada pode ser percebida nas folhas, analisando-as da esquerda para a

direita

termo

Page 20: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

20

Á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 21: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

21

Á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:

- (expressão)

• Não-terminais formam nós intermediários: - (expressões e termos)

• As folhas são os terminais (tokens) da cadeia: - (i, +, x)

Page 22: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

22

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 23: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

23

Gramáticas Ambíguas

Exemplo

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

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

Page 24: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

24

Exercício

As gramaticas a seguir são ambíguas?

E -> E + E | E * E | (E) | a

S -> if E then S | if E then S else S | s E -> e

Page 25: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

25

Exercício É ambígua já que existem duas derivações mais à

esquerda para a cadeia a + a + a:A -> A + A | A − A | a

Page 26: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

26

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 27: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

27

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 28: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Introdução à Análise Sintática

Page 29: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

29

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 30: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

30

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 31: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

31

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 32: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

32

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 33: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

33

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 34: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

34

Análise Top-down

Sabe-se que ambas as produções iniciam com <termo>, variando o restante

i + i + x

expressao

termo ?

?

Page 35: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

35

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 36: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

36

Análise Top-down

A descoberta do “+” faz o parser decidir a produção adequada

expressao

expressao

i + i + x

termo

?

Page 37: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

37

Análise Top-down

Processo similar acontece após a leitura dos dois tokens seguintes

expressao

expressao

i + i + x

termo

termo expressao

?

Page 38: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

38

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 39: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

39

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 do 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 40: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

40

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 41: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

41

Análise Bottom-up

O token “i” é reduzido ao não-terminal <termo>, devido à produção <termo> ::= “i”

expressao

i + i + x

termo

Page 42: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

42

Análise Bottom-up

O parser lê o token “+”, mas ainda não pode fazer uma redução

expressao

i + i + x

termo

Page 43: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

43

Análise Bottom-up

Mais uma redução ao não-terminal <termo>

expressao

i + i + x

termo termo

Page 44: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

44

Análise Bottom-up

Apenas continua a leitura

expressao

i + i + x

termo termo

Page 45: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

45

Análise Bottom-up

Nova redução ao não-terminal <termo>

expressao

i + i + x

termo termo termo

Page 46: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

46

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 47: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

47

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 48: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

48

Análise Bottom-up

Outra redução, usando a mesma produção

expressao

i + i + x

termo

expressao

expressao

termotermo

Page 49: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

49

Exercício

Realizar a análise bottom-up da seguinte gramática para a cadeia “a + a * a”:

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

Page 50: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

50

Resposta

Page 51: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

51

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-automáticos de parsers• Top-down: melhor técnica para implementar

manualmente

Page 52: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

52

Top-down x Bottom-up

Chama-se gramática LL àquela que permite a construção de um parser top-down (descendente) para reconhecê-la

Chama-se gramática LR àquela que permite a construção de um parser bottom-up (ascendente) para reconhecê-la

Page 53: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

53

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 54: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

54

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 seria gerada pela gramática para os tokens dados

Page 55: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Conceitos

Page 56: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

56

Conceitos

Veremos alguns conceitos adicionais ligados à fase de análise sintática

• Árvore sintática

• Sintaxe abstrata

• Precedência e associatividade

• Sintaxe concreta

Page 57: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

57

Á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 58: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

58

Árvore Sintática

Gramática para os exemplos a seguir

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

Page 59: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

59

Árvore de Derivação

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

expressao

expressao

x

*

i

+

i

expressao

expressao expressao

( )expressao

Page 60: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

60

Árvore Sintática

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

produto

x

i i

var

soma

var

var

Page 61: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

61

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 62: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

62

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 63: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

63

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 64: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

64

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 65: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

65

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 66: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

66

Sintaxe Concreta

Exemplo de sintaxe concreta correspondente à gramática de expressões anterior

expressao ::= termo + expressao | termo

termo ::= fator * termo | fator

fator ::= ( expressao ) | INTEIRO_LITERAL

Page 67: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Tratando Ambiguidades

Page 68: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

68

Tratando Ambiguidades

Veremos como tratar gramáticas ambíguas (sintaxe abstrata), de modo a prepará-la para ser usada em um parser (sintaxe concreta)

Veremos como tratar dois tipos de ambiguidades:

• Ambiguidade do “else”• Ambiguidade de expressões

Page 69: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

69

Tratando Ambiguidades

A seguinte de definição de comando apresenta ambigüidade

Exemplo: “if (x) if (x) outro else outro”

• A qual “if” está ligado o “else”?

cmd ::= if ( expr ) cmd else cmd | if ( expr ) cmd | outro

expr ::= x

Page 70: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

70

Tratando Ambiguidades

O mais comum é considerar que o “else” casa com o “if” aberto mais próximo

Geralmente, a definição anterior funciona bem com as técnicas que vamos aprender

Mas, caso seja desejado, é possível remover essa ambiguidade...

Page 71: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

71

Tratando Ambiguidades

A estratégia é classificar os comandos em comandos incompletos (ou abertos) e completos

Comandos completos (matched)• if-else• todos os outros

Comandos incompletos ou abertos (open)• if (sem else)• if-else com um comando incompleto após o

else

Page 72: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

72

Tratando Ambiguidades

Solução

cmd ::= matched-cmd | open-cmd

matched-cmd ::= | if ( expr ) matched-cmd else matched-cmd | outro

open-cmd ::= | if ( expr ) cmd | if ( expr ) matched-cmd else open-cmd

Page 73: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

73

Tratando Ambiguidades

Como mostrado, a gramática abaixo é ambígua, mas essa ambiguidade pode ser resolvida com regras de precedência e associatividade

Como incluir essas regras na própria gramática?

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

Page 74: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

74

Tratando Ambiguidades

Criar um não-terminal para cada nível de precedência

• Chamaremos de: exprA, exprB, exprC...

No último nível (máxima precedência) ficam apenas expressões não binárias

Page 75: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

75

Tratando Ambiguidades

O não-terminal de cada nível tem uma produção para cada operador do nível

Os operandos serão

• o não-terminal do nível atual, para outras operações do mesmo nível

• e o não-terminal do próximo nível (nível de maior precedência)

Page 76: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

76

Tratando Ambiguidades

Na produção para os operadores, a posição do não-terminal do nível atual indica o tipo de associatividade do operador• Se estiver à esquerda: associativo à esquerda• Se estiver à direita: associativo à direita

Para tratar o caso de não haver nenhuma operação do nível, deve haver uma produção de substituição para o próximo nível

Page 77: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

77

Tratando Ambiguidades

No exemplo anterior, vamos assumir três níveis para os operadores binários• As demais expressões formam um quarto

nível

Ordenados da menor para a maior precedência:• adição e subtração, associativos à esquerda

- exprA• multiplicação e divisão, assoc. à esquerda

- exprB• exponenciação, assoc. à direita

- exprC

Page 78: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

78

Tratando Ambiguidades

Resultado

expressao ::= exprA

exprA ::= exprA + exprB | exprA - exprB | exprB

...

associativos à esquerda

Page 79: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

79

Tratando Ambiguidades

Resultado (continuação)

exprB ::= exprB * exprC | exprB / exprC | exprC

exprC ::= exprD ^ exprC | exprD

exprD ::= ( expressao ) | INTEIRO_LITERAL

associativos à esquerda

associativo à direita

Page 80: 1 Análise Sintática Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

80

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)