Você está na página 1de 52

Como construir um compilador utilizando

ferramentas Java
Aula 1 - Introduo

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

Contedo
Introduo compilao.
Descrio da linguagem X++, utilizada como estudo de
caso. Apresenta conceitos bsicos sobre linguagens e
como defini-las.
Anlise lxica. Mostra como se utiliza a ferramenta
JavaCC para criar um analisador lxico para a
linguagem X++.
Anlise sinttica. Mostra como construir um analisador
sinttico para X++ utilizando JavaCC.

Como construir um compilador utilizando ferramentas Java p. 3/2

Contedo
rvore sinttica. Mostra como construir a rvore
sinttica usando o JavaCC e como utiliz-la nas etapas
seguintes.
Tabela de smbolos e anlise semntica. Mostra como
implementar uma tabela de smbolos utilizada na
checagem de tipos e validao semntica.
Gerao de cdigo. Mostra como utilizar a ferramenta
Jasmin para gerar o cdigo-objeto (bytecode) Java.

Como construir um compilador utilizando ferramentas Java p. 4/2

O que um programa?
Seqncia de 0s e 1s.
CPU
Memria
A
B
C
D

000
001
002
003
004
005
006
007

Como construir um compilador utilizando ferramentas Java p. 5/2

Operaes simples
Programa armazenado na memria.

Como construir um compilador utilizando ferramentas Java p. 6/2

Operaes simples
Programa armazenado na memria.
Programa executado dentro da CPU por meio de
instrues muito simples.

Como construir um compilador utilizando ferramentas Java p. 6/2

Operaes simples
Programa armazenado na memria.
Programa executado dentro da CPU por meio de
instrues muito simples.
Somar posio de memria 100 com posio 101 e
colocar resultado em 102.
copiar o contedo da posio de memria 100 para o
registrador A;
copiar o contedo da posio de memria 101 para o
registrador B;
somar o contedo de B em A;
copiar o contedo de A para a posio de memria
102.

Como construir um compilador utilizando ferramentas Java p. 6/2

Linguagens de alto nvel


Necessrio desenvolver programas num nvel de
abstrao um pouco mais elevado.

Como construir um compilador utilizando ferramentas Java p. 7/2

Linguagens de alto nvel


Necessrio desenvolver programas num nvel de
abstrao um pouco mais elevado.
Menos dependente das instrues de uma determinada
mquina.

Como construir um compilador utilizando ferramentas Java p. 7/2

Linguagens de alto nvel


Necessrio desenvolver programas num nvel de
abstrao um pouco mais elevado.
Menos dependente das instrues de uma determinada
mquina.
As linguagens de alto nvel substituem as instrues dos
computadores por comandos cujas utilizao e
compreenso so mais fceis

Como construir um compilador utilizando ferramentas Java p. 7/2

Linguagens de alto nvel


Necessrio desenvolver programas num nvel de
abstrao um pouco mais elevado.
Menos dependente das instrues de uma determinada
mquina.
As linguagens de alto nvel substituem as instrues dos
computadores por comandos cujas utilizao e
compreenso so mais fceis
a=b+c

Como construir um compilador utilizando ferramentas Java p. 7/2

Processo de compilao
As linguagens de programao evoluram

Como construir um compilador utilizando ferramentas Java p. 8/2

Processo de compilao
As linguagens de programao evoluram
Mquinas continuam as mesmas ou seja, continuam
usando instrues de baixo nvel

Como construir um compilador utilizando ferramentas Java p. 8/2

Processo de compilao
As linguagens de programao evoluram
Mquinas continuam as mesmas ou seja, continuam
usando instrues de baixo nvel
Como usar ento uma linguagem de alto nvel numa
mquina que no a compreende?

Como construir um compilador utilizando ferramentas Java p. 8/2

Processo de compilao
As linguagens de programao evoluram
Mquinas continuam as mesmas ou seja, continuam
usando instrues de baixo nvel
Como usar ento uma linguagem de alto nvel numa
mquina que no a compreende?
PROGRAMA

PROGRAMA

FONTE

OBJETO
COMPILADOR

Como construir um compilador utilizando ferramentas Java p. 8/2

Os componentes de um compilador
o analisador lxico;
o analisador sinttico;
o analisador semntico;
o gerador de cdigo.

Como construir um compilador utilizando ferramentas Java p. 9/2

Analisador lxico
O analisador lxico (AL) encarrega-se de separar no
programa fonte cada smbolo que tenha algum significado
para a linguagem ou de avisar quando um smbolo que no
faz parte da linguagem encontrado.

Como construir um compilador utilizando ferramentas Java p. 10/2

Anlise lxica
123 x1 ; y2 true begin

Como construir um compilador utilizando ferramentas Java p. 11/2

Anlise lxica
123 x1 ; y2 true begin
123 constante inteira;

Como construir um compilador utilizando ferramentas Java p. 11/2

Anlise lxica
123 x1 ; y2 true begin
123 constante inteira;
x1 nome de varivel ou procedimento;

