Skip to content

MesihK/mcc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

99 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A Toy Mips C Compiler

MCC is a toy C compiler written using ply https://github.com/dabeaz/ply MCC generates Mips assembly code that can be run with Mars4.5 http://courses.missouristate.edu/kenvollmar/mars/download.htm

Usage: mcc code.c output.asm It can be run with Python 2 or Python 3. Tested with:

  • Python 3.7.3
  • Python 2.7.16

It consist of 2 python source code. First one is mcc. Mcc is lexer and parser that is written by ply. It also generates abstract syntax tree of given C code. Second one is mipsGenerator.py. This code parses abstract syntax tree and generates assembly code.

This project is written for CSE531 at Gebze Technical University.

Features

Here is the list of supported futures:

  • Global - Local variables
  • Int - Char variables
  • Array decleration
  • While loops
  • Do - While loops
  • For loops
  • Binary operations ( +, -, *, /, &, |, ^, -, ~ )
  • If, if - else statements
  • Function definitions
  • Function arguments
  • return statement
  • continue, break statement
  • asm("asm op")
  • printstr("some string")
  • conditional operations ( ==, !=, >=, <=, >, < )
  • pointer decleration, asign access
  • ++ -- operations
  • += -= *= /= |= &= ^= operations
  • // comments

Not Supported Features

Here is the list of not supported futures:

  • Group of conditional operations ( 3 == 2 || 3 !=5 )
  • Floating point numbers.
  • C preprocessing
  • structs
  • enums
  • function pointers
  • switch - case

Test Framework

There is a basic test system for evaluating correctnes of assembly output. Some input output functionality is supported over both misp side and gcc side:

#include<stdio.h>
void printstr(char *str){ printf("%s", str); }
void print_int(int i){ printf("%d",i); }
void print_char(char c){ printf("%c",c); }
char read_char(){ char c; scanf("%c",&c); return c; }
int read_int(){ int i; scanf("%d",&i); return i; }

mips side:

void print_char(char a){ asm("li $v0 11"); asm("syscall"); }
void print_int(int a){ asm("li $v0 1"); asm("syscall"); }
int read_char(){ asm("li $v0 12"); asm("syscall"); }
int read_int(){ asm("li $v0 5"); asm("syscall"); }

Some basic test codes:

  • arr-dec.c
  • arr-op.c
  • arr-print.c
  • binop2.c
  • binop.c
  • char.c
  • conditions.c
  • cont-break.c
  • for.c
  • functions.c
  • if.c
  • if-else.c
  • int-dec.c
  • pointer.c
  • recursion.c
  • return.c
  • while.c

Some example codes:

  • binary-search.c
  • merge-sort.c
  • quick-sort.c

whic is compiled using both gcc and mcc and output compared between two

Test can be run with using tests/test.sh. Please change Mars4.5 location inside script.

Examples

Compiled ASM output of examples can be found at examples folder.

To Run Examples

java -jar ~/Downloads/Mars4_5.jar hanoi.asm

About

A toy MIPS C compiler

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published