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
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.