Como construir um compilador utilizando ferramentas Java p. 11/2

Anlise lxica
123 x1 ; y2 true begin
123 constante inteira;
x1 nome de varivel ou procedimento;
; smbolo especial ponto-e-vrgula;

Como construir um compilador utilizando ferramentas Java p. 11/2

Anlise lxica
123 x1 ; y2 true begin
123 constante inteira;
x1 nome de varivel ou procedimento;
; smbolo especial ponto-e-vrgula;
y2 nome de varivel ou procedimento;

Como construir um compilador utilizando ferramentas Java p. 11/2

Anlise lxica
123 x1 ; y2 true begin
123 constante inteira;
x1 nome de varivel ou procedimento;
; smbolo especial ponto-e-vrgula;
y2 nome de varivel ou procedimento;
true constante booleana;

Como construir um compilador utilizando ferramentas Java p. 11/2

Anlise lxica
123 x1 ; y2 true begin
123 constante inteira;
x1 nome de varivel ou procedimento;
; smbolo especial ponto-e-vrgula;
y2 nome de varivel ou procedimento;
true constante booleana;
begin palavra reservada.

Como construir um compilador utilizando ferramentas Java p. 11/2

Anlise lxica
123 x1 ; y2 true begin
123 constante inteira;
x1 nome de varivel ou procedimento;
; smbolo especial ponto-e-vrgula;
y2 nome de varivel ou procedimento;
true constante booleana;
begin palavra reservada.
A descrio da linguagem diz quais so os smbolos
vlidos e o que significam

Como construir um compilador utilizando ferramentas Java p. 11/2

Anlise lxica
123 x1 ; y2 true begin
123 constante inteira;
x1 nome de varivel ou procedimento;
; smbolo especial ponto-e-vrgula;
y2 nome de varivel ou procedimento;
true constante booleana;
begin palavra reservada.
A descrio da linguagem diz quais so os smbolos
vlidos e o que significam
Erros lxicos

Como construir um compilador utilizando ferramentas Java p. 11/2

Nem tudo to simples


