como construir um compilador utilizando ferramentas...

52
Como construir um compilador utilizando ferramentas Java Aula 1 - Introdução Prof. M ´ arcio Delamaro [email protected] Como construir um compilador utilizando ferramentas Java – p. 1/2

Upload: dangdang

Post on 15-Dec-2018

219 views

Category:

Documents


1 download

TRANSCRIPT

Como construir um compilador utilizandoferramentas JavaAula 1 - Introdução

Prof. Marcio [email protected]

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

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

Conteúdo

Introdução à compilação.

Descrição da linguagem X++, utilizada como estudo decaso. Apresenta conceitos básicos sobre linguagens ecomo defini-las.

Análise léxica. Mostra como se utiliza a ferramentaJavaCC para criar um analisador léxico para alinguagem X++.

Análise sintática. Mostra como construir um analisadorsintático para X++ utilizando JavaCC.

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

Conteúdo

Árvore sintática. Mostra como construir a árvoresintática usando o JavaCC e como utilizá-la nas etapasseguintes.

Tabela de símbolos e análise semântica. Mostra comoimplementar uma tabela de símbolos utilizada nachecagem de tipos e validação semântica.

Geração de código. Mostra como utilizar a ferramentaJasmin para gerar o código-objeto (bytecode) Java.

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

O que é um programa?

Seqüência de 0s e 1s.CPU

A

B

C

D

000001002003004005006007

Memória

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

Operações simples

Programa é armazenado na memória.

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

Operações simples

Programa é armazenado na memória.

Programa é executado dentro da CPU por meio deinstruções muito simples.

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

Operações simples

Programa é armazenado na memória.

Programa é executado dentro da CPU por meio deinstruções muito simples.

“Somar posição de memória 100 com posição 101 ecolocar resultado em 102.”

copiar o conteúdo da posição de memória 100 para oregistrador A;copiar o conteúdo da posição de memória 101 para oregistrador B;somar o conteúdo de B em A;copiar o conteúdo de A para a posição de memória102.

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

Linguagens de alto nível

Necessário desenvolver programas num nível deabstração um pouco mais elevado.

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

Linguagens de alto nível

Necessário desenvolver programas num nível deabstração um pouco mais elevado.

Menos dependente das instruções de uma determinadamáquina.

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

Linguagens de alto nível

Necessário desenvolver programas num nível deabstração um pouco mais elevado.

Menos dependente das instruções de uma determinadamáquina.

As linguagens de alto nível substituem as instruções doscomputadores por comandos cujas utilização ecompreensão são mais fáceis

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

Linguagens de alto nível

Necessário desenvolver programas num nível deabstração um pouco mais elevado.

Menos dependente das instruções de uma determinadamáquina.

As linguagens de alto nível substituem as instruções doscomputadores por comandos cujas utilização ecompreensão são mais fáceis

a = b + c

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

Processo de compilação

As linguagens de programação evoluíram

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

Processo de compilação

As linguagens de programação evoluíram

Máquinas continuam as mesmas ou seja, continuamusando instruções de baixo nível

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

Processo de compilação

As linguagens de programação evoluíram

Máquinas continuam as mesmas ou seja, continuamusando instruções de baixo nível

Como usar então uma linguagem de alto nível numamáquina que não a compreende?

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

Processo de compilação

As linguagens de programação evoluíram

Máquinas continuam as mesmas ou seja, continuamusando instruções de baixo nível

Como usar então uma linguagem de alto nível numamáquina que não a compreende?

PROGRAMA

OBJETOCOMPILADOR

PROGRAMA

FONTE

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

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

Analisador léxico

O analisador léxico (AL) encarrega-se de separar noprograma fonte cada símbolo que tenha algum significadopara a linguagem ou de avisar quando um símbolo que nãofaz parte da linguagem é encontrado.

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

Análise léxica

123 x1 ; y2 true begin

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

Análise léxica

123 x1 ; y2 true begin

123 – constante inteira;

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

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/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”;

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

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

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

A descrição da linguagem diz quais são os símbolosválidos e o que significam

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

A descrição da linguagem diz quais são os símbolosválidos e o que significam

Erros léxicos

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

Nem tudo é tão simples

