Você está na página 1de 17

UNIVERSIDADE TECNOLGICA FEDERAL DO PARAN

CAMPUS CORNLIO PROCPIO


ENGENHARIA DA COMPUTAO



RENAN VICENTIN FABRO
VINCIUS AGUIAR MORAES
DAVID PRIMO






RELATRIO DE ERROS





COMPILADOR TIGER





CORNLIO PROCPIO
2014

RENAN VICENTIN FABRO
VINCIUS AGUIAR MORAES
DAVID PRIMO










RELATRIO DE ERROS: COMPILADOR TIGER


Relatrio do trabalho de correo de erros
do compilador Tiger apresentada como
requisito parcial da disciplina de
Compiladores do curso de Engenharia da
computao da Universidade Tecnolgica
Federal do Paran.

Orientador: Prof. Dr. Andre Yoshiaki
Kashiwabara.





CORNLIO PROCPIO
2014



LISTA DE ILUSTRAES


Figura 1 - Cdigo Que Gera .end no Arquivo Assembly ............................................. 7
Figura 2 - Cdigo Corrigido (.end) ............................................................................... 7
Figura 3 - Arquivo Assembly Com o Antigo Erro Gerado ............................................ 8
Figura 4 - Parte do Cdigo do Compilador Onde So Gerados Cdigos Assembly de
Comparao Errados .................................................................................................. 9
Figura 5 - Cdigo do Compilador Com os Erros dos Comparadores Corrigidos ......... 9
Figura 6 - Cdigo Responsavel por Gerar o Assembly Para a Operao de
Subtrao .................................................................................................................. 10
Figura 7 - Cdigo Corrigido da Operao de Subtrao ........................................... 11
Figura 8 - Cdigo que Gera o Erro do Jump ............................................................. 11
Figura 9 - Cdigo Corrigido do Jump ........................................................................ 11
Figura 10 - Exemplo de Cdigo Errado Gerado Pelo Compilador ............................. 13
Figura 11 - Cdigo Com Erro Quando No Existe ELSE .......................................... 15
Figura 12 - Provvel Cdigo Onde Pode Ser Corrigido este Erro de Comparao de
Tipos Diferentes ........................................................................................................ 16




SUMRIO
1 INTRODUO .....................................................................................................6
2 ERROS CORRIGIDOS .........................................................................................7
2.1 ERRO 1 .............................................................................................................7
2.2 ERRO 2 .............................................................................................................8
2.3 ERRO 3 .............................................................................................................10
2.4 ERRO 4 .............................................................................................................11
2.5 ERRO 5 .............................................................................................................12
3 ERROS ENCONTRADOS E NO SOLUCIONADOS ..........................................13
3.1 ERRO NO SOLUCIONADO 1 ........................................................................13
3.2 ERRO NO SOLUCIONADO 2 ........................................................................14
3.3 ERRO NO SOLUCIONADO 3 ........................................................................14
3.4 ERRO NO SOLUCIONADO 4 ........................................................................15
4 CONCLUSO .......................................................................................................17


6
1 INTRODUO
Este trabalho tem como o objetivo desenvolvimento do conhecimento na
rea de compiladores, desenvolvendo e corrigindo um compilador para linguagem
tiger.
A linguagem tiger uma linguagem simples, de fcil didtica muito utilizada
para aprendizado e desenvolvimento de diversas competncias na rea da
computao.
Na disciplina de compiladores, utilizamos a linguagem tiger como base para
desenvolver um compilador como exemplo e aprendizado.
Para desenvolvimento deste compilador, utilizamos o ANTLR, uma api com
uma linguagem prpria utilizada para desenvolvimento de tokens, parses, e assim
desenvolver a parte sinttica de um compilador.
Aps utilizao desta api, utilizamos a linguagem Java, para
desenvolvimento do restante do compilador, onde desenvolvemos o inicio da analise
semntica. Aps isso, foi disponibilizado um cdigo de um compilador para tiger em
Java, que tambm utilizou o ANTLR, desenvolvido para x86, onde havia vrios erros
na analise semntica e gerao de cdigo intermedirio.
Para este trabalho foi proposto que houvesse a alterao da plataforma de
execuo do cdigo, onde, ao invs de utilizar x86 fosse utilizado MIPS, alm da
correo de erros anteriores a modificao.

7
2 ERROS CORRIGIDOS

2.1 ERRO 1
Erro: .end main no comeo do arquivo assembly.
Descrio: Erro encontrado na linha 87 do arquivo Tiger.java onde estava
sendo acrescentado um .end em lugar incorreto.


Figura 1 - Cdigo Que Gera .end no Arquivo Assembly

Correo: Foi removido o .end do out.println ficando
out.println(f.frame.name);


