análise sintáticaw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_14.pdf · 2 compiladores...

26
Compiladores 2012/2013 1 Análise Sintática Compiladores Cristina C. Vieira

Upload: lamkhanh

Post on 07-Nov-2018

235 views

Category:

Documents


0 download

TRANSCRIPT

Compiladores 2012/2013 1

Análise Sintática

Compiladores

Cristina C. Vieira

Compiladores 2012/2013 2

Árvore Sintática

Nós internos: símbolos não-terminais

Folhas: símbolos terminais

Arcos:

de símbolos não-terminais do LHS da

produção

para nós do RHS da produção

Captura a derivação da frase (String)

Compiladores 2012/2013 3

Gramática

Start Expr

Expr Expr OP Expr

Expr INT

Expr OPEN Expr CLOSE

OP = + | - | * | /

INT = [0-9] [0-9]*

OPEN = (

CLOSE = )

Compiladores 2012/2013 4

Árvore Sintática para (2-1)+1

Start

Expr

Expr Expr OP

+ OPEN

( CLOSE

) Expr

INT

1

OP

-

Expr

INT

2

Expr

INT

1

Compiladores 2012/2013 5

Ambiguidade numa Gramática

Múltiplas derivações (como consequência: múltiplas árvores sintáticas) para a mesma String

Derivação e árvore sintática reflecte usualmente a semântica do programa

Ambiguidade na gramática reflecte muitas das vezes ambiguidades na semântica da linguagem (considerada indesejável)

Compiladores 2012/2013

6

Exemplo de ambiguidade

Duas árvores sintáticas para 2-1+1

Start

Expr

Expr Expr OP

+

Expr Expr OP

-

INT

2

INT

1

INT

1

Start

Expr

Expr Expr OP

-

Expr Expr OP

+

INT

1

INT

1

INT

2

Compiladores 2012/2013 7

Eliminação de ambiguidade

Solução: modificar gramática

fazer todos os operadores com

associação à esquerda

Gramática Original

Start Expr

Expr Expr OP Expr

Expr INT

Expr OPEN Expr CLOSE

Gramática Modificada

Start Expr

Expr Expr OP INT

Expr INT

Expr OPEN Expr CLOSE

Compiladores 2012/2013 8

Árvore sintática para a

gramática

Apenas uma árvore sintáctica para: 2-1+1

Start

Expr

Expr OP

+

Expr OP

-

INT

2

INT

1

INT

1

Start

Expr

Expr Expr OP

-

Expr Expr OP

+

INT

1

INT

1

INT

2

Árvore sintática válida Árvore sintática inválida

Compiladores 2012/2013 9

Violação de prioridade

Todos os operadores

associam à esquerda

Viola prioridade de * sobre

+

2-3*4 associa como (2-

3)*4

Start

Expr

Expr OP

*

Expr OP

-

INT

2

INT

3

INT

4

Árvore sintática para

2-3*4

Compiladores 2012/2013 10

Resolver prioridade

Gramática Original

OP = + | - | * | /

INT = [0-9] [0-9]*

OPEN = (

CLOSE = )

Start Expr

Expr Expr OP INT

Expr INT

Expr OPEN Expr CLOSE

Gramática Modificada

OP1 = + | -

OP2 = * | /

INT = [0-9] [0-9]*

OPEN = (

CLOSE = )

Start Expr

Expr Expr OP1 Term

Expr Term

Expr OPEN Expr CLOSE

Term Term OP2 INT

Term INT

Compiladores 2012/2013 11

Modificação nas Árvores

Sintáticas

Start

Expr

Expr OP

*

Expr OP

-

INT

2

INT

3

INT

4

Velha Árvore sintática para

2-3*4

Start

Expr

Expr OP1

-

Term

INT

2

Nova Árvore sintática para

2-3*4

Term

Term OP2

*

INT

3

INT

4

Compiladores 2012/2013 12

Ideia Geral

Agrupar operadores por níveis de prioridade * e / estão no nível de topo

+ e – estão no nível a seguir

Símbolo não-terminal para cada nível de prioridade Term é não-terminal para * e /

Expr é não-terminal para + e -

Pode-se fazer associatividade dos operadores à esquerda ou à direita em cada nível

Generalizar para níveis arbitrários de prioridades

Compiladores 2012/2013 13

TPC

Dada a gramática:

NUM = [0-9]+

ID = [A-Za-Z][0-9A-Za-z]*

Expr Expr + Term | Expr – Term | Term

Term Term * Factor | Term / Factor | Factor

Factor Primary ^ Factor | Primary

Primary -Primary | Element

Element ( Expr ) | NUM | ID

