SlideShare uma empresa Scribd logo
1 de 52
Baixar para ler offline
Como construir um compilador utilizando
ferramentas Java
Aula 1 - Introdução
´
Prof. Marcio Delamaro
delamaro@icmc.usp.br

Como construir um compilador utilizando ferramentas Java – p. 1/2
O livro

http://www.novatec.com.br/livros/compilador/
http://www.novateceditora.com.br/downloads.php

Como construir um compilador utilizando ferramentas Java – p. 2/2
Conteúdo
Introdução à compilação.
Descrição da linguagem X++, utilizada como estudo de
caso. Apresenta conceitos básicos sobre linguagens e
como defini-las.
Análise léxica. Mostra como se utiliza a ferramenta
JavaCC para criar um analisador léxico para a
linguagem X++.
Análise sintática. Mostra como construir um analisador
sintático para X++ utilizando JavaCC.

Como construir um compilador utilizando ferramentas Java – p. 3/2
Conteúdo
Árvore sintática. Mostra como construir a árvore
sintática usando o JavaCC e como utilizá-la nas etapas
seguintes.
Tabela de símbolos e análise semântica. Mostra como
implementar uma tabela de símbolos utilizada na
checagem de tipos e validação semântica.
Geração de código. Mostra como utilizar a ferramenta
Jasmin para gerar o código-objeto (bytecode) Java.

Como construir um compilador utilizando ferramentas Java – p. 4/2
O que é um programa?
Seqüência de 0s e 1s.
CPU
Memória
A
B
C
D

000
001
002
003
004
005
006
007

Como construir um compilador utilizando ferramentas Java – p. 5/2
Operações simples
Programa é armazenado na memória.

Como construir um compilador utilizando ferramentas Java – p. 6/2
Operações simples
Programa é armazenado na memória.
Programa é executado dentro da CPU por meio de
instruções muito simples.

Como construir um compilador utilizando ferramentas Java – p. 6/2
Operações simples
Programa é armazenado na memória.
Programa é executado dentro da CPU por meio de
instruções muito simples.
“Somar posição de memória 100 com posição 101 e
colocar resultado em 102.”
copiar o conteúdo da posição de memória 100 para o
registrador A;
copiar o conteúdo da posição de memória 101 para o
registrador B;
somar o conteúdo de B em A;
copiar o conteúdo de A para a posição de memória
102.

Como construir um compilador utilizando ferramentas Java – p. 6/2
Linguagens de alto nível
Necessário desenvolver programas num nível de
abstração um pouco mais elevado.

Como construir um compilador utilizando ferramentas Java – p. 7/2
Linguagens de alto nível
Necessário desenvolver programas num nível de
abstração um pouco mais elevado.
Menos dependente das instruções de uma determinada
máquina.

Como construir um compilador utilizando ferramentas Java – p. 7/2
Linguagens de alto nível
Necessário desenvolver programas num nível de
abstração um pouco mais elevado.
Menos dependente das instruções de uma determinada
máquina.
As linguagens de alto nível substituem as instruções dos
computadores por comandos cujas utilização e
compreensão são mais fáceis

Como construir um compilador utilizando ferramentas Java – p. 7/2
Linguagens de alto nível
Necessário desenvolver programas num nível de
abstração um pouco mais elevado.
Menos dependente das instruções de uma determinada
máquina.
As linguagens de alto nível substituem as instruções dos
computadores por comandos cujas utilização e
compreensão são mais fáceis
a=b+c

Como construir um compilador utilizando ferramentas Java – p. 7/2
Processo de compilação
As linguagens de programação evoluíram

Como construir um compilador utilizando ferramentas Java – p. 8/2
Processo de compilação
As linguagens de programação evoluíram
Máquinas continuam as mesmas ou seja, continuam
usando instruções de baixo nível

Como construir um compilador utilizando ferramentas Java – p. 8/2
Processo de compilação
As linguagens de programação evoluíram
Máquinas continuam as mesmas ou seja, continuam
usando instruções de baixo nível
Como usar então uma linguagem de alto nível numa
máquina que não a compreende?

Como construir um compilador utilizando ferramentas Java – p. 8/2
Processo de compilação
As linguagens de programação evoluíram
Máquinas continuam as mesmas ou seja, continuam
usando instruções de baixo nível
Como usar então uma linguagem de alto nível numa
máquina que não a compreende?
PROGRAMA

PROGRAMA

FONTE

OBJETO
COMPILADOR

Como construir um compilador utilizando ferramentas Java – p. 8/2
Os componentes de um compilador
o analisador léxico;
o analisador sintático;
o analisador semântico;
o gerador de código.

