como construir um compilador utilizando ferramentas java€¦ · o analisador léxico (al)...

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: others

Post on 30-Apr-2020

10 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Prof. Marcio [email protected]

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

Page 2: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 3: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 4: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 5: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 6: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

Operações simples

Programa é armazenado na memória.

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

Page 7: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 8: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 9: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 10: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 11: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 12: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 13: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

Processo de compilação

As linguagens de programação evoluíram

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

Page 14: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 15: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 16: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 17: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 18: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 19: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

Análise léxica

123 x1 ; y2 true begin

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

Page 20: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

Análise léxica

123 x1 ; y2 true begin

123 – constante inteira;

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

Page 21: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 22: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 23: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 24: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 25: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 26: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 27: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 28: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

Nem tudo é tão simples

123x1begin(end

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

Page 29: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

Nem tudo é tão simples

123x1begin(end

123 – constante inteira;

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

Page 30: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 31: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 32: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 33: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

Estados do analisador léxico

"Aqui @ temos uma arroba"

/* Isso é um comentário */

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

Page 34: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 35: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 36: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 37: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 38: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

á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

Page 39: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

árvore sintática

=

a b

if

>

-

a 10 b 2

*

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

Page 40: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 41: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 42: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 43: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 44: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 45: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 46: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 47: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 48: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 49: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 50: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 51: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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

Page 52: Como construir um compilador utilizando ferramentas Java€¦ · O analisador léxico (AL) encarrega-se de separar no programa fonte cada símbolo que tenha algum significado para

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