como construir um compilador-cap 2

51
Como construir um compilador utilizando ferramentas Java Aula 2 – BNF e Grafo Sintático Prof. M ´ arcio Delamaro [email protected] Como construir um compilador utilizando ferramentas Java – p. 1/2

Upload: maellson-marques

Post on 10-Jul-2015

384 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Como Construir um compilador-cap 2

Como construir um compilador utilizandoferramentas Java

Aula 2 – BNF e Grafo Sintático

Prof. Marcio [email protected]

Como construir um compilador utilizando ferramentas Java – p. 1/22

Page 2: Como Construir um compilador-cap 2

Linguagem Livre de Contexto

Em geral, uma linguagem de programação pertence auma classe de linguagens chamadas de linguagenslivres de contexto.

Como construir um compilador utilizando ferramentas Java – p. 2/22

Page 3: Como Construir um compilador-cap 2

Linguagem Livre de Contexto

Em geral, uma linguagem de programação pertence auma classe de linguagens chamadas de linguagenslivres de contexto.

Uma das maneiras de se definirem tais linguagens é pormeio das gramáticas livres de contexto.

Como construir um compilador utilizando ferramentas Java – p. 2/22

Page 4: Como Construir um compilador-cap 2

Gramática Livre de Contexto

Uma gramática livre de contexto (GLC) é uma quádrupla〈Ω,Σ, S, P 〉, ondeΣ – é o alfabeto sobre o qual a linguagem é definida;Ω – é um conjunto não vazio de símbolos não terminais;P – é um conjunto de produções da forma A → α, onde

A ∈ Ω e α ∈ (Σ ∪ Ω)∗;S – é o símbolo inicial da gramática, S ∈ Ω.

Como construir um compilador utilizando ferramentas Java – p. 3/22

Page 5: Como Construir um compilador-cap 2

Exemplo

G1 = 〈S,A,B, a, b, c, S, P 〉, onde P é:(1) S → AB

(2) A → aAb

(3) A → λ

(4) B → cB

(5) B → λ

Como construir um compilador utilizando ferramentas Java – p. 4/22

Page 6: Como Construir um compilador-cap 2

Exemplo

Iniciamos com S aplicamos (1) obtemos AB

temos AB aplicamos (2) obtemos aAbB

temos aAbB aplicamos (2) obtemos aaAbbB

temos aaAbbB aplicamos (3) obtemos aabbB

temos aabbB aplicamos (4) obtemos aabbcB

temos aabbcB aplicamos (4) obtemos aabbccB

temos aabbccB aplicamos (5) obtemos aabbcc

Como construir um compilador utilizando ferramentas Java – p. 5/22

Page 7: Como Construir um compilador-cap 2

Exemplo

Iniciamos com S aplicamos (1) obtemos AB

temos AB aplicamos (2) obtemos aAbB

temos aAbB aplicamos (2) obtemos aaAbbB

temos aaAbbB aplicamos (3) obtemos aabbB

temos aabbB aplicamos (4) obtemos aabbcB

temos aabbcB aplicamos (4) obtemos aabbccB

temos aabbccB aplicamos (5) obtemos aabbccouS ⇒ AB ⇒ aAbB ⇒ aaAbbB ⇒ aabbB ⇒ aabbcB ⇒ aabbccB ⇒

aabbcc

Como construir um compilador utilizando ferramentas Java – p. 5/22

Page 8: Como Construir um compilador-cap 2

Forma de Backus-Naur (BNF)

A Forma de Backus-Naur (BNF) é uma outra maneira de sedefinir linguagens livres de contexto. Ela é semelhante auma gramática livre de contexto, mas permite que o ladodireito das produções possua alguns operadores.

seleção

opcional

repetição 0 ou mais vezes

repetição 1 ou mais vezes

Como construir um compilador utilizando ferramentas Java – p. 6/22

Page 9: Como Construir um compilador-cap 2

Seleção

(α | β) – Um dos elementos entre parênteses (α ou β)pode ser utilizado na aplicação da produção.

Como construir um compilador utilizando ferramentas Java – p. 7/22

Page 10: Como Construir um compilador-cap 2

Seleção

(α | β) – Um dos elementos entre parênteses (α ou β)pode ser utilizado na aplicação da produção.

S → a(b | c | d)e

Como construir um compilador utilizando ferramentas Java – p. 7/22

Page 11: Como Construir um compilador-cap 2

