SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Downloaden Sie, um offline zu lesen
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
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
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
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
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
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
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
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
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
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
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
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
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/2
Exemplo
S → (c(aSa | bSb)c | λ)
S → λ
S → caSac
S → cbSbc
cacacbbcacac

Como construir um compilador utilizando ferramentas Java – p. 8/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/2
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
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
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
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 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

S

→ aBcd

A → aa
A → a
B → b
B → λ

Como construir um compilador utilizando ferramentas Java – p. 11/2
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
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
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
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
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 formada por
b e c.

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 formada por
b e c.
{ad, abd, acd, abbd, abcd, acbd, accd, abbbd, ...}

Como construir um compilador utilizando ferramentas Java – p. 13/2
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
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
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
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
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 por b e c.

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 por b e c.
{abd, acd, abbd, abcd, acbd, accd, abbbd, ...}

Como construir um compilador utilizando ferramentas Java – p. 15/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/2
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
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
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
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
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
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
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
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 ferramentas Java – p. 20/2
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
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
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
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
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

Weitere ähnliche Inhalte

Was ist angesagt?

Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Emerson Macedo
 
Linguagem C e Dev-C++ Algumas Explicações
Linguagem C e Dev-C++  Algumas ExplicaçõesLinguagem C e Dev-C++  Algumas Explicações
Linguagem C e Dev-C++ Algumas Explicaçõesnataferraz
 
Aula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane FidelixAula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane FidelixCris Fidelix
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem cJefferson Bessa
 
Curso avançado de c++ em portugues
Curso avançado de c++ em portuguesCurso avançado de c++ em portugues
Curso avançado de c++ em portuguesLaura
 
Introdução à Programação de Computadores com Python
Introdução à Programação de Computadores com PythonIntrodução à Programação de Computadores com Python
Introdução à Programação de Computadores com PythonSidney Roberto
 
JavaScript for Beginners
JavaScript for BeginnersJavaScript for Beginners
JavaScript for BeginnersSAPO Sessions
 
Apostila - Linguagem de Programação I
Apostila - Linguagem de Programação IApostila - Linguagem de Programação I
Apostila - Linguagem de Programação ISidney Roberto
 
Oficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScriptOficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScriptRaphael Donaire Albino
 
Lógica de Programação com Javascript - Aula #03
Lógica de Programação com Javascript - Aula #03Lógica de Programação com Javascript - Aula #03
Lógica de Programação com Javascript - Aula #03Ramon Kayo
 
M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Webdiogoa21
 
Manual-de-php
Manual-de-phpManual-de-php
Manual-de-phpdiogoa21
 
Apostila de Introdução ao C#.net
Apostila de Introdução ao C#.netApostila de Introdução ao C#.net
Apostila de Introdução ao C#.netAndre Nascimento
 
Tutorial dev cpp 001 - criação, leitura e alteração de arquivos
Tutorial dev cpp   001 - criação, leitura e alteração de arquivosTutorial dev cpp   001 - criação, leitura e alteração de arquivos
Tutorial dev cpp 001 - criação, leitura e alteração de arquivosFlávio Freitas
 
classes_objetos_ e_cia_em_java
classes_objetos_ e_cia_em_javaclasses_objetos_ e_cia_em_java
classes_objetos_ e_cia_em_javaBel Arts
 

Was ist angesagt? (20)

Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
 
Linguagem C e Dev-C++ Algumas Explicações
Linguagem C e Dev-C++  Algumas ExplicaçõesLinguagem C e Dev-C++  Algumas Explicações
Linguagem C e Dev-C++ Algumas Explicações
 
Aula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane FidelixAula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane Fidelix
 
Geração de código linguagem c
Geração de código   linguagem cGeração de código   linguagem c
Geração de código linguagem c
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Curso avançado de c++ em portugues
Curso avançado de c++ em portuguesCurso avançado de c++ em portugues
Curso avançado de c++ em portugues
 
Introdução à Programação de Computadores com Python
Introdução à Programação de Computadores com PythonIntrodução à Programação de Computadores com Python
Introdução à Programação de Computadores com Python
 
O compilador dev c++
O compilador dev c++O compilador dev c++
O compilador dev c++
 
Zephir
ZephirZephir
Zephir
 
JavaScript for Beginners
JavaScript for BeginnersJavaScript for Beginners
JavaScript for Beginners
 
Apostila - Linguagem de Programação I
Apostila - Linguagem de Programação IApostila - Linguagem de Programação I
Apostila - Linguagem de Programação I
 
Oficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScriptOficina de Web Design Lecom - PHP e JavaScript
Oficina de Web Design Lecom - PHP e JavaScript
 
Lógica de Programação com Javascript - Aula #03
Lógica de Programação com Javascript - Aula #03Lógica de Programação com Javascript - Aula #03
Lógica de Programação com Javascript - Aula #03
 
M5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-WebM5-Desenvolvimento-Paginas-Web
M5-Desenvolvimento-Paginas-Web
 
Manual-de-php
Manual-de-phpManual-de-php
Manual-de-php
 
Apostila de Introdução ao C#.net
Apostila de Introdução ao C#.netApostila de Introdução ao C#.net
Apostila de Introdução ao C#.net
 