123x1begin(end

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

Nem tudo é tão simples

123x1begin(end

123 – constante inteira;

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

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

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

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

Estados do analisador léxico

"Aqui @ temos uma arroba"

/* Isso é um comentário */

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

Analisador sintático

O AL não se preocupa em verificar se a ordem em queos símbolos aparecem é válida ou não.

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

Analisador sintático

O AL não se preocupa em verificar se a ordem em queos 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ímboloscontida no programa fonte forma um programa válido ounão.

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

Análise sintática

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

O AS deve ser capaz de analisar esse programa ereconhecê-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/25

Descrição da linguagem

O AS é construído sobre uma gramática livre decontexto que descreve a linguagem fonte.

Essa gramática é composta de uma série de regras quedescrevem quais são as construções válidas dalinguagem.

O AS deve aceitar aqueles programas que seguemessas regras e rejeitar – indicando a ocorrência de umerro sintático – aqueles que as violam.

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

árvore sintática

O AS desempenha ainda outra importante função que éa construção da árvore sintática(árvore de derivação) doprograma fonte.

Uma árvore sintáticaé uma estrutura em forma deárvore que descreve as construções da linguagemreconhecidas pelo AS no programa fonte.

Se o programa fonte possui um comando if comoaquele visto há pouco, sua árvore sintática deveespelhar esse fato e descrever como esse comando éformado.

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

árvore sintática

=

a b

if

>

-

a 10 b 2

*

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

O analisador semântico

O analisador semântico (ASem) verifica se os aspectossemânticos do programa estão corretos, ou seja, se nãoexistem incoerências quanto ao significado dasconstruções utilizadas pelo programador.

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

O analisador semântico

O analisador semântico (ASem) verifica se os aspectossemânticos do programa estão corretos, ou seja, se nãoexistem incoerências quanto ao significado dasconstruções utilizadas pelo programador.

Não utiliza mais o programa fonte para fazer talverificação. Em vez disso, utiliza a árvore sintática comorepresentação do programa.

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

Análise semânticaTipos de operandos incompatíveis com operadores. Setivermos o comando a = b * c e a variável c foi declaradado tipo string, então o analisador semântico deveapontar um erro semântico, pois esse tipo de operandonão é compatível com o operador *

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

Análise semânticaTipos de operandos incompatíveis com operadores. Setivermos o comando a = b * c e a variável c foi declaradado tipo string, então o analisador semântico deveapontar um erro semântico, pois esse tipo de operandonão é compatível com o operador *

Variáveis não declaradas.

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

Análise semânticaTipos de operandos incompatíveis com operadores. Setivermos o comando a = b * c e a variável c foi declaradado tipo string, então o analisador semântico deveapontar um erro semântico, pois esse tipo de operandonã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/25

Análise semânticaTipos de operandos incompatíveis com operadores. Setivermos o comando a = b * c e a variável c foi declaradado tipo string, então o analisador semântico deveapontar um erro semântico, pois esse tipo de operandonã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úmeroincorreto de parâmetros.

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

Análise semânticaTipos de operandos incompatíveis com operadores. Setivermos o comando a = b * c e a variável c foi declaradado tipo string, então o analisador semântico deveapontar um erro semântico, pois esse tipo de operandonã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úmeroincorreto de parâmetros.

Comandos colocados fora de contexto. Por exemplo, autilização de um comando continue fora de um comandode laço deve ser apontada como um erro semântico.

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

Erros semânticos

Esses erros não são detectados pelo AS, pois nãoconstituem erros sintáticos. De acordo com a gramática dalinguagem fonte, uma variável c pode ser utilizada em umaexpressão como a = b * c, não importando se foideclarada anteriormente ou não, ou qual é o seu tipo.

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

Tabela de símbolos

Para desempenhar seu papel, o ASem depende de umatabela de símbolos.

Nela são armazenadas informações de variáveisdeclaradas, funções ou métodos, tipos ou classes.

Ao analisar o comando a = b * c (ou melhor, a árvoresintática correspondente a esse comando), o ASemprecisa saber se cada uma das variáveis envolvidas foipreviamente declarada e o tipo de cada uma delas.

O ASem deve, ao analisar um comando de declaraçãocomo 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/25

O gerador de código

Uma vez verificado que não existem erros sintáticos ousemânticos, o compilador pode realizar sua tarefa, que éa criação do programa objeto.

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

O gerador de código

Uma vez verificado que não existem erros sintáticos ousemânticos, o compilador pode realizar sua tarefa, que éa criação do programa objeto.

O programa objeto reflete, mediante instruções de baixonível, os comandos do programa fonte. Como cadamáquina ou cada plataforma possui um conjuntodiferente de instruções e de meios de acesso aosistema operacional, em geral é necessário que existaum gerador de código distinto para cada plataforma.

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

JavaCC

Programa é um gerador de compiladores, ou maisprecisamente um gerador de analisador sintático.

Ele toma como entrada uma gramática e transforma-anum programa Java capaz de analisar um arquivo edizer se satisfaz ou não as regras especificadas nessagramática.

Ele também oferece facilidades para a construção daárvore sintática. Ao descrever a gramática, pode-setambém indicar como a árvore sintática deve serconstruída, incorporando-se código para realizar taltarefa ao analisador sintático gerado.

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

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