Seleção

(α | β) – Um dos elementos entre parênteses (α ou β)pode ser utilizado na aplicação da produção.

S → a(b | c | d)e

S ⇒ abe

S ⇒ ace

S ⇒ ade

Como construir um compilador utilizando ferramentas Java – p. 7/22

Page 12: Como Construir um compilador-cap 2

Seleção

(α | β) – Um dos elementos entre parênteses (α ou β)pode ser utilizado na aplicação da produção.

S → a(b | c | d)e

S ⇒ abe

S ⇒ ace

S ⇒ ade

S → abe

S → ace

S → ade

Como construir um compilador utilizando ferramentas Java – p. 7/22

Page 13: Como Construir um compilador-cap 2

Exemplo

S → (c(aSa | bSb)c | λ)

Como construir um compilador utilizando ferramentas Java – p. 8/22

Page 14: Como Construir um compilador-cap 2

Exemplo

S → (c(aSa | bSb)c | λ)

S → λ

S → caSac

S → cbSbc

Como construir um compilador utilizando ferramentas Java – p. 8/22

Page 15: Como Construir um compilador-cap 2

Exemplo

S → (c(aSa | bSb)c | λ)

S → λ

S → caSac

S → cbSbc

cacacbbcacac

Como construir um compilador utilizando ferramentas Java – p. 8/22

Page 16: Como Construir um compilador-cap 2

Exemplo

S → (c(aSa | bSb)c | λ)

S → λ

S → caSac

S → cbSbc

cacacbbcacac

S ⇒ caSac ⇒ cacaSacac ⇒ cacacbSbcacac ⇒ cacacbbcacac

Como construir um compilador utilizando ferramentas Java – p. 8/22

Page 17: Como Construir um compilador-cap 2

Opcional

[α] – O que estiver entre os colchetes pode ser utilizadoou não na aplicação da produção.

Como construir um compilador utilizando ferramentas Java – p. 9/22

Page 18: Como Construir um compilador-cap 2

Opcional

[α] – O que estiver entre os colchetes pode ser utilizadoou não na aplicação da produção.

S → a[bcd]e

Como construir um compilador utilizando ferramentas Java – p. 9/22

Page 19: Como Construir um compilador-cap 2

Opcional

[α] – O que estiver entre os colchetes pode ser utilizadoou não na aplicação da produção.

S → a[bcd]e

S ⇒ ae

S ⇒ abcde

Como construir um compilador utilizando ferramentas Java – p. 9/22

Page 20: Como Construir um compilador-cap 2

Exemplo

S → a[(A | B)c]d

A → a[a]

B → [b]

Como construir um compilador utilizando ferramentas Java – p. 10/22

Page 21: Como Construir um compilador-cap 2

Exemplo

S → a[(A | B)c]d

A → a[a]

B → [b]

S ⇒ ad

S ⇒ aAcd ⇒ aacd

S ⇒ aAcd ⇒ aaacd

S ⇒ aBcd ⇒ abcd

S ⇒ aBcd ⇒ acd

Como construir um compilador utilizando ferramentas Java – p. 10/22

Page 22: Como Construir um compilador-cap 2

Exemplo

S → a[(A | B)c]d

A → a[a]

B → [b]

S → ad

S → aAcd

S → aBcd

A → aa

A → a

B → b

B → λ

Como construir um compilador utilizando ferramentas Java – p. 11/22

Page 23: Como Construir um compilador-cap 2

Repetição 0 ou mais vezes

(α)∗ – O que estiver entre parêntese pode ser usado umnúmero qualquer de vezes na aplicação da produção epode também não ser usado (repetido nenhuma vez).

Como construir um compilador utilizando ferramentas Java – p. 12/22

Page 24: Como Construir um compilador-cap 2

Repetição 0 ou mais vezes

(α)∗ – O que estiver entre parêntese pode ser usado umnúmero qualquer de vezes na aplicação da produção epode também não ser usado (repetido nenhuma vez).

S → a(b)∗c

Como construir um compilador utilizando ferramentas Java – p. 12/22

Page 25: Como Construir um compilador-cap 2

Repetição 0 ou mais vezes

(α)∗ – O que estiver entre parêntese pode ser usado umnúmero qualquer de vezes na aplicação da produção epode também não ser usado (repetido nenhuma vez).

S → a(b)∗c

ac, abc, abbc, abbbc, ...

Como construir um compilador utilizando ferramentas Java – p. 12/22