Como construir um compilador utilizando ferramentas Java – p. 9/2
Analisador léxico
O analisador léxico (AL) encarrega-se de separar no
programa fonte cada símbolo que tenha algum significado
para a linguagem ou de avisar quando um símbolo que não
faz parte da linguagem é encontrado.

Como construir um compilador utilizando ferramentas Java – p. 10/2
Análise léxica
123 x1 ; y2 true begin

Como construir um compilador utilizando ferramentas Java – p. 11/2
Análise léxica
123 x1 ; y2 true begin
123 – constante inteira;

Como construir um compilador utilizando ferramentas Java – p. 11/2
Análise léxica
123 x1 ; y2 true begin
123 – constante inteira;
x1 – nome de variável ou procedimento;

Como construir um compilador utilizando ferramentas Java – p. 11/2
Análise léxica
123 x1 ; y2 true begin
123 – constante inteira;
x1 – nome de variável ou procedimento;
; – símbolo especial “ponto-e-vírgula”;

Como construir um compilador utilizando ferramentas Java – p. 11/2
Análise léxica
123 x1 ; y2 true begin
123 – constante inteira;
x1 – nome de variável ou procedimento;
; – símbolo especial “ponto-e-vírgula”;
y2 – nome de variável ou procedimento;

Como construir um compilador utilizando ferramentas Java – p. 11/2
Análise léxica
123 x1 ; y2 true begin
123 – constante inteira;
x1 – nome de variável ou procedimento;
; – símbolo especial “ponto-e-vírgula”;
y2 – nome de variável ou procedimento;
true – constante booleana;

Como construir um compilador utilizando ferramentas Java – p. 11/2
Análise léxica
123 x1 ; y2 true begin
123 – constante inteira;
x1 – nome de variável ou procedimento;
; – símbolo especial “ponto-e-vírgula”;
y2 – nome de variável ou procedimento;
true – constante booleana;
begin – palavra reservada.

Como construir um compilador utilizando ferramentas Java – p. 11/2
Análise léxica
123 x1 ; y2 true begin
123 – constante inteira;
x1 – nome de variável ou procedimento;
; – símbolo especial “ponto-e-vírgula”;
y2 – nome de variável ou procedimento;
true – constante booleana;
begin – palavra reservada.
A descrição da linguagem diz quais são os símbolos
válidos e o que significam

Como construir um compilador utilizando ferramentas Java – p. 11/2
Análise léxica
123 x1 ; y2 true begin
123 – constante inteira;
x1 – nome de variável ou procedimento;
; – símbolo especial “ponto-e-vírgula”;
y2 – nome de variável ou procedimento;
true – constante booleana;
begin – palavra reservada.
A descrição da linguagem diz quais são os símbolos
válidos e o que significam
Erros léxicos