123x1begin(end

Como construir um compilador utilizando ferramentas Java p. 12/2

Nem tudo to simples


123x1begin(end
123 constante inteira;

Como construir um compilador utilizando ferramentas Java p. 12/2

Nem tudo to simples


123x1begin(end
123 constante inteira;
x1begin nome de varivel ou procedimento;

Como construir um compilador utilizando ferramentas Java p. 12/2

Nem tudo to simples


123x1begin(end
123 constante inteira;
x1begin nome de varivel ou procedimento;
( smbolo especial abre parnteses;

Como construir um compilador utilizando ferramentas Java p. 12/2

Nem tudo to simples


123x1begin(end
123 constante inteira;
x1begin nome de varivel ou procedimento;
( smbolo especial abre parnteses;
end palavra reservada.

Como construir um compilador utilizando ferramentas Java p. 12/2

Estados do analisador lxico


"Aqui @ temos uma arroba"
/* Isso um comentrio */

Como construir um compilador utilizando ferramentas Java p. 13/2

Analisador sinttico
O AL no se preocupa em verificar se a ordem em que
os smbolos aparecem vlida ou no.

Como construir um compilador utilizando ferramentas Java p. 14/2

Analisador sinttico
O AL no se preocupa em verificar se a ordem em que
os smbolos aparecem vlida ou no.
O analisador sinttico o corao do compilador,
responsvel por verificar se a seqncia de smbolos
contida no programa fonte forma um programa vlido ou
no.

Como construir um compilador utilizando ferramentas Java p. 14/2

Anlise sinttica
if (a - 10 > b * 2)
a = b;

O AS deve ser capaz de analisar esse programa e


reconhec-lo como vlido.
Aps a palavra reservada if deve vir um (
Uma expresso
Um )
Um comando qualquer (por exemplo a = b)

Como construir um compilador utilizando ferramentas Java p. 15/2

Descrio da linguagem
O AS construdo sobre uma gramtica livre de
contexto que descreve a linguagem fonte.
Essa gramtica composta de uma srie de regras que
descrevem quais so as construes vlidas da
linguagem.
O AS deve aceitar aqueles programas que seguem
essas regras e rejeitar indicando a ocorrncia de um
erro sinttico aqueles que as violam.

Como construir um compilador utilizando ferramentas Java p. 16/2

rvore sinttica
O AS desempenha ainda outra importante funo que
a construo da rvore sinttica(rvore de derivao) do
programa fonte.
Uma rvore sinttica uma estrutura em forma de
rvore que descreve as construes da linguagem
reconhecidas pelo AS no programa fonte.
Se o programa fonte possui um comando if como
aquele visto h pouco, sua rvore sinttica deve
espelhar esse fato e descrever como esse comando
formado.

Como construir um compilador utilizando ferramentas Java p. 17/2

rvore sinttica
if

>

10

Como construir um compilador utilizando ferramentas Java p. 18/2

O analisador semntico
O analisador semntico (ASem) verifica se os aspectos
semnticos do programa esto corretos, ou seja, se no
existem incoerncias quanto ao significado das
construes utilizadas pelo programador.

Como construir um compilador utilizando ferramentas Java p. 19/2

O analisador semntico
O analisador semntico (ASem) verifica se os aspectos
semnticos do programa esto corretos, ou seja, se no
existem incoerncias quanto ao significado das
construes utilizadas pelo programador.
No utiliza mais o programa fonte para fazer tal
verificao. Em vez disso, utiliza a rvore sinttica como
representao do programa.

Como construir um compilador utilizando ferramentas Java p. 19/2

Anlise semntica
Tipos de operandos incompatveis com operadores. Se
tivermos o comando a = b * c e a varivel c foi declarada
do tipo string, ento o analisador semntico deve
apontar um erro semntico, pois esse tipo de operando
no compatvel com o operador *

Como construir um compilador utilizando ferramentas Java p. 20/2

Anlise semntica
Tipos de operandos incompatveis com operadores. Se
tivermos o comando a = b * c e a varivel c foi declarada
do tipo string, ento o analisador semntico deve
apontar um erro semntico, pois esse tipo de operando
no compatvel com o operador *
Variveis no declaradas.

Como construir um compilador utilizando ferramentas Java p. 20/2

Anlise semntica
Tipos de operandos incompatveis com operadores. Se
tivermos o comando a = b * c e a varivel c foi declarada
do tipo string, ento o analisador semntico deve
apontar um erro semntico, pois esse tipo de operando
no compatvel com o operador *
Variveis no declaradas.
Redeclarao de variveis.

Como construir um compilador utilizando ferramentas Java p. 20/2

Anlise semntica
Tipos de operandos incompatveis com operadores. Se
tivermos o comando a = b * c e a varivel c foi declarada
do tipo string, ento o analisador semntico deve
apontar um erro semntico, pois esse tipo de operando
no compatvel com o operador *
Variveis no declaradas.
Redeclarao de variveis.
Chamadas de funes ou mtodos com o nmero
incorreto de parmetros.

Como construir um compilador utilizando ferramentas Java p. 20/2

Anlise semntica
Tipos de operandos incompatveis com operadores. Se
tivermos o comando a = b * c e a varivel c foi declarada
do tipo string, ento o analisador semntico deve
apontar um erro semntico, pois esse tipo de operando
no compatvel com o operador *
Variveis no declaradas.
Redeclarao de variveis.
Chamadas de funes ou mtodos com o nmero
incorreto de parmetros.
Comandos colocados fora de contexto. Por exemplo, a
utilizao de um comando continue fora de um comando
de lao deve ser apontada como um erro semntico.

Como construir um compilador utilizando ferramentas Java p. 20/2

Erros semnticos
Esses erros no so detectados pelo AS, pois no
constituem erros sintticos. De acordo com a gramtica da
linguagem fonte, uma varivel c pode ser utilizada em uma
expresso como a = b * c, no importando se foi
declarada anteriormente ou no, ou qual o seu tipo.

Como construir um compilador utilizando ferramentas Java p. 21/2

Tabela de smbolos
Para desempenhar seu papel, o ASem depende de uma
tabela de smbolos.
Nela so armazenadas informaes de variveis
declaradas, funes ou mtodos, tipos ou classes.
Ao analisar o comando a = b * c (ou melhor, a rvore
sinttica correspondente a esse comando), o ASem
precisa saber se cada uma das variveis envolvidas foi
previamente declarada e o tipo de cada uma delas.
O ASem deve, ao analisar um comando de declarao
como int c, incluir na tabela de smbolos a varivel c,
indicando, entre outras coisas, que seu tipo int.

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

O gerador de cdigo
Uma vez verificado que no existem erros sintticos ou
semnticos, o compilador pode realizar sua tarefa, que
a criao do programa objeto.

Como construir um compilador utilizando ferramentas Java p. 23/2

O gerador de cdigo
Uma vez verificado que no existem erros sintticos ou
semnticos, o compilador pode realizar sua tarefa, que
a criao do programa objeto.
O programa objeto reflete, mediante instrues de baixo
nvel, os comandos do programa fonte. Como cada
mquina ou cada plataforma possui um conjunto
diferente de instrues e de meios de acesso ao
sistema operacional, em geral necessrio que exista
um gerador de cdigo 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 sinttico.
Ele toma como entrada uma gramtica e transforma-a
num programa Java capaz de analisar um arquivo e
dizer se satisfaz ou no as regras especificadas nessa
gramtica.
Ele tambm oferece facilidades para a construo da
rvore sinttica. Ao descrever a gramtica, pode-se
tambm indicar como a rvore sinttica deve ser
construda, incorporando-se cdigo para realizar tal
tarefa ao analisador sinttico gerado.

Como construir um compilador utilizando ferramentas Java p. 24/2

Prximo passo
Vamos definir uma linguagem de programao que ser
usada como estudo de caso durante o curso.
Ver Captulo 2 do livro.

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

Você também pode gostar