Figura 2 - Cdigo Corrigido (.end)

Neste erro, podemos observar a gerao do cdigo .end no inicio do arquivo
assembly, sendo desnecessrio o mesmo, e podendo causar erros de execuo.
Sendo assim, aps analise do erro, verificamos a insero deste cdigo no arquivo
Tiger.java, no mtodo emitProc(), assim deletamos do compilador a gerao deste
cdigo incorreto.

8

Figura 3 - Arquivo Assembly Com o Antigo Erro Gerado

2.2 ERRO 2
Erro: Erro na leitura do arquivo assembly quando havia algum comparador
lgico como entrada.
Descrio: Na classe Codegen.java dentro do mtodo munchStm(CJUMP
s) a partir da linha 124, todos os comparadores (EQ, NE, LT, LE, GT, GE, ULE,
UGT, ULE, UGE) estavam sendo chamados utilizando a sintaxe de processadores
x86.

9

Figura 4 - Parte do Cdigo do Compilador Onde So Gerados Cdigos Assembly de
Comparao Errados

Correo: Foi alterado para os comparadores equivalentes em linguagem
MIPS.


Figura 5 - Cdigo do Compilador Com os Erros dos Comparadores Corrigidos

Neste erro, foi detectado a gerao de cdigos incompatveis com o padro
assembly para MIPS, onde os cdigos assembly gerados era para o padro x86. Foi
necessrio uma pesquisa para identificao de cdigos assembly que pudessem ser
equivalentes aos anteriores, para arquitetura MIPS.

10

2.3 ERRO 3
Erro: Erro quando a entrada uma operao de subtrao.
Descrio: Na classe Codegen.java dentro do mtodo munchExp(BINOP
e) na linha 295 e 299, o operador de subtrao estava sendo chamado em
linguagem x86.


Figura 6 - Cdigo Responsavel por Gerar o Assembly Para a Operao de Subtrao

Correo: Foi alterado de subi para subu, que a operao equivalente
ao subi em MIPS.

11

Figura 7 - Cdigo Corrigido da Operao de Subtrao

Neste erro, observamos a gerao de um cdigo inexistente para assembly
para Arquitetura MIPS, sendo assim foi necessrio a realizao de uma pesquisa
para encontrar o comando equivalente ao subi, para a arquitetura MIPS.

2.4 ERRO 4
Erro: Jump para false, erro na leitura mips.
Descrio: Na classe Codegen.java nas linhas 158 e 162 est sendo
utilizado o comando JMP o comando de jump da linguagem x86.


Figura 8 - Cdigo que Gera o Erro do Jump

Correo: Foi substituido de JMP para j, que o equivalente em
linguagem mips.


Figura 9 - Cdigo Corrigido do Jump

12
Neste erro, observamos a gerao de um cdigo incompatvel com o padro
para arquitetura MIPS em assembly, onde gerado o cdigo para x86.
Assim sendo, foi necessrio a realizao de uma pesquisa para encontrar
um comando compatvel com JMP, nesse caso j.

2.5 ERRO 5
Erro: Quando a entrada algum comparador estava sendo gerado o arquivo
assembly com o comando munchCJump o qual no reconhecido pelo mips.
Descrio: Na classe Codegen.java nas linhas 113,158,161 e 162 foram
encontrados o comando munchCJump o qual deveria ser apenas um comentrio no
cdigo assembly, porm estava sendo gerado como um comando.
Correo: Foram removidos todos os munchCJump do cdigo.
Neste erro, observamos na gerao do cdigo assembly pelo compilador,
onde em vrios locais do arquivo Codegen.java, onde gerava um comando
munchCJump, que no existe em nenhum dos padres assembly. Acreditamos que
esse comando deveria ser apenas um comentrio. Na figura 4, existem vrios
exemplos de gerao do cdigo informado.


13
3 ERROS ENCONTRADOS E NO SOLUCIONADOS
3.1 ERRO NO SOLUCIONADO 1
Erro: Resultado final errado em operaes de subtrao.
Descrio: Quando a entrada uma operao de subtrao como por
exemplo (1-2+3) o resultado est sendo 4 ao invs de 2, devido ao fato da arvore
semntica esta sendo montada de forma incorreta assim fazendo com que o
primeiro valor a ser passado para o registrador seja o segundo nmero da operao
ficando (2-1+3).


Figura 10 - Exemplo de Cdigo Errado Gerado Pelo Compilador

