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

Click here to load reader

Post on 07-Jul-2020

5 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • Como construir um compilador utilizando ferramentas Java

    Aula 2 – BNF e Grafo Sintático

    Prof. Márcio Delamaro delamaro@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 a uma classe de linguagens chamadas de linguagens livres de contexto.

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

  • 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/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 aabbcc

    ou S ⇒ 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 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/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 utilizado ou 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 utilizado ou 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 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/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 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/22

  • 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/22

  • 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/22

  • 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

    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 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/22

  • 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/22

  • 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/22

  • 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/22

  • 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/22

  • 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 α

View more