مترجم زبان 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 + '۰'),
char(nest + '۰') }), BF_LOOP1);
++nest;
break;
case ']':
--nest;
std::cout << replace_all("$", chars2string({ char(label + '۰'),
char(nest + '۰') }), 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
نویسنده: تمدن
لازم به ذکر است که دامنه cplusplus.ir توسط من تهیه شده و در حال حاضر محتوای سایت را روی وبلاگ بارگذاری کرده ام ;)
برای مشاهدۀ فهرست مطالب به آدرس tamadon.net/cpp مراجعه فرمایید.
دیدگاه خود را ثبت کنید
تمایل دارید در گفتگو شرکت کنید؟نظری بدهید!