Como construir um compilador utilizando ferramentas Java – p. 11/2
Nem tudo é tão simples
123x1begin(end

Como construir um compilador utilizando ferramentas Java – p. 12/2
Nem tudo é tão simples
123x1begin(end
123 – constante inteira;

Como construir um compilador utilizando ferramentas Java – p. 12/2
Nem tudo é tão simples
123x1begin(end
123 – constante inteira;
x1begin – nome de variável ou procedimento;

Como construir um compilador utilizando ferramentas Java – p. 12/2
Nem tudo é tão simples
123x1begin(end
123 – constante inteira;
x1begin – nome de variável ou procedimento;
( – símbolo especial “abre parênteses”;

Como construir um compilador utilizando ferramentas Java – p. 12/2
Nem tudo é tão simples
123x1begin(end
123 – constante inteira;
x1begin – nome de variável ou procedimento;
( – símbolo especial “abre parênteses”;
end – palavra reservada.

Como construir um compilador utilizando ferramentas Java – p. 12/2
Estados do analisador léxico
"Aqui @ temos uma arroba"
/* Isso é um comentário */

Como construir um compilador utilizando ferramentas Java – p. 13/2
Analisador sintático
O AL não se preocupa em verificar se a ordem em que
os símbolos aparecem é válida ou não.

Como construir um compilador utilizando ferramentas Java – p. 14/2
Analisador sintático
O AL não se preocupa em verificar se a ordem em que
os símbolos aparecem é válida ou não.
O analisador sintático é o “coração” do compilador,
responsável por verificar se a seqüência de símbolos
contida no programa fonte forma um programa válido ou
não.

Como construir um compilador utilizando ferramentas Java – p. 14/2
Análise sintática
if (a - 10 > b * 2)
a = b;

O AS deve ser capaz de analisar esse programa e
reconhecê-lo como válido.
Após a palavra reservada if deve vir um “(”
Uma expressão
Um “)”
Um comando qualquer (por exemplo “a = b”)

Como construir um compilador utilizando ferramentas Java – p. 15/2
Descrição da linguagem
O AS é construído sobre uma gramática livre de
contexto que descreve a linguagem fonte.
Essa gramática é composta de uma série de regras que
descrevem quais são as construções válidas da
linguagem.
O AS deve aceitar aqueles programas que seguem
essas regras e rejeitar – indicando a ocorrência de um
erro sintático – aqueles que as violam.

Como construir um compilador utilizando ferramentas Java – p. 16/2
árvore sintática
O AS desempenha ainda outra importante função que é
a construção da árvore sintática(árvore de derivação) do
programa fonte.
Uma árvore sintáticaé uma estrutura em forma de
árvore que descreve as construções da linguagem
reconhecidas pelo AS no programa fonte.
Se o programa fonte possui um comando if como
aquele visto há pouco, sua árvore sintática deve
espelhar esse fato e descrever como esse comando é
formado.

Como construir um compilador utilizando ferramentas Java – p. 17/2
árvore sintática
if

>

-

a

=

*

10

b

a

b

2

Como construir um compilador utilizando ferramentas Java – p. 18/2
O analisador semântico
O analisador semântico (ASem) verifica se os aspectos
semânticos do programa estão corretos, ou seja, se não
existem incoerências quanto ao significado das
construções utilizadas pelo programador.

Como construir um compilador utilizando ferramentas Java – p. 19/2
O analisador semântico
O analisador semântico (ASem) verifica se os aspectos
semânticos do programa estão corretos, ou seja, se não
existem incoerências quanto ao significado das
construções utilizadas pelo programador.
Não utiliza mais o programa fonte para fazer tal
verificação. Em vez disso, utiliza a árvore sintática como
representação do programa.

Como construir um compilador utilizando ferramentas Java – p. 19/2
Análise semântica
Tipos de operandos incompatíveis com operadores. Se
tivermos o comando a = b * c e a variável c foi declarada
do tipo string, então o analisador semântico deve
apontar um erro semântico, pois esse tipo de operando
não é compatível com o operador *

Como construir um compilador utilizando ferramentas Java – p. 20/2
Análise semântica
Tipos de operandos incompatíveis com operadores. Se
tivermos o comando a = b * c e a variável c foi declarada
do tipo string, então o analisador semântico deve
apontar um erro semântico, pois esse tipo de operando
não é compatível com o operador *
Variáveis não declaradas.

Como construir um compilador utilizando ferramentas Java – p. 20/2
Análise semântica
Tipos de operandos incompatíveis com operadores. Se
tivermos o comando a = b * c e a variável c foi declarada
do tipo string, então o analisador semântico deve
apontar um erro semântico, pois esse tipo de operando
não é compatível com o operador *
Variáveis não declaradas.
Redeclaração de variáveis.

Como construir um compilador utilizando ferramentas Java – p. 20/2
Análise semântica
Tipos de operandos incompatíveis com operadores. Se
tivermos o comando a = b * c e a variável c foi declarada
do tipo string, então o analisador semântico deve
apontar um erro semântico, pois esse tipo de operando
não é compatível com o operador *
Variáveis não declaradas.
Redeclaração de variáveis.
Chamadas de funções ou métodos com o número
incorreto de parâmetros.

Como construir um compilador utilizando ferramentas Java – p. 20/2
Análise semântica
Tipos de operandos incompatíveis com operadores. Se
tivermos o comando a = b * c e a variável c foi declarada
do tipo string, então o analisador semântico deve
apontar um erro semântico, pois esse tipo de operando
não é compatível com o operador *
Variáveis não declaradas.
Redeclaração de variáveis.
Chamadas de funções ou métodos com o número
incorreto de parâmetros.
Comandos colocados fora de contexto. Por exemplo, a
utilização de um comando continue fora de um comando
de laço deve ser apontada como um erro semântico.

Como construir um compilador utilizando ferramentas Java – p. 20/2
Erros semânticos
Esses erros não são detectados pelo AS, pois não
constituem erros sintáticos. De acordo com a gramática da
linguagem fonte, uma variável c pode ser utilizada em uma
expressão como a = b * c, não importando se foi
declarada anteriormente ou não, ou qual é o seu tipo.

Como construir um compilador utilizando ferramentas Java – p. 21/2
Tabela de símbolos
Para desempenhar seu papel, o ASem depende de uma
tabela de símbolos.
Nela são armazenadas informações de variáveis
declaradas, funções ou métodos, tipos ou classes.
Ao analisar o comando a = b * c (ou melhor, a árvore
sintática correspondente a esse comando), o ASem
precisa saber se cada uma das variáveis envolvidas foi
previamente declarada e o tipo de cada uma delas.
O ASem deve, ao analisar um comando de declaração
como int c, incluir na tabela de símbolos a variável c,
indicando, entre outras coisas, que seu tipo é int.

Como construir um compilador utilizando ferramentas Java – p. 22/2
O gerador de código
Uma vez verificado que não existem erros sintáticos ou
semânticos, o compilador pode realizar sua tarefa, que é
a criação do programa objeto.

Como construir um compilador utilizando ferramentas Java – p. 23/2
O gerador de código
Uma vez verificado que não existem erros sintáticos ou
semânticos, o compilador pode realizar sua tarefa, que é
a criação do programa objeto.
O programa objeto reflete, mediante instruções de baixo
nível, os comandos do programa fonte. Como cada
máquina ou cada plataforma possui um conjunto
diferente de instruções e de meios de acesso ao
sistema operacional, em geral é necessário que exista
um gerador de código distinto para cada plataforma.

Como construir um compilador utilizando ferramentas Java – p. 23/2
JavaCC
Programa é um gerador de compiladores, ou mais
precisamente um gerador de analisador sintático.
Ele toma como entrada uma gramática e transforma-a
num programa Java capaz de analisar um arquivo e
dizer se satisfaz ou não as regras especificadas nessa
gramática.
Ele também oferece facilidades para a construção da
árvore sintática. Ao descrever a gramática, pode-se
também indicar como a árvore sintática deve ser
construída, incorporando-se código para realizar tal
tarefa ao analisador sintático gerado.

Como construir um compilador utilizando ferramentas Java – p. 24/2
Próximo passo
Vamos definir uma linguagem de programação que será
usada como estudo de caso durante o curso.
Ver Capítulo 2 do livro.

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

Mais conteúdo relacionado

Mais procurados

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
 
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
 
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...Rogério Moraes de Carvalho
 
JavaScript for Beginners
JavaScript for BeginnersJavaScript for Beginners
JavaScript for BeginnersSAPO Sessions
 
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
 
TechEd Brasil 2011: DEV 303 - Atualizando suas habilidades de programação com...
TechEd Brasil 2011: DEV 303 - Atualizando suas habilidades de programação com...TechEd Brasil 2011: DEV 303 - Atualizando suas habilidades de programação com...
TechEd Brasil 2011: DEV 303 - Atualizando suas habilidades de programação com...Rogério Moraes de Carvalho
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sérioLuciano Ramalho
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 
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
 
Shell Script - Luz e trevas
Shell Script - Luz e trevasShell Script - Luz e trevas
Shell Script - Luz e trevasOsvaldo Filho
 
BDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasBDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasVitor Mattos
 
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
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Natanael Fonseca
 
Apostila - Linguagem de Programação I
Apostila - Linguagem de Programação IApostila - Linguagem de Programação I
Apostila - Linguagem de Programação ISidney Roberto
 

Mais procurados (19)

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
 
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
 
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
 
Compiladores
CompiladoresCompiladores
Compiladores
 
JavaScript for Beginners
JavaScript for BeginnersJavaScript for Beginners
JavaScript for Beginners
 
Zephir
ZephirZephir
Zephir
 
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
 
TechEd Brasil 2011: DEV 303 - Atualizando suas habilidades de programação com...
TechEd Brasil 2011: DEV 303 - Atualizando suas habilidades de programação com...TechEd Brasil 2011: DEV 303 - Atualizando suas habilidades de programação com...
TechEd Brasil 2011: DEV 303 - Atualizando suas habilidades de programação com...
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sério
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
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
 
Shell Script - Luz e trevas
Shell Script - Luz e trevasShell Script - Luz e trevas
Shell Script - Luz e trevas
 
BDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasBDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemas
 
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#
 
O compilador dev c++
O compilador dev c++O compilador dev c++
O compilador dev c++
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 
Apostila - Linguagem de Programação I
Apostila - Linguagem de Programação IApostila - Linguagem de Programação I
Apostila - Linguagem de Programação I
 

Destaque

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 Aldisio Medeiros
 
Compilador analise lexica
Compilador analise lexicaCompilador analise lexica
Compilador analise lexicaAdilmar Dantas
 
Trabalho de Inteligencia Artificial
Trabalho de Inteligencia ArtificialTrabalho de Inteligencia Artificial
Trabalho de Inteligencia Artificialnohs4
 
Inteligência Artificial - Inferência Ascendente e Descendente
Inteligência Artificial - Inferência Ascendente e DescendenteInteligência Artificial - Inferência Ascendente e Descendente
Inteligência Artificial - Inferência Ascendente e DescendenteAldisio Medeiros
 
Uma DSL para declarar a Ordem de Execução de Aspectos
Uma DSL para declarar a Ordem de Execução de AspectosUma DSL para declarar a Ordem de Execução de Aspectos
Uma DSL para declarar a Ordem de Execução de AspectosGPrimola
 
Compilers - Using Lex and YACC
Compilers - Using Lex and YACCCompilers - Using Lex and YACC
Compilers - Using Lex and YACCMichel Alves
 
Ficha javacc
Ficha javaccFicha javacc
Ficha javaccÆx Lynx
 
[TUTORIAL] PetitParser
[TUTORIAL] PetitParser[TUTORIAL] PetitParser
[TUTORIAL] PetitParserESUG
 
Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011Maellson Marques
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Librarieselliando dias
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadoresLCCIMETRO
 
Analise sintatica
Analise sintaticaAnalise sintatica
Analise sintaticaRebeca Kaus
 

Destaque (20)

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
 
Compilador analise lexica
Compilador analise lexicaCompilador analise lexica
Compilador analise lexica
 
Gcc
GccGcc
Gcc
 
Compiladores 4
Compiladores 4Compiladores 4
Compiladores 4
 
Trabalho de Inteligencia Artificial
Trabalho de Inteligencia ArtificialTrabalho de Inteligencia Artificial
Trabalho de Inteligencia Artificial
 
Inteligência Artificial - Inferência Ascendente e Descendente
Inteligência Artificial - Inferência Ascendente e DescendenteInteligência Artificial - Inferência Ascendente e Descendente
Inteligência Artificial - Inferência Ascendente e Descendente
 
Uma DSL para declarar a Ordem de Execução de Aspectos
Uma DSL para declarar a Ordem de Execução de AspectosUma DSL para declarar a Ordem de Execução de Aspectos
Uma DSL para declarar a Ordem de Execução de Aspectos
 
Compilers - Using Lex and YACC
Compilers - Using Lex and YACCCompilers - Using Lex and YACC
Compilers - Using Lex and YACC
 
JavaCC
JavaCCJavaCC
JavaCC
 
Trabalho
TrabalhoTrabalho
Trabalho
 
Ficha javacc
Ficha javaccFicha javacc
Ficha javacc
 
Compiladores
CompiladoresCompiladores
Compiladores
 
[TUTORIAL] PetitParser
[TUTORIAL] PetitParser[TUTORIAL] PetitParser
[TUTORIAL] PetitParser
 
poscomp-Gabarito ano2010
poscomp-Gabarito ano2010poscomp-Gabarito ano2010
poscomp-Gabarito ano2010
 
Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011
 
poscomp-Gabarito ano2011
poscomp-Gabarito ano2011poscomp-Gabarito ano2011
poscomp-Gabarito ano2011
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadores
 
Analise sintatica
Analise sintaticaAnalise sintatica
Analise sintatica
 
Análise sintática
Análise sintáticaAnálise sintática
Análise sintática
 

Semelhante a Como Construir um Compilador cap-1

Semelhante a Como Construir um Compilador cap-1 (20)

Isc aula 7
Isc   aula 7Isc   aula 7
Isc aula 7
 
Java Fundamentos
Java FundamentosJava Fundamentos
Java Fundamentos
 
Aula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane FidelixAula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane Fidelix
 
Aula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane FidelixAula1- Java PRof.ª Cristiane Fidelix
Aula1- Java PRof.ª Cristiane Fidelix
 
Programação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com JavaProgramação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com Java
 
Linguagem de java
Linguagem de javaLinguagem de java
Linguagem de java
 
Java: Introduction
Java: IntroductionJava: Introduction
Java: Introduction
 
Javascript
JavascriptJavascript
Javascript
 
Linguagem de programação
Linguagem de programaçãoLinguagem de programação
Linguagem de programação
 
POO - Aula 1 introducao
POO - Aula 1   introducaoPOO - Aula 1   introducao
POO - Aula 1 introducao
 
1707331929 ltp iv java original
1707331929 ltp iv   java original1707331929 ltp iv   java original
1707331929 ltp iv java original
 
Introdução ao java
Introdução ao javaIntrodução ao java
Introdução ao java
 
Linguagens Dinamicas na JVM
Linguagens Dinamicas na JVMLinguagens Dinamicas na JVM
Linguagens Dinamicas na JVM
 
Java20141215 17[1]
Java20141215 17[1]Java20141215 17[1]
Java20141215 17[1]
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Introducao logica2
Introducao logica2Introducao logica2
Introducao logica2
 
Apostila de java
Apostila de javaApostila de java
Apostila de java
 
F I C+ + L P 05
F I C+ + L P 05F I C+ + L P 05
F I C+ + L P 05
 
Introdução ao java Alo Mundo
Introdução ao java Alo MundoIntrodução ao java Alo Mundo
Introdução ao java Alo Mundo
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 

Como Construir um Compilador cap-1

  • 1. Como construir um compilador utilizando ferramentas Java Aula 1 - Introdução ´ Prof. Marcio Delamaro delamaro@icmc.usp.br Como construir um compilador utilizando ferramentas Java – p. 1/2
  • 3. Conteúdo Introdução à compilação. Descrição da linguagem X++, utilizada como estudo de caso. Apresenta conceitos básicos sobre linguagens e como defini-las. Análise léxica. Mostra como se utiliza a ferramenta JavaCC para criar um analisador léxico para a linguagem X++. Análise sintática. Mostra como construir um analisador sintático para X++ utilizando JavaCC. Como construir um compilador utilizando ferramentas Java – p. 3/2
  • 4. Conteúdo Árvore sintática. Mostra como construir a árvore sintática usando o JavaCC e como utilizá-la nas etapas seguintes. Tabela de símbolos e análise semântica. Mostra como implementar uma tabela de símbolos utilizada na checagem de tipos e validação semântica. Geração de código. Mostra como utilizar a ferramenta Jasmin para gerar o código-objeto (bytecode) Java. Como construir um compilador utilizando ferramentas Java – p. 4/2
  • 5. O que é um programa? Seqüência de 0s e 1s. CPU Memória A B C D 000 001 002 003 004 005 006 007 Como construir um compilador utilizando ferramentas Java – p. 5/2
  • 6. Operações simples Programa é armazenado na memória. Como construir um compilador utilizando ferramentas Java – p. 6/2
  • 7. Operações simples Programa é armazenado na memória. Programa é executado dentro da CPU por meio de instruções muito simples. Como construir um compilador utilizando ferramentas Java – p. 6/2
  • 8. Operações simples Programa é armazenado na memória. Programa é executado dentro da CPU por meio de instruções muito simples. “Somar posição de memória 100 com posição 101 e colocar resultado em 102.” copiar o conteúdo da posição de memória 100 para o registrador A; copiar o conteúdo da posição de memória 101 para o registrador B; somar o conteúdo de B em A; copiar o conteúdo de A para a posição de memória 102. Como construir um compilador utilizando ferramentas Java – p. 6/2
  • 9. Linguagens de alto nível Necessário desenvolver programas num nível de abstração um pouco mais elevado. Como construir um compilador utilizando ferramentas Java – p. 7/2
  • 10. Linguagens de alto nível Necessário desenvolver programas num nível de abstração um pouco mais elevado. Menos dependente das instruções de uma determinada máquina. Como construir um compilador utilizando ferramentas Java – p. 7/2
  • 11. Linguagens de alto nível Necessário desenvolver programas num nível de abstração um pouco mais elevado. Menos dependente das instruções de uma determinada máquina. As linguagens de alto nível substituem as instruções dos computadores por comandos cujas utilização e compreensão são mais fáceis Como construir um compilador utilizando ferramentas Java – p. 7/2
  • 12. Linguagens de alto nível Necessário desenvolver programas num nível de abstração um pouco mais elevado. Menos dependente das instruções de uma determinada máquina. As linguagens de alto nível substituem as instruções dos computadores por comandos cujas utilização e compreensão são mais fáceis a=b+c Como construir um compilador utilizando ferramentas Java – p. 7/2
  • 13. Processo de compilação As linguagens de programação evoluíram Como construir um compilador utilizando ferramentas Java – p. 8/2
  • 14. Processo de compilação As linguagens de programação evoluíram Máquinas continuam as mesmas ou seja, continuam usando instruções de baixo nível Como construir um compilador utilizando ferramentas Java – p. 8/2
  • 15. Processo de compilação As linguagens de programação evoluíram Máquinas continuam as mesmas ou seja, continuam usando instruções de baixo nível Como usar então uma linguagem de alto nível numa máquina que não a compreende? Como construir um compilador utilizando ferramentas Java – p. 8/2
  • 16. Processo de compilação As linguagens de programação evoluíram Máquinas continuam as mesmas ou seja, continuam usando instruções de baixo nível Como usar então uma linguagem de alto nível numa máquina que não a compreende? PROGRAMA PROGRAMA FONTE OBJETO COMPILADOR Como construir um compilador utilizando ferramentas Java – p. 8/2
  • 17. Os componentes de um compilador o analisador léxico; o analisador sintático; o analisador semântico; o gerador de código. Como construir um compilador utilizando ferramentas Java – p. 9/2
  • 18. Analisador léxico O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para a linguagem ou de avisar quando um símbolo que não faz parte da linguagem é encontrado. Como construir um compilador utilizando ferramentas Java – p. 10/2
  • 19. Análise léxica 123 x1 ; y2 true begin Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 20. Análise léxica 123 x1 ; y2 true begin 123 – constante inteira; Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 21. Análise léxica 123 x1 ; y2 true begin 123 – constante inteira; x1 – nome de variável ou procedimento; Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 22. Análise léxica 123 x1 ; y2 true begin 123 – constante inteira; x1 – nome de variável ou procedimento; ; – símbolo especial “ponto-e-vírgula”; Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 23. Análise léxica 123 x1 ; y2 true begin 123 – constante inteira; x1 – nome de variável ou procedimento; ; – símbolo especial “ponto-e-vírgula”; y2 – nome de variável ou procedimento; Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 24. Análise léxica 123 x1 ; y2 true begin 123 – constante inteira; x1 – nome de variável ou procedimento; ; – símbolo especial “ponto-e-vírgula”; y2 – nome de variável ou procedimento; true – constante booleana; Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 25. Análise léxica 123 x1 ; y2 true begin 123 – constante inteira; x1 – nome de variável ou procedimento; ; – símbolo especial “ponto-e-vírgula”; y2 – nome de variável ou procedimento; true – constante booleana; begin – palavra reservada. Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 26. Análise léxica 123 x1 ; y2 true begin 123 – constante inteira; x1 – nome de variável ou procedimento; ; – símbolo especial “ponto-e-vírgula”; y2 – nome de variável ou procedimento; true – constante booleana; begin – palavra reservada. A descrição da linguagem diz quais são os símbolos válidos e o que significam Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 27. Análise léxica 123 x1 ; y2 true begin 123 – constante inteira; x1 – nome de variável ou procedimento; ; – símbolo especial “ponto-e-vírgula”; y2 – nome de variável ou procedimento; true – constante booleana; begin – palavra reservada. A descrição da linguagem diz quais são os símbolos válidos e o que significam Erros léxicos Como construir um compilador utilizando ferramentas Java – p. 11/2
  • 28. Nem tudo é tão simples 123x1begin(end Como construir um compilador utilizando ferramentas Java – p. 12/2
  • 29. Nem tudo é tão simples 123x1begin(end 123 – constante inteira; Como construir um compilador utilizando ferramentas Java – p. 12/2
  • 30. Nem tudo é tão simples 123x1begin(end 123 – constante inteira; x1begin – nome de variável ou procedimento; Como construir um compilador utilizando ferramentas Java – p. 12/2
  • 31. Nem tudo é tão simples 123x1begin(end 123 – constante inteira; x1begin – nome de variável ou procedimento; ( – símbolo especial “abre parênteses”; Como construir um compilador utilizando ferramentas Java – p. 12/2
  • 32. Nem tudo é tão simples 123x1begin(end 123 – constante inteira; x1begin – nome de variável ou procedimento; ( – símbolo especial “abre parênteses”; end – palavra reservada. Como construir um compilador utilizando ferramentas Java – p. 12/2
  • 33. Estados do analisador léxico "Aqui @ temos uma arroba" /* Isso é um comentário */ Como construir um compilador utilizando ferramentas Java – p. 13/2
  • 34. Analisador sintático O AL não se preocupa em verificar se a ordem em que os símbolos aparecem é válida ou não. Como construir um compilador utilizando ferramentas Java – p. 14/2
  • 35. Analisador sintático O AL não se preocupa em verificar se a ordem em que os símbolos aparecem é válida ou não. O analisador sintático é o “coração” do compilador, responsável por verificar se a seqüência de símbolos contida no programa fonte forma um programa válido ou não. Como construir um compilador utilizando ferramentas Java – p. 14/2
  • 36. Análise sintática if (a - 10 > b * 2) a = b; O AS deve ser capaz de analisar esse programa e reconhecê-lo como válido. Após a palavra reservada if deve vir um “(” Uma expressão Um “)” Um comando qualquer (por exemplo “a = b”) Como construir um compilador utilizando ferramentas Java – p. 15/2
  • 37. Descrição da linguagem O AS é construído sobre uma gramática livre de contexto que descreve a linguagem fonte. Essa gramática é composta de uma série de regras que descrevem quais são as construções válidas da linguagem. O AS deve aceitar aqueles programas que seguem essas regras e rejeitar – indicando a ocorrência de um erro sintático – aqueles que as violam. Como construir um compilador utilizando ferramentas Java – p. 16/2
  • 38. árvore sintática O AS desempenha ainda outra importante função que é a construção da árvore sintática(árvore de derivação) do programa fonte. Uma árvore sintáticaé uma estrutura em forma de árvore que descreve as construções da linguagem reconhecidas pelo AS no programa fonte. Se o programa fonte possui um comando if como aquele visto há pouco, sua árvore sintática deve espelhar esse fato e descrever como esse comando é formado. Como construir um compilador utilizando ferramentas Java – p. 17/2
  • 39. árvore sintática if > - a = * 10 b a b 2 Como construir um compilador utilizando ferramentas Java – p. 18/2
  • 40. O analisador semântico O analisador semântico (ASem) verifica se os aspectos semânticos do programa estão corretos, ou seja, se não existem incoerências quanto ao significado das construções utilizadas pelo programador. Como construir um compilador utilizando ferramentas Java – p. 19/2
  • 41. O analisador semântico O analisador semântico (ASem) verifica se os aspectos semânticos do programa estão corretos, ou seja, se não existem incoerências quanto ao significado das construções utilizadas pelo programador. Não utiliza mais o programa fonte para fazer tal verificação. Em vez disso, utiliza a árvore sintática como representação do programa. Como construir um compilador utilizando ferramentas Java – p. 19/2
  • 42. Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Como construir um compilador utilizando ferramentas Java – p. 20/2
  • 43. Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Variáveis não declaradas. Como construir um compilador utilizando ferramentas Java – p. 20/2
  • 44. Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Variáveis não declaradas. Redeclaração de variáveis. Como construir um compilador utilizando ferramentas Java – p. 20/2
  • 45. Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Variáveis não declaradas. Redeclaração de variáveis. Chamadas de funções ou métodos com o número incorreto de parâmetros. Como construir um compilador utilizando ferramentas Java – p. 20/2
  • 46. Análise semântica Tipos de operandos incompatíveis com operadores. Se tivermos o comando a = b * c e a variável c foi declarada do tipo string, então o analisador semântico deve apontar um erro semântico, pois esse tipo de operando não é compatível com o operador * Variáveis não declaradas. Redeclaração de variáveis. Chamadas de funções ou métodos com o número incorreto de parâmetros. Comandos colocados fora de contexto. Por exemplo, a utilização de um comando continue fora de um comando de laço deve ser apontada como um erro semântico. Como construir um compilador utilizando ferramentas Java – p. 20/2
  • 47. Erros semânticos Esses erros não são detectados pelo AS, pois não constituem erros sintáticos. De acordo com a gramática da linguagem fonte, uma variável c pode ser utilizada em uma expressão como a = b * c, não importando se foi declarada anteriormente ou não, ou qual é o seu tipo. Como construir um compilador utilizando ferramentas Java – p. 21/2
  • 48. Tabela de símbolos Para desempenhar seu papel, o ASem depende de uma tabela de símbolos. Nela são armazenadas informações de variáveis declaradas, funções ou métodos, tipos ou classes. Ao analisar o comando a = b * c (ou melhor, a árvore sintática correspondente a esse comando), o ASem precisa saber se cada uma das variáveis envolvidas foi previamente declarada e o tipo de cada uma delas. O ASem deve, ao analisar um comando de declaração como int c, incluir na tabela de símbolos a variável c, indicando, entre outras coisas, que seu tipo é int. Como construir um compilador utilizando ferramentas Java – p. 22/2
  • 49. O gerador de código Uma vez verificado que não existem erros sintáticos ou semânticos, o compilador pode realizar sua tarefa, que é a criação do programa objeto. Como construir um compilador utilizando ferramentas Java – p. 23/2
  • 50. O gerador de código Uma vez verificado que não existem erros sintáticos ou semânticos, o compilador pode realizar sua tarefa, que é a criação do programa objeto. O programa objeto reflete, mediante instruções de baixo nível, os comandos do programa fonte. Como cada máquina ou cada plataforma possui um conjunto diferente de instruções e de meios de acesso ao sistema operacional, em geral é necessário que exista um gerador de código distinto para cada plataforma. Como construir um compilador utilizando ferramentas Java – p. 23/2
  • 51. JavaCC Programa é um gerador de compiladores, ou mais precisamente um gerador de analisador sintático. Ele toma como entrada uma gramática e transforma-a num programa Java capaz de analisar um arquivo e dizer se satisfaz ou não as regras especificadas nessa gramática. Ele também oferece facilidades para a construção da árvore sintática. Ao descrever a gramática, pode-se também indicar como a árvore sintática deve ser construída, incorporando-se código para realizar tal tarefa ao analisador sintático gerado. Como construir um compilador utilizando ferramentas Java – p. 24/2
  • 52. Próximo passo Vamos definir uma linguagem de programação que será usada como estudo de caso durante o curso. Ver Capítulo 2 do livro. Como construir um compilador utilizando ferramentas Java – p. 25/2