در این جا برنامه ای را مشاهده می نمایید که زبان 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
نظرات بعد از بررسی در سایت درج خواهند شد.
مطمئنا از شنیدن انتقادهای شما خوشحال خواهیم شد.
دلیل فیلتر کردن نظرات صرفا جلوگیری از نظرات مغایر با اسلام و جمهوری اسلامی ایران می باشد. امیدواریم ما را به خاطر این کار درک نمایید. با تشکر