como construir um compilador utilizando ferramentas java · como construir um compilador utilizando...

Post on 07-Jul-2020

16 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Como construir um compilador utilizandoferramentas Java

Aula 2 – BNF e Grafo Sintático

Prof. Marcio Delamarodelamaro@icmc.usp.br

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

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

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

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

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

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

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

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

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

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

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

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

Exemplo

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

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

Exemplo

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

S → λ

S → caSac

S → cbSbc

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

Exemplo

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

S → λ

S → caSac

S → cbSbc

cacacbbcacac

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

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

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

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

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

Exemplo

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

A → a[a]

B → [b]

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

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

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

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

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

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

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

Exemplo

S → a(b | c)∗d

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

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

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

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

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

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

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

Exemplo

S → a(b | c)+d

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

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

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

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

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

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

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

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

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

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

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

Grafo sintático

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

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

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

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

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

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

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

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

top related