Page 26: Como Construir um compilador-cap 2

Repetição 0 ou mais vezes

(α)∗ – O que estiver entre parêntese pode ser usado umnúmero qualquer de vezes na aplicação da produção epode também não ser usado (repetido nenhuma vez).

S → a(b)∗c

ac, abc, abbc, abbbc, ...

Como qualquer outra BNF, podemos encontrar uma

GLC correspondente, como, por exemplo:S → aZc

Z → bZ

Z → λ

Como construir um compilador utilizando ferramentas Java – p. 12/22

Page 27: Como Construir um compilador-cap 2

Exemplo

S → a(b | c)∗d

Como construir um compilador utilizando ferramentas Java – p. 13/22

Page 28: Como Construir um compilador-cap 2

Exemplo

S → a(b | c)∗d

Gera todas as cadeias que iniciam com a, terminam comd e têm entre estes o λ ou qualquer cadeia formada porb e c.

Como construir um compilador utilizando ferramentas Java – p. 13/22

Page 29: Como Construir um compilador-cap 2

Exemplo

S → a(b | c)∗d

Gera todas as cadeias que iniciam com a, terminam comd e têm entre estes o λ ou qualquer cadeia formada porb e c.

ad, abd, acd, abbd, abcd, acbd, accd, abbbd, ...

Como construir um compilador utilizando ferramentas Java – p. 13/22

Page 30: Como Construir um compilador-cap 2

Repetição 1 ou mais vezes

(α)+ – O que estiver entre parêntese pode ser usadouma ou mais vezes na aplicação da produção. Aprodução α → β(γ)+δ é equivalente a α → βγ(γ)∗δ.

Como construir um compilador utilizando ferramentas Java – p. 14/22

Page 31: Como Construir um compilador-cap 2

Repetição 1 ou mais vezes

(α)+ – O que estiver entre parêntese pode ser usadouma ou mais vezes na aplicação da produção. Aprodução α → β(γ)+δ é equivalente a α → βγ(γ)∗δ.

S → a(b)+c

Como construir um compilador utilizando ferramentas Java – p. 14/22

Page 32: Como Construir um compilador-cap 2

Repetição 1 ou mais vezes

(α)+ – O que estiver entre parêntese pode ser usadouma ou mais vezes na aplicação da produção. Aprodução α → β(γ)+δ é equivalente a α → βγ(γ)∗δ.

S → a(b)+c

abc, abbc, abbbc, ...

Como construir um compilador utilizando ferramentas Java – p. 14/22

Page 33: Como Construir um compilador-cap 2

Repetição 1 ou mais vezes

(α)+ – O que estiver entre parêntese pode ser usadouma ou mais vezes na aplicação da produção. Aprodução α → β(γ)+δ é equivalente a α → βγ(γ)∗δ.

S → a(b)+c

abc, abbc, abbbc, ...

Como qualquer outra BNF, podemos encontrar uma

GLC correspondente, como, por exemplo:S → aZc

Z → bZ

Z → b

Como construir um compilador utilizando ferramentas Java – p. 14/22

Page 34: Como Construir um compilador-cap 2

Exemplo

S → a(b | c)+d

Como construir um compilador utilizando ferramentas Java – p. 15/22

Page 35: Como Construir um compilador-cap 2

Exemplo

S → a(b | c)+d

Gera todas as cadeias que iniciam com a, terminam comd e têm entre estes qualquer cadeia formada por b e c.

Como construir um compilador utilizando ferramentas Java – p. 15/22

Page 36: Como Construir um compilador-cap 2

Exemplo

S → a(b | c)+d

Gera todas as cadeias que iniciam com a, terminam comd e têm entre estes qualquer cadeia formada por b e c.

abd, acd, abbd, abcd, acbd, accd, abbbd, ...

Como construir um compilador utilizando ferramentas Java – p. 15/22

Page 37: Como Construir um compilador-cap 2

Escrever na BNF

〈program〉 → 〈statlist〉

〈statlist〉 → λ | 〈statement〉〈statlist〉

〈statement〉 → 〈assignment〉 | 〈conditional〉 | 〈loop〉

〈conditional〉 → if 〈expre〉 〈statlist〉 else 〈statlist〉 |

if 〈expre〉 〈statlist〉

〈assignment〉 → ident = 〈expr〉;

〈loop〉 → while 〈expr〉 〈statlist〉

