mimimiC
mimimiC ist ein Compiler, der in der Programmierungssprache C geschriebene Quellcode einliest, analysiert, kompiliert und ausführt. Das Ziel dieses Projektes war es, einen Compiler in Programmierungssprache C zu entwickeln und zu implementieren. Der Compiler ist vollständig in C geschrieben und akzeptiert eine Input-Sprache, die stark an die Programmierungssprache C angelehnt ist. Die Eingabesprache des Compilers ist ein Subset von C. Dabei werden die wichtigsten Features von C unterstützt. mimimiC ist ein nativer Multi-Pass Compiler und erzeugt RISC-Code für die Virtuelle Maschine. Der Compiler wird unter Linux (Debian) entwickelt und läuft derzeit nur unter Linux mit 32-Bit Betriebssystemen.
Die vom mimimiC Compiler unterstützte Schlüsselwörter sind folgendermaßen vordefiniert:
Num. | Schlüsselwort | Bedeutung | Num. | Schlüsselwort | Bedeutung |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#define IDENTIFIER #define INT #define CHAR #define STRUCT #define STRUCTCHARACTER #define ANDOPERATOR #define CHARACTER #define NUMERIC #define STRING #define IF #define ELSE #define WHILE #define TYPEDEF #define INCLUDE #define RETURN #define ERROR #define ENDOFFILE #define HASH #define ADDITION #define SUBTRACTION #define DIVISION |
// var und func. id. // int // char // struct // struct symbol // & // a|…z , A| …|Z // 0|…|9 // string // if // else // while // typedef // include // return // error // Ende der Datei // # // + // - // / |
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#define MULTIPLICATION #define GREATER #define LESSER #define LOGICALAND #define LOGICALOR #define MODULO #define DOT #define COMMA #define SEMICOLON #define LOGICALNOT #define LEFTPARANTHESIS #define RIGHTPARANTHESIS #define LEFTBRACKET #define RIGHTBRACKET #define LEFTBRACE #define RIGHTBRACE #define SINGLEQUOTE #define DOUBLEQUOTE #define ASSIGNMENT #define BACKSLASH #define NULLCHARACTER |
// * // > // < //&& // || // % // . // , // ; // ! // ( // ) // [ // ] // { // } // ‘ // „ // = // \ // null |
Die Output-Sprache, die von mimimiC Virtuelle-Maschine akzeptiert wird:
Befehl | Bedeutung | Befehl | Bedeutung |
ADD | Addition R[a]=R[b]+R[c]; | PSH | Push On Stack R[b]=R[b]-c; int col=(R[b])%4; memory[R[b]/4][col]=R[a]; |
SUB | Subtraction R[a]=R[b]-R[c]; | BEQ | Branch If Equal if(R[a]!=0){nxt=PC+c;} |
MUL | Multiplication R[a]=R[b]*R[c]; | BNE | Branch Not Equal if(R[a]!=0){nxt=PC+c;} |
DIV | Division if(R[c]!=0){R[a]=R[b]/R[c];} | BLT | Branch If Less Than if(R[a]<0){nxt=PC+c;} |
MOD | Modulo R[a]=R[b]%R[c]; | BGE | Branch If Greater Than Or Equal if(R[a]<=0){nxt=PC+c;} |
CMP | Compare R[a]=R[b]-R[c]; | BLE | Branch If Less Than Or Equal if(R[a]==0||R[a]<=0){nxt=PC+c} |
OR | Logical Or R[a]=(R[b]||R[c]); | BGT | Branch If Greater Than if(R[a]>0){nxt=PC+c;} |
AND | Logical And R[a]=(R[b]&&R[c]); | JSR | Jump To Subroutine R[31]=PC+1; nxt= c; |
ADDI | Immediate Addition R[a]=R[b]+c; | RET | Returnnxt=R[c]; |
SUBI | Immediate Subtraction R[a]=R[b]-c; | FOP | File Open |
ANDI | Immediate And R[a]=(R[b]&&c); | FCL | File Close |
LDW | Load Word int col=((R[b]+c))%4; R[a= memory[(R[b]+c)/4][col]; |
FRD | File Read |
POP | Pop On Stack int col=(R[b])%4; R[a= memory[R[b]/4][col]; R[b=R[b]+c; |
FWR | File Write |
STW | Store Word int col=((R[b]+c))%4; memory[(R[b]+c)/4][col]=R[a]; |
Features
- Primitive Datentypen und Komplexe Datentypen (int, char, struct, array(int, char))
- Kontroll Structuren (if, else, while) mit beliebigen Verschachtelung
- Typendefinitionen/Structs (typedef typname aliasname; , typedef struct { int re, int im; } complx; )
- Arithmetische und Logische Operatoren (+, -, *, /, %, ==, !=, >, < , >=, <= ||, &&)
- Kombinierung von Klammern beliebig nach Infix-Schreibweise
- Fehlerbehandlung für die Erkennung von Syntax-Fehlern im Quell-Code
- Arrays (ein Dimensional)
- Pointer(&)
- Funktionen (mit Call-by-Value und Call-by-Reference)
- File I/O (Wird über die VM realisiert, dazu gibt es die FOP (open), FCL (close), FRD (read), FWR (write))
- Separate Kompilierung
- Symboltabelle
- EBNF
- Heap
- Linker
- Objekt-File Generierung
- Virtuelle-Maschine
- Erzeugung RISC-Code
Detaillierte Information zum Projekt finden Sie unter Download Seite.
Y. Özbek, M. Kleber
20.12.2011