My first compiler

MyCC

status

Esse projeto é o resultado da disciplina de MAC5750 Teoria e Construção de Compiladores.

Execução:

Para executar o compilador é muito simples, basta:

make

Note que ele somente funciona no Linux x86. Se você não tem linux, pode usar o Dockerfile presente nos arquivos.

Agora, para compilar um programa e gerar o assembly dele:

./mycc [programa.mycc]

E para executar utilize o gcc.

Notas:

Um dos objetivos desse compilador é extressar o sistema, ou seja, foram usados poucos registradores. Somente foram usados os: rbp, rsp, rdi, rax, rbx (if env var MYCC_NUMBER_OF_REGISTERS is not set).

Você pode setar a variável de ambiente MYCC_NUMBER_OF_REGISTERS para usar de 2 a 12 registradores. Quanto mais, mais rápido seu progrma será.

Passos:

Tudo o código foi construído do zero, tanto o analizador léxido qunato o parser foram feitos.

Para otimizar o tempo de compilação, o lex e o parse são pré construidos e compilados junto com o core do compilador. Foi criada uma linguagem intuitiva que possibilita a descrição do parser e do lexer. Veja os arquivos final/lex.lex e final/parser.par.

O programa pode ser executado com diversas flags, cada uma vai mostrar uma etapa da compilação e o estado que se encontra. Todos os gráficos devem ser gerados utilizando o graphviz. Qunado coloridos, ar cores represemtam o escopo.

Arquivos:

Incapacidades:

Infelizmente esse compilador não aceita vetores e nem realiza coleta de lixo.

Testes:

Program 2 Registers 6 Registers 12 Registers
./2args
./4class_var
./call_empty
./call_merge
./call_recursion
./call_same_class
./class_var
./factorial
./if_false
./if_true
./main
./op_and
./op_div
./op_minus
./op_mod
./op_not
./op_times
./poo_array
./poo_basic
./poo_print
./poo_reference
./print_two_numbers
./sort
./spill
./spill3
./while