有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 582|回复: 3
收起左侧

[开源]vb.net玩蛋のbrainfuck解释器

[复制链接]

该用户从未签到

5

主题

1

好友

1039

积分

Continue

积分
1039
发表于 2013-2-11 00:34:32 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
首发地址:(我的博客)http://me.ivydom.com/archives/brainfuckinter.html

    Brainfuck是一种极小化的计算机语言
    下面是这八种状态的描述,其中每个状态由一个字符标识:[1]
    字符
           
    含义
    >
           
    指针加一
    <
           
    指针减一
    +
           
    指针指向的字节的值加一
    -
           
    指针指向的字节的值减一
    .
           
    输出指针指向的单元内容(ASCⅡ码)
    ,
           
    输入内容到指针指向的单元(ASCⅡ码)
    [
           
    如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
    ]
           
    如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处
    (按照更节省时间的简单说法,"]“也可以说成“向后跳转到对应的”["状态”。这两解释是一样的。)
    (第三种同价的说法,"["意思是"向前跳转到对应的"]“”,]意思是”向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。")
    Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptr是char*类型):
    Brainfuck
           
    C
    >
           
    ++ptr;
    <
           
    --ptr;
    +
           
    ++*ptr;
    -
           
    --*ptr;
    .
           
    putchar(*ptr);
    ,
           
    *ptr =getchar();
    [
           
    while (*ptr) {
    ]
           
    }
    当前位置清零
    [-] 将当前指针的值归零
    之前位置清零
    [[-]<] 将当前指针以及之前的指针归零
    字符I/O
    ,. 从键盘读取一个字符并输出到屏幕上。
    简单的循环
    ,[.,] 这是一个连续从键盘读取字符并回显到屏幕上的循环。注意,这里假定0表示输入结束,事实上有些系统并非如此。以-1和”未改变”作为判断依据的程序代码分别是”,+[-.,+]“和”,[.[-],]”。
    指针维护
    >,[.>,] 通过移动指针保存所有的输入,供后面的程序使用。
    加法
    [->+<]
    把当前位置的值加到后面的单元中(破坏性的加,它导致左边的单元被归零)。
    以上摘自百度百科
[mw_shl_code=vbnet,true]ublic Class Form1
    Const codes = "+++++[>++++++[>+?<-]<-]"
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Dim aa(4) As Byte
        'putnum(aa, "222")
        execute(codes)
    End Sub
    Sub putnum(ByVal temp() As Byte, ByVal datas As Byte)
        Dim a, tmp As String
        Dim i As Integer
        a = datas.ToString
        For i = 1 To Len(a)
            tmp = Mid(CByte(a), i, 1)
            Debug.WriteLine(tmp)
            temp(i) = Asc(tmp)
            Debug.WriteLine(Asc(tmp))
        Next
        temp(i) = 32
    End Sub
    Sub execute(ByVal codesignal As String)
        Dim length, pcode, pmemory, match, index As Integer
        Dim memory(1024) As Byte
        Dim test As String
        Dim n(1024) As Byte
        Dim myEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("utf-8")
        Dim syllablecode As Byte() = myEncoding.GetBytes(codesignal)
        Debug.WriteLine(syllablecode)
        length = syllablecode.Length
        pcode = 1
        pmemory = 1
        TextBox2.Text = ""
        TextBox1.Focus()
        index = 0
        While pcode <= length
            If syllablecode(pcode) = 60 Then '<
                pmemory -= 1
            ElseIf syllablecode(pcode) = 62 Then '>
                pmemory += 1
            ElseIf syllablecode(pcode) = 43 Then '+
                memory(pmemory) += 1
            ElseIf syllablecode(pcode) = 45 Then '-
                memory(pmemory) -= 1
            ElseIf syllablecode(pcode) = 44 Then ',
                test = InputBox("", , "0")
                memory(pmemory) = Asc(test)
            ElseIf syllablecode(pcode) = 46 Then ',
                n(index) = memory(pmemory)
                TextBox2.Text = n.ToString
            ElseIf syllablecode(pcode) = 91 Then '[
                match = 1
                If memory(pmemory) = 0 Then
                    While pcode <= length
                        pcode += 1
                        If syllablecode(pcode) = 93 Then
                            match -= 1
                            If (match = 0) Then
                                Exit While
                            End If
                        ElseIf syllablecode(pcode) = 91 Then
                            match += 1
                        End If
                    End While
                End If
            ElseIf syllablecode(pcode) = 93 Then ']
                match = 1
                If memory(pmemory) <> 0 Then
                    While pcode > length
                        pcode -= 1
                        If syllablecode(pcode) = 91 Then
                            match -= 1
                            If (match = 0) Then
                                Exit While
                            End If
                        ElseIf syllablecode(pcode) = 93 Then
                            match += 1
                        End If
                    End While
                End If
            ElseIf syllablecode(pcode) = 63 Then '?
                putnum(n, memory(pmemory))
                TextBox2.Text = n.ToString
            Else
                MsgBox("代码有误!")
                Exit While
            End If
            index += 1
            pcode += 1
        End While
    End Sub
End Class[/mw_shl_code]

评分

参与人数 1宅币 +30 贡献 +4 收起 理由
_Nozomi + 30 + 4 o(* ̄▽ ̄*)ブ 发糖

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

7

主题

21

好友

8661

积分

技术宅认证程序员

echo 'hehe'; die();

积分
8661
发表于 2013-2-11 00:37:44 | 显示全部楼层
这语言貌似很碉堡啊,名字看着就霸气,帮顶
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 17 天

连续签到: 1 天

[LV.4]偶尔看看III

298

主题

139

好友

6万

积分

荣誉会员

积分
66622
发表于 2013-2-11 13:34:48 | 显示全部楼层
之前看过这个语言,挺无聊的其实
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

21

主题

63

好友

1万

积分

第一章

积分
18553
发表于 2013-2-11 18:51:27 | 显示全部楼层
虽然不明白,但觉很厉害。。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(基宅) ( 粤ICP备18082987号-1 | 浙公网安备 33010902001746号 )

GMT+8, 2024-5-6 07:57 , Processed in 0.225862 second(s), 20 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表