Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

VictorCacciari

[Código] Compilador para MIPS

Recommended Posts

Boas pessoal!

Essa semana tive estudando um pouco sobre compiladores e resolvi fazer um...

 

Usei como base o compilador para TINY, de Jack Crenshaw, que escreveu a série de tutoriais "Let's build a Compiler" (link para livro)

O compilador dele é em Pascal, e gera assembly para os 68k...

Eu fiz umas modificações, traduzi para C++ e MIPS xD

Adicionei suporte a strings estáticas e arrays.

 

O compilador traduz códigos escritos em SMALL(a linguagem que tive que inventar) para MIPS assembly.

Download dos fontes: Link

 

Exemplos:

Hello.small

Screenshot: ImageShack_directLink

Código:

program

var ola_mundo string "Hello World!\nfrom SMALL"

begin

    puts ola_mundo

end

fib.small

Screenshot: ImageShack_directLink

Código:

 

 

program

var titulo string "Vamos calcular a sequencia de fibonacci!\n"
var pergunta string "Limite: "
var nl string "\n"

var limit integer, aa integer, bb integer, tmp integer

begin

	puts titulo
	puts pergunta
	read limit
	
	aa = 1
	bb = 1
	
	write 1
	puts nl
	
	while (bb < limit)
		write bb
		puts nl
		
		tmp = aa
		aa = bb
		bb = aa + tmp
	endwhile
end

 

 

BubbleSort.small

Screenshot: ImageShack_directLink

Código:

 

 

program

var title string "Algoritmo Bubble Sort com SMALL\n"
var prompt1 string "Quantos numeros quer ordenar? (max: 10): "
var prompt2 string "Digite um numero: "
var erro1 string "Eu disse que o maximo era 10...\nTente novamente: "
var nl string "\n"

var arr array[11]
var limite integer
var tmp1 integer, tmp2 integer, aux integer, trocou integer

begin

	puts title
	puts prompt1

	while (1=1)
        read limite
        if (limite > 11)
            puts erro1
        else
            break
        endif
    endwhile

	{um array de 10 casas vai de 0 a 9}
	limite = limite-1

    {vamos ler os valores:}
    aux=0
    while (aux < limite) {o operador '<' funciona como '<=', não sei pq... xD }
        puts prompt2
        read arr[aux]
        aux = aux + 1
    endwhile

    {agora começa a ordenação!}
    trocou=1
    while (trocou=1)
        trocou=0
        aux=0
        while (aux < limite-1)
            if (arr[aux] > arr[aux+1])
                tmp1 = arr[aux]
                tmp2 = arr[aux+1]
                arr[aux] = tmp2
                arr[aux+1] = tmp1
                trocou = 1
                break
            endif
            aux = aux + 1
        endwhile
    endwhile

    {ja ordenamos, vamos mostrar os items!}
    puts nl
    puts nl
    puts nl

    aux = 0
    while (aux < limite)
        write arr[aux]
        puts nl
        aux = aux + 1
    endwhile

end

 

 

Para compilar, no linux: "make"

No windows, abra um projeto no code::blocks, coloca todos os arquivos do zip nele e manda compilar.

 

Para usar o compilador:

./MIPSc <arquivo de entrada> <arquivo de saída>

 

Vale a pena lembrar que é preciso um simulador de MIPS para rodar os códigos! =P

 

Não pretendo levar o "projeto" pra frente. Escrevi só para matar a curiosidade que tinha a respeito

de compiladores.

Pra quem quiser aprender mais sobre compiladores aconselho a leitura dos tutoriais do Jack Crenshaw.

 

Abraços!

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Notas:

Operadores suportados:

<

>

=

+, -, *, /

 

condições devem estar entre parenteses:

if (<condição>) ... endif

while (<condição>) ... endwhile

 

* o operator '=' funciona como atribuição E comparação!

* Operadores '<' e '>' funcionam como '<=' e '>=', não sei pq e não consegui arrumar... =/

* comentários entre '{' e '}'

* declaração de variáveis:

Arrays: var <nome> array[<tamanho>]

Strings:var <nome> string "minha string"

Ints: var <nome> integer

 

Acho que é só...

Qualquer dúvida posta ai!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.