〈expr〉 → ident | numero | (〈expr〉) |

〈expr〉 〈oper〉 〈expr〉

〈oper〉 → + | − | ∗ | / | < | > | <= | >= | == | ! =

Como construir um compilador utilizando ferramentas Java – p. 16/22

Page 38: Como Construir um compilador-cap 2

Grafo sintático

Outra maneira de representar uma linguagem, chamadade grafo sintático. Essa representação facilita avisualização do tipo de cadeias ou formas sentenciaisque cada não-terminal pode gerar.

A → abc

A

a cb

Como construir um compilador utilizando ferramentas Java – p. 17/22

Page 39: Como Construir um compilador-cap 2

Grafo sintático

Os nós correspondentes a símbolos não terminais sãorepresentados no diagrama por retângulos.

Como construir um compilador utilizando ferramentas Java – p. 18/22

Page 40: Como Construir um compilador-cap 2

Grafo sintático

Os nós correspondentes a símbolos não terminais sãorepresentados no diagrama por retângulos.

A → aBc

B → de

Como construir um compilador utilizando ferramentas Java – p. 18/22

Page 41: Como Construir um compilador-cap 2

Grafo sintático

Os nós correspondentes a símbolos não terminais sãorepresentados no diagrama por retângulos.

A → aBc

B → de

A

a cB

d e

B

Como construir um compilador utilizando ferramentas Java – p. 18/22

Page 42: Como Construir um compilador-cap 2

Grafo sintático

Se tivermos operadores de seleção na produção donão-terminal teremos caminhos alternativos no grafo.

Como construir um compilador utilizando ferramentas Java – p. 19/22

Page 43: Como Construir um compilador-cap 2

Grafo sintático

Se tivermos operadores de seleção na produção donão-terminal teremos caminhos alternativos no grafo.

A → B(a | b | c)B

B → (de | λ)

Como construir um compilador utilizando ferramentas Java – p. 19/22

Page 44: Como Construir um compilador-cap 2

Grafo sintático

Se tivermos operadores de seleção na produção donão-terminal teremos caminhos alternativos no grafo.

A → B(a | b | c)B

B → (de | λ)

A

d e

B

B a

b

c

B

Como construir um compilador utilizando ferramentas Java – p. 19/22

Page 45: Como Construir um compilador-cap 2

Grafo sintático

Opcionais são uma seleção com o λ.

Como construir um compilador utilizando ferramentas Java – p. 20/22

Page 46: Como Construir um compilador-cap 2

Grafo sintático

Opcionais são uma seleção com o λ.

A → B[abc]B

B → (de | λ)

Como construir um compilador utilizando ferramentas Java – p. 20/22

Page 47: Como Construir um compilador-cap 2

Grafo sintático

Opcionais são uma seleção com o λ.

A → B[abc]B

B → (de | λ)

A

d e

B

B a b c B

Como construir um compilador utilizando ferramentas Java – p. 20/22

Page 48: Como Construir um compilador-cap 2

Grafo sintático

E os operadores de repetição podem ser representadospor meio de laços no grafo.

Como construir um compilador utilizando ferramentas Java – p. 21/22

Page 49: Como Construir um compilador-cap 2

Grafo sintático

E os operadores de repetição podem ser representadospor meio de laços no grafo.

A → B(a | b | c)∗B

B → (de)+

Como construir um compilador utilizando ferramentas Java – p. 21/22

Page 50: Como Construir um compilador-cap 2

Grafo sintático

E os operadores de repetição podem ser representadospor meio de laços no grafo.

A → B(a | b | c)∗B

B → (de)+

A

B B

d e

B

a

c

b

Como construir um compilador utilizando ferramentas Java – p. 21/22

Page 51: Como Construir um compilador-cap 2

Escrever na forma de grafo sintático

〈program〉 → 〈statment〉∗

〈statement〉 → 〈assignment〉 | 〈conditional〉 | 〈loop〉

〈conditional〉 →

if 〈expre〉 〈statment〉∗ [else 〈statment〉∗]

〈assignment〉 → ident = 〈expr〉;

〈loop〉 → while 〈expr〉 〈statment〉∗

〈expr〉 → ident | numero | (〈expr〉) |

〈expr〉 〈oper〉 〈expr〉

〈oper〉 → + | − | ∗ | / | < | > | <= | >= | == | ! =

Como construir um compilador utilizando ferramentas Java – p. 22/22