摸鱼第一,干活第二

It's time for BOOM!(ノ≧∀≦)ノ

【黑科技】神奇的Brainfuck

这是一门非常神奇的语言,简单到你甚至可以随便就写出一个解释器。

简单的运算符

一个用来向左移动指针的“<”

一个用来向右移动指针的“>”

一个用来给指针指向单元+1s“+”

一个用来给指针指向单元-1s“-”

一个用来给指针指向单元输入字符ASCII码的“,”

一个用来给指针指向单元输出字符ASCII码的“.”

一对当指针指向单元非零时进行循环的“[”“]”

复杂的功能实现

这种语言其实算是一种图灵机演绎,所以很多计算操作都十分的晦涩难懂

以下是一些常用的功能实现:

1、ASCII转8位整数:

>++++++[-<——–>]

原理很简单,给单元值减去48。

2、8位整数转ASCII

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

原理也很简单,给单元值加上48。

3、单元清空

[-]

原理更加简单,单元值不停减1直到单元值为0。

4、内存迁移

[>+<-]

改变红色的大于小于号数量可以改变内存向右迁移距离,但是两者数量一定要相同

让我们一起来实现一个简单的解释器

因为Brainfuck具有图灵机特性,而且状态不多,使得它解释起来非常简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stack>
#include <string>
#include <cstdlib>
#include <iostream>
using namespace std;

#define MAX_MEMORY_SIZE 0xFFFF//内存大小
#define MEMORY_TYPE int//内存储存类型

int ptr;//内存指针
stack<int> stk;//循环用堆栈
string code;//代码段
MEMORY_TYPE memory[MAX_MEMORY_SIZE];//内存

int main(){
    ios::sync_with_stdio(false);
    cin>>code;
    try{
        for(int i=0;i<code.length();++i)
            switch(code[i]){
                case('<'):
                    ptr>0?--ptr:throw("Segment Fault");
                    break;
                case('>'):
                    ptr<MAX_MEMORY_SIZE?++ptr:throw("Segment Fault");
                    break;
                case('+'):
                    ++memory[ptr];
                    break;
                case('-'):
                    --memory[ptr];
                    break;
                case(','):
                    memory[ptr]=cin.get();
                    break;
                case('.'):
                    cout<<(char)memory[ptr];
                    break;
                case('['):
                    if(memory[ptr])
                        stk.push(i);
                    else{
                        int j=0;
                        do
                            code[i]=='['?++j:(code[i]==']'?--j:0),
                            ++i;
                        while(i<code.length()&&j);
                        !j?throw("Stack Error"):0;
                        --i;
                    }
                    break;
                case(']'):
                    stk.size()>0?(i=stk.top()-1,stk.pop(),0):throw("Stack Error");
                    break;
                default:
                    break;
            }
    }
    catch(const char *err){
        system("cls");
        cout<<err;
        system("pause");
    }
    return 0;
}

【END】

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code