Upload
maellson-marques
View
387
Download
4
Embed Size (px)
Citation preview
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
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