Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
Bem legal!
Na espera da VM bem cool...xP