Quais as árvores sintáticas para:

• 5-2*3

• y^3

Compiladores 2012/2013 14

Estruturas if-then-else

Start Stat

Stat IF Expr THEN Stat ELSE Stat

Stat IF Expr THEN Stat

Stat ...

Compiladores 2012/2013 15

Árvore Sintática

Considere o enunciado:

if e1 then if e2 then s1 else s2

Compiladores 2012/2013 16

Árvore Sintática

Duas Árvores

Sintáticas

Stat

IF Expr Stat

IF Expr Stat ELSE e1

e2

Stat

s1 s2

IF Expr

Stat

IF Expr Stat ELSE

e2

e1

Stat

s1

s2

Qual é a

correcta?

THEN

THEN

THEN

Compiladores 2012/2013 17

Leituras alternativas

Gramática ambígua

Árvore sintática 1

if e1

if e2 s1

else s2

Árvore sintática 2

if e1

if e2 s1

else s2

Compiladores 2012/2013 18

Gramática modificada

Ideia básica: controlar quando um IF

sem ELSE pode ocorrer

No nível de topo do enunciado

Ou como último numa sequência de

enunciados if then else if then ...

Compiladores 2012/2013 19

Gramática modificada

Goal Stat

Stat WithElse

Stat LastElse

WithElse IF Expr THEN WithElse ELSE WithElse

WithElse …

LastElse IF Expr THEN Stat

LastElse IF Expr THEN WithElse ELSE LastElse

Compiladores 2012/2013 20

Analisador Sintático

Converte programas numa árvore sintática

Pode ser programado do zero!

Ou construído automaticamente por um gerador de “parsers”

Aceitam uma gramática como entrada

Produzem um analisador sintático como resultado

Problema prático

A Árvore Sintática para a gramática modificada é complicada

Gostaríamos de começar com uma árvore sintática mais intuitiva

Compiladores 2012/2013 21

Solução

Sintaxe Abstracta versus Concreta Sintaxe abstracta corresponde ao meio

intuitivo de pensar a estrutura do programa • Omite detalhes como palavras-chave supérfluas

que estão lá para tornar a linguagem não ambígua

• Sintaxe abstracta pode ser ambígua

Sintaxe Concreta corresponde à gramática completa utilizada para analisar sintacticamente a linguagem

Os analisadores sintáticos são muitas das vezes escritos para produzirem Árvores Sintáticas Abstractas (ASTs)

Compiladores 2012/2013 22

ASTs (Árvores Sintáticas

Abstractas)

Começar com uma gramática intuitiva mas

ambígua

Modificar a gramática para a tornar não- ambígua Árvores sintáticas concretas

Menos intuitivas

Converter as árvores sintáticas concretas em ASTs Correspondem à gramática intuitiva para a

linguagem

Mais simples de manipular pelo programa

Compiladores 2012/2013 23

Exemplo

Gramática intuitiva mas

ambígua

OP = * | / | + | -

INT = [0-9] [0-9]*

Start Expr

Expr Expr OP Expr

Expr INT

Gramática não-ambígua

OP1 = + | -

OP2 = * | /

INT = [0-9] [0-9]*

OPEN = (

CLOSE = )

Start Expr

Expr Expr OP1 Term

Expr Term

Term OPEN Expr CLOSE

Term Term OP2 INT

Term INT

Compiladores 2012/2013 24

Exemplo Start

Expr

Expr

Expr OP1

-

INT

3

Árvore sintática

concreta para

(2-3)*4 Term

OP2

* INT

4 Term

OPEN CLOSE

Term

INT

2

Term

Start

Expr

Expr OP

*

Expr OP

- INT

2

Expr

INT

4

Expr

INT

3

Árvore sintática

abstracta para

(2-3)*4

• Utiliza gramática intuitiva

• Elimina terminais supérfluos

• OPEN, CLOSE, etc.

Compiladores 2012/2013 25

Exemplo

Start

Expr

Expr OP

*

OP

-

INT

2

INT

4

INT

3

AST para (2-3)*4

ainda mais

simplificada

Árvore sintática

abstracta para

(2-3)*4 Start

Expr

Expr OP

*

Expr OP

- INT

2

Expr

INT

4

Expr

INT

3

Compiladores 2012/2013 26

Sumário

Níveis da estrutura lexicais e sintáticos Lexicais – expressões regulares e

autómatos

Sintáticos – gramáticas

Ambiguidades na gramática Gramáticas modificadas

Árvores Sintáticas Abstractas (ASTs)

Papel generativo versus papel reconhecedor Generativo mais conveniente para

especificação

Reconhecedor requerido na implementação