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

  1. Primitive Datentypen und Komplexe Datentypen (int, char, struct, array(int, char))
  2. Kontroll Structuren (if, else, while) mit beliebigen Verschachtelung
  3. Typendefinitionen/Structs (typedef typname aliasname; , typedef struct { int re, int im; } complx; )
  4. Arithmetische und Logische Operatoren (+, -, *, /, %, ==, !=, >, < , >=, <= ||, &&)
  5. Kombinierung von Klammern beliebig nach Infix-Schreibweise
  6. Fehlerbehandlung  für die Erkennung von Syntax-Fehlern im Quell-Code
  7. Arrays (ein Dimensional)
  8. Pointer(&)
  9. Funktionen (mit Call-by-Value und Call-by-Reference)
  10. File I/O (Wird über die VM realisiert, dazu gibt es die FOP (open), FCL (close), FRD (read), FWR (write))
  11. Separate Kompilierung
  12. Symboltabelle
  13. EBNF
  14. Heap
  15. Linker
  16. Objekt-File Generierung
  17. Virtuelle-Maschine
  18. Erzeugung RISC-Code

Detaillierte Information zum Projekt finden Sie unter Download Seite.

Y. Özbek, M. Kleber