Compiler bauen

Hallo,
ich würde gerne einen Compiler für die Programmiersprache Brainfuck schreiben.
Ich weiß aber nicht wie ich einen Compiler baue.
Gruß,
Matrix01
 
Ein Compiler erzeugt ein nativ ausführbares Programm, ich denke du willst eher einen Interpreter programmieren?

Der Vorteil von Brainfuck ist natürlich, dass es sehr simpel ist, aber du musst natürlich wissen, wie man diese "einfachen" Instruktionen dann in C umsetzt. Hast du dort eine konkrete Verständnisfrage?

Das hier ist z.B. ein Interpreter in C++ mit nur 105 Zeilen:

http://feider.taurus.uberspace.de/bfip.html

PHP:
#include <iostream>
#include <fstream>
#include <string.h>


int main(int argc, char* argv[])
{
    char filename[1024];
    if(argc>1)
    {
        strcpy(filename, argv[1]);
    }
    else
    {
        std::cout<<"Enter Filename: ";
        std::cin>>filename;
    }
    std::cout<<"Filename: "<<filename<<std::endl;

    std::ifstream file;
    file.open(filename, std::ios::in);
    file.seekg(0, std::ios::end);
    int length = file.tellg();
    file.seekg(0, std::ios::beg);
    char* commands = new char[length];
    file.read(commands, length);
    file.close();
    char* ptr = new char[1048576];
    int i = 0;
    int counter = 0;
    while(i<length-1)
    {
            switch(commands[i])
            {
                case '>':
                    ++ptr;
                    break;
                case '<':
                    --ptr;
                    break;
                case '+':
                    ++*ptr;
                    break;
                case '-':
                    --*ptr;
                    break;
                case '.':
                    putchar(*ptr);
                    break;
                case ',':
                    *ptr=getchar();
                    break;
                case '[':
                    if(*ptr==0)
                    {
                        counter = 1;
                        i++;
                        while(counter>0)
                        {
                            switch(commands[i])
                            {
                                case '[':
                                    counter++;
                                    break;
                                case ']':
                                    counter--;
                                    break;
                                default:
                                    break;
                            }
                            i++;
                        }
                        counter=0;
                    }
                    break;
                case ']':
                    if(*ptr!=0)
                    {
                        counter = 1;
                        i--;
                        while(counter>0)
                        {
                            switch(commands[i])
                            {
                                case '[':
                                    counter--;
                                    break;
                                case ']':
                                    counter++;
                                    break;
                                default:
                                    break;
                            }
                            i--;
                        }
                        counter=0;
                    }
                    break;
                default:
                    break;
            }
            i++;
    }
    putchar('\n');
}
 
Wenn Du zum erlauchten Kreis der Cerebralmonster gehörst, dann kannst Du Dir auch noch sowas wie Yacc, Bison, Flex, Lex angucken, womit man Compiler zu bauen pflegt (bzw. die Parser und Scanner) :)
 
Zurück
Oben