Possvel correo: Corrigir a forma com que a arvore semntica
montada.
Neste erro, foi possvel observar a gerao de cdigo errado, quando
gerada uma subtrao, invertendo os parmetros, gerando resultados incoerentes
com o esperado.
Realizamos uma primeira tentativa de correo deste erro, invertendo as
ordens dos parmetro e.right e e.left, no cdigo apresentado na figura 7. Nesta
tentativa, conseguimos resolver um erro, quando a expresso utilizada contem
apenas uma operao de subtrao. Porm quando existe uma expresso com
varias subtraes, gerado um erro de construo da rvore sinttica.
Para correo deste erro, seria necessrio, a modificao da logica da
construo da arvore semntica, pois na construo da arvore sinttica esta sendo
gerado o cdigo correto, porem na traduo para cdigo intermedirio onde ocorre
este erro.

14
3.2 ERRO NO SOLUCIONADO 2
Erro: MIPS no consegue interpretar o arquivo assembly quando a entrada
while.
Descrio: Toda vez que a entrada for um while gerado o arquivo
assembly com o comando CMP (linha 113 Codegen) que um comando de
comparao utilizado no x86.
Neste erro foi possvel observar a gerao de um comando CMP, o qual
padro x86. Aps grande pesquisa realizada, no foi possvel encontrar comando
equivalente no padro da arquitetura MIPS.
Nesta arquitetura tambm, os comandos de comparao, j informados
anteriormente, podem realizar a comparao sem a necessidade do CMP assim
como os prprios comandos gerarem o jump. Porm, devido a falta de
conhecimento na lgica destes comandos, no foi possvel gerar estes comandos
corretamente.

3.3 ERRO NO SOLUCIONADO 3
Erro: No est sendo gerado o arquivo assembly quando a entrada uma
estrutura IF que no contm ELSE.
Descrio: Quando "elseclause", na classe SemanticVisitor.java, no
mtodo visit(IfExp), instanciado como 'null' realiza a chamada dos mtodos
"elseclause.getTy()" e "elseclause.getExp()", porm, estes no retornam o valor
esperado devida a "elseclause" ter sido instanciado como 'null'.
Possvel correo: mudana na gerao da arvore semntica do expresso
IF.

15

Figura 11 - Cdigo Com Erro Quando No Existe ELSE

Obs: Quando a expresso de entrada houver "else" o cdigo gerado
corretamente, porm sem a condio do IF, pois a instancia de "elseclause"
diferente de 'null'.
Neste erro foi observado, um erro na execuo do compilador, quando existe
uma expresso do tipo IF que no contem um ELSE. Na analise semntica,
quando executado visitor, gerado um erro, pois a instancia elseclause, da classe
ExpTy, null, assim quando existe a chamada dos mtodos utilizados por essa
instancia, acontece erros.
Houve a tentativa de construir um novo mtodo na classe ExpTy, o qual
retornaria o resultado esperado, mesmo que a instanciao fosse null. Porem para
gerar esse mtodo seria necessrio um grande aprofundamento nas classes do
cdigo como um todo, pois seria necessrio, instanciar varias outras classes, pois
devido a complexidade do compilador como um todo, h grande recursividade entre
as classes, ficando assim invivel a correo deste erro.

3.4 ERRO NO SOLUCIONADO 4
Erro: O compilador est aceitando a comparao entre um inteiro e uma
string.
Descrio: Por exemplo, quando temos na entrada estruturas como: (for
i:=10 to " " do i := i - 1 ) e (3 > "df") o compilador deveria acusar uma mensagem de
erro dizendo no ser possvel tais comparaes, porm no lugar da string est
sendo alocado valores randmicos nos registradores.
16
Neste erro, quando executado um cdigo como os exemplificados acima, o
compilador deveria emitir uma mensagem de erro, informando que no possvel a
comparao de tipos diferentes. Porm, ao invs disso, o compilador transforma a
string, uma representao de inteiro, e realiza a comparao destes valores.


Figura 12 - Provvel Cdigo Onde Pode Ser Corrigido este Erro de Comparao de Tipos
Diferentes

Nesta parte de cdigo do compilador, na classe SemanticVisitor.java, pode
ser o local provvel de correo do erro informado acima, pois h uma comparao
entre os tipos, e onde realizada a coero dos mesmo.
17
4 CONCLUSO
Neste trabalho foi proposta correo de um compilador tiger que estava
vrios bugs utilizando o conhecimento adquirido no projeto anterior que foi
desenvolvido pelos alunos. A correo dos bugs do compilador tiger representou um
importante papel na compreenso da disciplina de Compiladores, onde pudemos
nos concentrar no funcionamento do compilador como um todo, desde a parte lxica
at a gerao do cdigo binrio. Apesar das dificuldades encontradas na correo
dos bugs devido a grande complexidade do projeto, os alunos conseguiram absorver
grande conhecimento terico e prtico no contedo proposto pela disciplina.

Você também pode gostar