تیم برنامه نویسی گروه تمدن

مرجع کامل فارسی برنامه نویسی به زبان سی پلاس پلاس

  • Increase font size
  • Default font size
  • Decrease font size

مترجم زبان BrainF**kبه زبان C

فرستادن به ایمیل چاپ مشاهده در قالب پی دی اف

در این جا برنامه ای را مشاهده می نمایید که زبان BrainF**k را به C تبدیل می کند. اگرچه کد آن بسیار زشت است اما مهم این است که کار می کند!

سورس کد مترجم:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

#define BF_BUFFER_MIN     "0"
#define BF_BUFFER_MAX "32768"

static const char* BF_HEAD =  "#include <stdint.h>\n"
                              "#include <stdio.h>\n"
                              "\n"
                              "#define BUFFER_MIN " BF_BUFFER_MIN "\n"
                              "#define BUFFER_MAX " BF_BUFFER_MAX "\n"
                              "\n"
                              "int main(void)\n"
                              "{\n"
                              "    static uint8_t buffer[BUFFER_MAX];\n"
                              "    static uint32_t index = 0;\n";
static const char* BF_IPTR =  "    if (index < BUFFER_MAX)\n"
                              "        ++index;\n"
                              "    else\n"
                              "        index = 0;\n";
static const char* BF_DPTR =  "    if (index > BUFFER_MIN)\n"
                              "        --index;\n"
                              "    else\n"
                              "        index = BUFFER_MAX - 1;\n";
static const char* BF_IVAL =  "    ++buffer[index];\n";
static const char* BF_DVAL =  "    --buffer[index];\n";
static const char* BF_PUTC =  "    putchar(buffer[index]);\n";
static const char* BF_GETC =  "    buffer[index] = getchar();\n";
static const char* BF_LOOP1 = "L$a:\n"
                              "    if (buffer[index] == 0)\n"
                              "        goto L$b;\n";
static const char* BF_LOOP2 = "L$b:\n"
                              "    if (buffer[index] != 0)\n"
                              "        goto L$a;\n";
static const char* BF_TAIL =  "    return 0;\n"
                              "}\n";

static std::string replace_all(const std::string& a, const std::string& b, std::string s)
{
    size_t pos = 0;
    while ((pos = s.find(a)) != std::string::npos)
        s.replace(pos, a.size(), b);
    return s;
}

static std::string chars2string(std::vector <char> chars)
{
    std::stringstream sstream;
    for (char c : chars)
        sstream << c;
    return sstream.str();
}

int main()
{
    int c, label = 1, nest = 0;
    std::cout << BF_HEAD;
    while ((c = std::cin.get())) {
        if (std::cin.eof())
            break;
        switch (c) {
        case '>': std::cout << BF_IPTR; break;
        case '<': std::cout << BF_DPTR; break;
        case '+': std::cout << BF_IVAL; break;
        case '-': std::cout << BF_DVAL; break;
        case '.': std::cout << BF_PUTC; break;
        case ',': std::cout << BF_GETC; break;
        case '[':
            std::cout << replace_all("$", chars2string({ char(label + '0'),
                                            char(nest + '0') }), BF_LOOP1);
            ++nest;
            break;
        case ']':
            --nest;
            std::cout << replace_all("$", chars2string({ char(label + '0'),
                                            char(nest + '0') }), BF_LOOP2);
            if (!(nest))
                ++label;
            break;
        default:
            break;
        }
    }
    std::cout << BF_TAIL << std::endl;
    return 0;
}

نمونه ورودی:

