Como construir um compilador utilizando
ferramentas Java
Aula 2 – BNF e Grafo Sintático
´
Prof. Marcio Delamaro
delamaro@i...
Linguagem Livre de Contexto
Em geral, uma linguagem de programação pertence a
uma classe de linguagens chamadas de linguag...
Linguagem Livre de Contexto
Em geral, uma linguagem de programação pertence a
uma classe de linguagens chamadas de linguag...
Gramática Livre de Contexto
Uma gramática livre de contexto (GLC) é uma quádrupla
Ω, Σ, S, P , onde
Σ – é o alfabeto sobre...
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 construi...
Exemplo
Iniciamos com S
temos AB
temos aAbB
temos aaAbbB
temos aabbB
temos aabbcB
temos aabbccB

aplicamos (1)
aplicamos (...
Exemplo
Iniciamos com S
temos AB
temos aAbB
temos aaAbbB
temos aabbB
temos aabbcB
temos aabbccB
ou

aplicamos (1)
aplicamo...
Forma de Backus-Naur (BNF)
A Forma de Backus-Naur (BNF) é uma outra maneira de se
definir linguagens livres de contexto. El...
Seleção
(α | β) – Um dos elementos entre parênteses (α ou β )

pode ser utilizado na aplicação da produção.

Como construi...
Seleção
(α | β) – Um dos elementos entre parênteses (α ou β )

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

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

pode ser utilizado na aplicação da produção.
S → a(b | c | ...
Exemplo
S → (c(aSa | bSb)c | λ)

Como construir um compilador utilizando ferramentas Java – p. 8/2
Exemplo
S → (c(aSa | bSb)c | λ)
S → λ
S → caSac
S → cbSbc

Como construir um compilador utilizando ferramentas Java – p. 8...
Exemplo
S → (c(aSa | bSb)c | λ)
S → λ
S → caSac
S → cbSbc
cacacbbcacac

Como construir um compilador utilizando ferramenta...
Exemplo
S → (c(aSa | bSb)c | λ)
S → λ
S → caSac
S → cbSbc
cacacbbcacac
S ⇒ caSac ⇒ cacaSacac ⇒ cacacbSbcacac ⇒ cacacbbcaca...
Opcional
[α] – O que estiver entre os colchetes pode ser utilizado

ou não na aplicação da produção.

Como construir um co...
Opcional
[α] – O que estiver entre os colchetes pode ser utilizado

ou não na aplicação da produção.
S → a[bcd]e

Como con...
Opcional
[α] – O que estiver entre os colchetes pode ser utilizado

ou não na aplicação da produção.
S → a[bcd]e
S ⇒ ae
S ...
Exemplo
S

→ a[(A | B)c]d

A → a[a]
B → [b]

Como construir um compilador utilizando ferramentas Java – p. 10/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 c...
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 com...
Repetição 0 ou mais vezes
(α)∗ – O que estiver entre parêntese pode ser usado um

número qualquer de vezes na aplicação da...
Repetição 0 ou mais vezes
(α)∗ – O que estiver entre parêntese pode ser usado um

número qualquer de vezes na aplicação da...
Repetição 0 ou mais vezes
(α)∗ – O que estiver entre parêntese pode ser usado um

número qualquer de vezes na aplicação da...
Repetição 0 ou mais vezes
(α)∗ – O que estiver entre parêntese pode ser usado um

número qualquer de vezes na aplicação da...
Exemplo
S → a(b | c)∗ d

Como construir um compilador utilizando ferramentas Java – p. 13/2
Exemplo
S → a(b | c)∗ d

Gera todas as cadeias que iniciam com a, terminam com
d e têm entre estes o λ ou qualquer cadeia ...
Exemplo
S → a(b | c)∗ d

Gera todas as cadeias que iniciam com a, terminam com
d e têm entre estes o λ ou qualquer cadeia ...
Repetição 1 ou mais vezes
(α)+ – O que estiver entre parêntese pode ser usado

uma ou mais vezes na aplicação da produção....
Repetição 1 ou mais vezes
(α)+ – O que estiver entre parêntese pode ser usado

uma ou mais vezes na aplicação da produção....
Repetição 1 ou mais vezes
(α)+ – O que estiver entre parêntese pode ser usado

uma ou mais vezes na aplicação da produção....
Repetição 1 ou mais vezes
(α)+ – O que estiver entre parêntese pode ser usado

uma ou mais vezes na aplicação da produção....
Exemplo
S → a(b | c)+ d

Como construir um compilador utilizando ferramentas Java – p. 15/2
Exemplo
S → a(b | c)+ d

Gera todas as cadeias que iniciam com a, terminam com
d e têm entre estes qualquer cadeia formada...
Exemplo
S → a(b | c)+ d

Gera todas as cadeias que iniciam com a, terminam com
d e têm entre estes qualquer cadeia formada...
Escrever na BNF
program → { statlist }
statlist → λ | statement statlist
statement → assignment | conditional | loop
condi...
Grafo sintático
Outra maneira de representar uma linguagem, chamada
de grafo sintático. Essa representação facilita a
visu...
Grafo sintático
Os nós correspondentes a símbolos não terminais são
representados no diagrama por retângulos.

Como constr...
Grafo sintático
Os nós correspondentes a símbolos não terminais são
representados no diagrama por retângulos.
A → aBc
B → ...
Grafo sintático
Os nós correspondentes a símbolos não terminais são
representados no diagrama por retângulos.
A → aBc
B → ...
Grafo sintático
Se tivermos operadores de seleção na produção do
não-terminal teremos caminhos alternativos no grafo.

Com...
Grafo sintático
Se tivermos operadores de seleção na produção do
não-terminal teremos caminhos alternativos no grafo.
A → ...
Grafo sintático
Se tivermos operadores de seleção na produção do
não-terminal teremos caminhos alternativos no grafo.
A → ...
Grafo sintático
Opcionais são uma seleção com o λ.

Como construir um compilador utilizando ferramentas Java – p. 20/2
Grafo sintático
Opcionais são uma seleção com o λ.
A → B[abc]B
B → (de | λ)

Como construir um compilador utilizando ferra...
Grafo sintático
Opcionais são uma seleção com o λ.
A → B[abc]B
B → (de | λ)
A

B

a

b

c

B

B
d

e

Como construir um co...
Grafo sintático
E os operadores de repetição podem ser representados
por meio de laços no grafo.

Como construir um compil...
Grafo sintático
E os operadores de repetição podem ser representados
por meio de laços no grafo.
A → B(a | b | c)∗ B
B → (...
Grafo sintático
E os operadores de repetição podem ser representados
por meio de laços no grafo.
A → B(a | b | c)∗ B
B → (...
Escrever na forma de grafo sintático
program → { statment ∗ }
statement → assignment | conditional | loop
conditional →
if...
Próximos SlideShares
Carregando em…5
×

Como Construir um compilador-cap 2

794 visualizações

Publicada em

Publicada em: Tecnologia
  • Seja o primeiro a comentar

Como Construir um compilador-cap 2

  1. 1. Como construir um compilador utilizando ferramentas Java Aula 2 – BNF e Grafo Sintático ´ Prof. Marcio Delamaro delamaro@icmc.usp.br Como construir um compilador utilizando ferramentas Java – p. 1/2
  2. 2. Linguagem Livre de Contexto Em geral, uma linguagem de programação pertence a uma classe de linguagens chamadas de linguagens livres de contexto. Como construir um compilador utilizando ferramentas Java – p. 2/2
  3. 3. Linguagem Livre de Contexto Em geral, uma linguagem de programação pertence a uma classe de linguagens chamadas de linguagens livres de contexto. Uma das maneiras de se definirem tais linguagens é por meio das gramáticas livres de contexto. Como construir um compilador utilizando ferramentas Java – p. 2/2
  4. 4. 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/2
  5. 5. 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/2
  6. 6. Exemplo Iniciamos com S temos AB temos aAbB temos aaAbbB temos aabbB temos aabbcB temos aabbccB aplicamos (1) aplicamos (2) aplicamos (2) aplicamos (3) aplicamos (4) aplicamos (4) aplicamos (5) obtemos AB obtemos aAbB obtemos aaAbbB obtemos aabbB obtemos aabbcB obtemos aabbccB obtemos aabbcc Como construir um compilador utilizando ferramentas Java – p. 5/2
  7. 7. Exemplo Iniciamos com S temos AB temos aAbB temos aaAbbB temos aabbB temos aabbcB temos aabbccB ou aplicamos (1) aplicamos (2) aplicamos (2) aplicamos (3) aplicamos (4) aplicamos (4) aplicamos (5) obtemos AB obtemos aAbB obtemos aaAbbB obtemos aabbB obtemos aabbcB obtemos aabbccB obtemos aabbcc S ⇒ AB ⇒ aAbB ⇒ aaAbbB ⇒ aabbB ⇒ aabbcB ⇒ aabbccB ⇒ aabbcc Como construir um compilador utilizando ferramentas Java – p. 5/2
  8. 8. Forma de Backus-Naur (BNF) A Forma de Backus-Naur (BNF) é uma outra maneira de se definir linguagens livres de contexto. Ela é semelhante a uma gramática livre de contexto, mas permite que o lado direito 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/2
  9. 9. 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/2
  10. 10. 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/2
  11. 11. 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/2
  12. 12. 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/2
  13. 13. Exemplo S → (c(aSa | bSb)c | λ) Como construir um compilador utilizando ferramentas Java – p. 8/2
  14. 14. Exemplo S → (c(aSa | bSb)c | λ) S → λ S → caSac S → cbSbc Como construir um compilador utilizando ferramentas Java – p. 8/2
  15. 15. Exemplo S → (c(aSa | bSb)c | λ) S → λ S → caSac S → cbSbc cacacbbcacac Como construir um compilador utilizando ferramentas Java – p. 8/2
  16. 16. 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/2
  17. 17. Opcional [α] – O que estiver entre os colchetes pode ser utilizado ou não na aplicação da produção. Como construir um compilador utilizando ferramentas Java – p. 9/2
  18. 18. Opcional [α] – O que estiver entre os colchetes pode ser utilizado ou não na aplicação da produção. S → a[bcd]e Como construir um compilador utilizando ferramentas Java – p. 9/2
  19. 19. Opcional [α] – O que estiver entre os colchetes pode ser utilizado ou 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/2
  20. 20. Exemplo S → a[(A | B)c]d A → a[a] B → [b] Como construir um compilador utilizando ferramentas Java – p. 10/2
  21. 21. 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/2
  22. 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/2
  23. 23. Repetição 0 ou mais vezes (α)∗ – O que estiver entre parêntese pode ser usado um número qualquer de vezes na aplicação da produção e pode também não ser usado (repetido nenhuma vez). Como construir um compilador utilizando ferramentas Java – p. 12/2
  24. 24. Repetição 0 ou mais vezes (α)∗ – O que estiver entre parêntese pode ser usado um número qualquer de vezes na aplicação da produção e pode também não ser usado (repetido nenhuma vez). S → a(b)∗ c Como construir um compilador utilizando ferramentas Java – p. 12/2
  25. 25. Repetição 0 ou mais vezes (α)∗ – O que estiver entre parêntese pode ser usado um número qualquer de vezes na aplicação da produção e pode 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/2
  26. 26. Repetição 0 ou mais vezes (α)∗ – O que estiver entre parêntese pode ser usado um número qualquer de vezes na aplicação da produção e pode também não ser usado (repetido nenhuma vez). S → a(b)∗ c {ac, abc, abbc, abbbc, ...} Como qualquer outra BNF, podemos encontrar uma S → aZc GLC correspondente, como, por exemplo: Z → bZ Z → λ Como construir um compilador utilizando ferramentas Java – p. 12/2
  27. 27. Exemplo S → a(b | c)∗ d Como construir um compilador utilizando ferramentas Java – p. 13/2
  28. 28. Exemplo S → a(b | c)∗ d Gera todas as cadeias que iniciam com a, terminam com d e têm entre estes o λ ou qualquer cadeia formada por b e c. Como construir um compilador utilizando ferramentas Java – p. 13/2
  29. 29. Exemplo S → a(b | c)∗ d Gera todas as cadeias que iniciam com a, terminam com d e têm entre estes o λ ou qualquer cadeia formada por b e c. {ad, abd, acd, abbd, abcd, acbd, accd, abbbd, ...} Como construir um compilador utilizando ferramentas Java – p. 13/2
  30. 30. Repetição 1 ou mais vezes (α)+ – O que estiver entre parêntese pode ser usado uma ou mais vezes na aplicação da produção. A produção α → β(γ)+ δ é equivalente a α → βγ(γ)∗ δ . Como construir um compilador utilizando ferramentas Java – p. 14/2
  31. 31. Repetição 1 ou mais vezes (α)+ – O que estiver entre parêntese pode ser usado uma ou mais vezes na aplicação da produção. A produção α → β(γ)+ δ é equivalente a α → βγ(γ)∗ δ . S → a(b)+ c Como construir um compilador utilizando ferramentas Java – p. 14/2
  32. 32. Repetição 1 ou mais vezes (α)+ – O que estiver entre parêntese pode ser usado uma ou mais vezes na aplicação da produção. A produção α → β(γ)+ δ é equivalente a α → βγ(γ)∗ δ . S → a(b)+ c {abc, abbc, abbbc, ...} Como construir um compilador utilizando ferramentas Java – p. 14/2
  33. 33. Repetição 1 ou mais vezes (α)+ – O que estiver entre parêntese pode ser usado uma ou mais vezes na aplicação da produção. A produção α → β(γ)+ δ é equivalente a α → βγ(γ)∗ δ . S → a(b)+ c {abc, abbc, abbbc, ...} Como qualquer outra BNF, podemos encontrar uma S → aZc GLC correspondente, como, por exemplo: Z → bZ Z → b Como construir um compilador utilizando ferramentas Java – p. 14/2
  34. 34. Exemplo S → a(b | c)+ d Como construir um compilador utilizando ferramentas Java – p. 15/2
  35. 35. Exemplo S → a(b | c)+ d Gera todas as cadeias que iniciam com a, terminam com d e têm entre estes qualquer cadeia formada por b e c. Como construir um compilador utilizando ferramentas Java – p. 15/2
  36. 36. Exemplo S → a(b | c)+ d Gera todas as cadeias que iniciam com a, terminam com d 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/2
  37. 37. 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/2
  38. 38. Grafo sintático Outra maneira de representar uma linguagem, chamada de grafo sintático. Essa representação facilita a visualização do tipo de cadeias ou formas sentenciais que cada não-terminal pode gerar. A → abc A a b c Como construir um compilador utilizando ferramentas Java – p. 17/2
  39. 39. Grafo sintático Os nós correspondentes a símbolos não terminais são representados no diagrama por retângulos. Como construir um compilador utilizando ferramentas Java – p. 18/2
  40. 40. Grafo sintático Os nós correspondentes a símbolos não terminais são representados no diagrama por retângulos. A → aBc B → de Como construir um compilador utilizando ferramentas Java – p. 18/2
  41. 41. Grafo sintático Os nós correspondentes a símbolos não terminais são representados no diagrama por retângulos. A → aBc B → de A a B d c e B Como construir um compilador utilizando ferramentas Java – p. 18/2
  42. 42. Grafo sintático Se tivermos operadores de seleção na produção do não-terminal teremos caminhos alternativos no grafo. Como construir um compilador utilizando ferramentas Java – p. 19/2
  43. 43. Grafo sintático Se tivermos operadores de seleção na produção do não-terminal teremos caminhos alternativos no grafo. A → B(a | b | c)B B → (de | λ) Como construir um compilador utilizando ferramentas Java – p. 19/2
  44. 44. Grafo sintático Se tivermos operadores de seleção na produção do não-terminal teremos caminhos alternativos no grafo. A → B(a | b | c)B B → (de | λ) A B a B b c B d e Como construir um compilador utilizando ferramentas Java – p. 19/2
  45. 45. Grafo sintático Opcionais são uma seleção com o λ. Como construir um compilador utilizando ferramentas Java – p. 20/2
  46. 46. 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/2
  47. 47. Grafo sintático Opcionais são uma seleção com o λ. A → B[abc]B B → (de | λ) A B a b c B B d e Como construir um compilador utilizando ferramentas Java – p. 20/2
  48. 48. Grafo sintático E os operadores de repetição podem ser representados por meio de laços no grafo. Como construir um compilador utilizando ferramentas Java – p. 21/2
  49. 49. Grafo sintático E os operadores de repetição podem ser representados por meio de laços no grafo. A → B(a | b | c)∗ B B → (de)+ Como construir um compilador utilizando ferramentas Java – p. 21/2
  50. 50. Grafo sintático E os operadores de repetição podem ser representados por meio de laços no grafo. A → B(a | b | c)∗ B B → (de)+ A B B a b c B d e Como construir um compilador utilizando ferramentas Java – p. 21/2
  51. 51. 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/2

×