Microsoft C#
Microsoft C#Microsoft C#
Microsoft C#
 
Tutorial dev cpp 001 - criação, leitura e alteração de arquivos
Tutorial dev cpp   001 - criação, leitura e alteração de arquivosTutorial dev cpp   001 - criação, leitura e alteração de arquivos
Tutorial dev cpp 001 - criação, leitura e alteração de arquivos
 
Apostila linguagem pascal
Apostila linguagem pascalApostila linguagem pascal
Apostila linguagem pascal
 
classes_objetos_ e_cia_em_java
classes_objetos_ e_cia_em_javaclasses_objetos_ e_cia_em_java
classes_objetos_ e_cia_em_java
 

Andere mochten auch

Andere mochten auch (13)

JavaCC
JavaCCJavaCC
JavaCC
 
Trabalho
TrabalhoTrabalho
Trabalho
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Ficha javacc
Ficha javaccFicha javacc
Ficha javacc
 
Compilers - Using Lex and YACC
Compilers - Using Lex and YACCCompilers - Using Lex and YACC
Compilers - Using Lex and YACC
 
poscomp-Gabarito ano2010
poscomp-Gabarito ano2010poscomp-Gabarito ano2010
poscomp-Gabarito ano2010
 
[TUTORIAL] PetitParser
[TUTORIAL] PetitParser[TUTORIAL] PetitParser
[TUTORIAL] PetitParser
 
poscomp-Gabarito ano2011
poscomp-Gabarito ano2011poscomp-Gabarito ano2011
poscomp-Gabarito ano2011
 
Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011
 
Compilador analise lexica
Compilador analise lexicaCompilador analise lexica
Compilador analise lexica
 
Gcc
GccGcc
Gcc
 
Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 

Ähnlich wie Como construir um compilador com Java

TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013Giovanni Bassi
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno Rocha
 
JAVA: Muito mais que uma linguagem
JAVA: Muito mais que uma linguagemJAVA: Muito mais que uma linguagem
JAVA: Muito mais que uma linguagemliverig
 
JS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaJS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaiMasters
 
The Language VolcanX - ABMSL
The Language VolcanX - ABMSLThe Language VolcanX - ABMSL
The Language VolcanX - ABMSLMichel Alves
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Railsismaelstahelin
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Marcos Castro
 
47612195 apostila-de-scilab
47612195 apostila-de-scilab47612195 apostila-de-scilab
47612195 apostila-de-scilabMarco Antônio
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
Lógica de programação com visu alg
Lógica de programação com visu algLógica de programação com visu alg
Lógica de programação com visu algLeandro Santos
 
LZW - Compressão e Descompressão
LZW - Compressão e Descompressão LZW - Compressão e Descompressão
LZW - Compressão e Descompressão Mayara Mônica
 

Ähnlich wie Como construir um compilador com Java (13)

TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013
 
C sharp lesson1
C sharp lesson1C sharp lesson1
C sharp lesson1
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
JAVA: Muito mais que uma linguagem
JAVA: Muito mais que uma linguagemJAVA: Muito mais que uma linguagem
JAVA: Muito mais que uma linguagem
 
JS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na PráticaJS Experience 2017 - WebAssembly na Prática
JS Experience 2017 - WebAssembly na Prática
 
The Language VolcanX - ABMSL
The Language VolcanX - ABMSLThe Language VolcanX - ABMSL
The Language VolcanX - ABMSL
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Rails
 
Javascript
JavascriptJavascript
Javascript
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)
 
47612195 apostila-de-scilab
47612195 apostila-de-scilab47612195 apostila-de-scilab
47612195 apostila-de-scilab
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Lógica de programação com visu alg
Lógica de programação com visu algLógica de programação com visu alg
Lógica de programação com visu alg
 
LZW - Compressão e Descompressão
LZW - Compressão e Descompressão LZW - Compressão e Descompressão
LZW - Compressão e Descompressão
 

Como construir um compilador com Java

  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Exemplo S → (c(aSa | bSb)c | λ) Como construir um compilador utilizando ferramentas Java – p. 8/2
  • 14. Exemplo S → (c(aSa | bSb)c | λ) S → λ S → caSac S → cbSbc Como construir um compilador utilizando ferramentas Java – p. 8/2
  • 15. Exemplo S → (c(aSa | bSb)c | λ) S → λ S → caSac S → cbSbc cacacbbcacac Como construir um compilador utilizando ferramentas Java – p. 8/2
  • 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. 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. 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. 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. Exemplo S → a[(A | B)c]d A → a[a] B → [b] Como construir um compilador utilizando ferramentas Java – p. 10/2
  • 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. 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. 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. 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. 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. 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. Exemplo S → a(b | c)∗ d Como construir um compilador utilizando ferramentas Java – p. 13/2
  • 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. 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. 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. 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. 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. 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. Exemplo S → a(b | c)+ d Como construir um compilador utilizando ferramentas Java – p. 15/2
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Grafo sintático Opcionais são uma seleção com o λ. Como construir um compilador utilizando ferramentas Java – p. 20/2
  • 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. 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. 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. 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. 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. 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