[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

خروجی مترجم:

#include <stdint.h>
#include <stdio.h>

#define BUFFER_MIN 0
#define BUFFER_MAX 32768

int main(void)
{
    static uint8_t buffer[BUFFER_MAX];
    static uint32_t index = 0;
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
L10a:
    if (buffer[index] == 0)
        goto L10b;
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    ++buffer[index];
    if (index > BUFFER_MIN)
        --index;
    else
        index = BUFFER_MAX - 1;
    if (index > BUFFER_MIN)
        --index;
    else
        index = BUFFER_MAX - 1;
    if (index > BUFFER_MIN)
        --index;
    else
        index = BUFFER_MAX - 1;
    if (index > BUFFER_MIN)
        --index;
    else
        index = BUFFER_MAX - 1;
    --buffer[index];
L10b:
    if (buffer[index] != 0)
        goto L10a;
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    ++buffer[index];
    ++buffer[index];
    putchar(buffer[index]);
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    ++buffer[index];
    putchar(buffer[index]);
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    putchar(buffer[index]);
    putchar(buffer[index]);
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    putchar(buffer[index]);
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    ++buffer[index];
    ++buffer[index];
    putchar(buffer[index]);
    if (index > BUFFER_MIN)
        --index;
    else
        index = BUFFER_MAX - 1;
    if (index > BUFFER_MIN)
        --index;
    else
        index = BUFFER_MAX - 1;
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    putchar(buffer[index]);
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    putchar(buffer[index]);
    ++buffer[index];
    ++buffer[index];
    ++buffer[index];
    putchar(buffer[index]);
    --buffer[index];
    --buffer[index];
    --buffer[index];
    --buffer[index];
    --buffer[index];
    --buffer[index];
    putchar(buffer[index]);
    --buffer[index];
    --buffer[index];
    --buffer[index];
    --buffer[index];
    --buffer[index];
    --buffer[index];
    --buffer[index];
    --buffer[index];
    putchar(buffer[index]);
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    ++buffer[index];
    putchar(buffer[index]);
    if (index < BUFFER_MAX)
        ++index;
    else
        index = 0;
    putchar(buffer[index]);
    return 0;
}

خروجی برنامه مترجم:

Hello World!

مثال برای حلقه تو در تو:

[[[[[[[[]]]]]]]]

خروجی مترجم:

#include <stdint.h>
#include <stdio.h>

#define BUFFER_MIN 0
#define BUFFER_MAX 32768

int main(void)
{
    static uint8_t buffer[BUFFER_MAX];
    static uint32_t index = 0;
L10a:
    if (buffer[index] == 0)
        goto L10b;
L11a:
    if (buffer[index] == 0)
        goto L11b;
L12a:
    if (buffer[index] == 0)
        goto L12b;
L13a:
    if (buffer[index] == 0)
        goto L13b;
L14a:
    if (buffer[index] == 0)
        goto L14b;
L15a:
    if (buffer[index] == 0)
        goto L15b;
L16a:
    if (buffer[index] == 0)
        goto L16b;
L17a:
    if (buffer[index] == 0)
        goto L17b;
L18a:
    if (buffer[index] == 0)
        goto L18b;
L19a:
    if (buffer[index] == 0)
        goto L19b;
L19b:
    if (buffer[index] != 0)
        goto L19a;
L18b:
    if (buffer[index] != 0)
        goto L18a;
L17b:
    if (buffer[index] != 0)
        goto L17a;
L16b:
    if (buffer[index] != 0)
        goto L16a;
L15b:
    if (buffer[index] != 0)
        goto L15a;
L14b:
    if (buffer[index] != 0)
        goto L14a;
L13b:
    if (buffer[index] != 0)
        goto L13a;
L12b:
    if (buffer[index] != 0)
        goto L12a;
L11b:
    if (buffer[index] != 0)
        goto L11a;
L10b:
    if (buffer[index] != 0)
        goto L10a;
    return 0;
}

منبع: سایت cplusplus.com نوشته chrisname
ترجمه و ویرایش: مرجع فارسی سی پلاس پلاس به آدرس cplusplus.ir

آخرین بروز رسانی مطلب در شنبه ، 1 تیر 1392 ، 05:58  

افزودن نظر

دوست عزیز و کاربر گرامی
نظرات بعد از بررسی در سایت درج خواهند شد.
مطمئنا از شنیدن انتقادهای شما خوشحال خواهیم شد.
دلیل فیلتر کردن نظرات صرفا جلوگیری از نظرات مغایر با اسلام و جمهوری اسلامی ایران می باشد. امیدواریم ما را به خاطر این کار درک نمایید. با تشکر






کد امنیتی
بازنشانی