用 Java 构建 BrainFuck 解释器

Brainfuck 仅由八个简单的命令和一个指令指针组成。虽然它是图灵完备的,但它的初衷并不是为了实际应用,而是为了挑战和娱乐程序员。

BrainFuck 仅包含 8 个字符命令,这使得即使执行简单的任务也变得颇具挑战性——

  • > 命令将数据指针向右递增(指向右侧的下一个单元格)。
  • < 命令将数据指针向左递减(指向左侧的下一个单元格)。
  • + 命令将数据指针处的字节递增(加一)。
  • 命令将数据指针处的字节递减(减一)。
  • . 命令输出数据指针处的字节。
  • , 命令接受一个字节的输入,并将其值存储在数据指针处的字节中。
  • [ – 如果数据指针处的字节为零,则不是将指令指针向前移动到下一个命令,而是将其向前跳转到匹配的 ] 命令之后的命令。
  • ] – 如果数据指针处的字节非零,则不是将指令指针向前移动到下一个命令,而是将其向后跳转到匹配的 [ 命令之后的命令。
  • (或者,] 命令也可以被解释为无条件跳转到对应的 [ 命令,反之亦然;程序的行为将保持不变,但由于不必要的双重搜索,运行速度会变慢。)
  • [] 的匹配方式通常与括号一样:每个 [ 精确匹配一个 ],反之亦然,[ 在前,并且两者之间不能有不匹配的 []

> 注意:每个 [ 必须有一个对应的 ],反之亦然。如果不匹配(例如,一个不匹配的 []),解释器将无法执行程序或产生意外结果。正确匹配 [] 对于编写有效的 Brainfuck 程序至关重要。

>

> (或者,] 命令也可以被解释为无条件跳转到对应的 [ 命令,反之亦然;程序的行为将保持不变,但由于不必要的双重搜索,运行速度会变慢。)

>

> [] 的匹配方式通常与括号一样:每个 [ 精确匹配一个 ],反之亦然,[ 在前,并且两者之间不能有不匹配的 []

由于 BrainFuck 仅由这 8 个命令组成,因此为 BrainFuck 构建一个解释器非常简单。在本文中,我们将构建一个简单的程序,它接受 BrainFuck 代码作为输入并产生所需的输出。我们只需将 BrainFuck 代码作为字符串接收,通过解析该字符串并检查每个字符的实际功能来产生输出。内存由一个字节数组表示,模拟最大 65535 位的内存,范围从 0 到 65534(65535 是可以用无符号 16 位二进制数表示的最大数字)。变量 ptr 指的是内存数组的当前索引。

在本文中,我们将不讨论用 BrainFuck 编写程序的细节。有关编写 BrainFuck 程序的更多详细信息,请参阅以下链接:

示例:

Input : 
Output :  Hello World!

Input : 
Output : GEEKS FOR GEEKS

BrainFuck 解释器的 Java 实现-

Java

`

import java.util.*;

class BrainFuck
{
    private static Scanner ob = new Scanner(System.in);
    private static int ptr; // Data pointer
    
    // Max memory limit. It is the highest number which 
    // can be represented by an unsigned 16-bit binary
    // number. Many computer programming environments 
    // beside brainfuck may have predefined
    // constant values representing 65535.
    private static int length = 65535;
    
    // Array of byte type simulating memory of max 
    // 65535 bits from 0 to 65534.
    private static byte memory[] = new byte[length];
    
    // Interpreter function which accepts the code
    // a string parameter
    private static void interpret(String s)
    {
        int c = 0;
        
        // Parsing through each character of the code
        for (int i = 0; i  moves the pointer to the right
            if (s.charAt(i) == ‘>‘)
            {
                if (ptr == length - 1)//If memory is full
                    ptr = 0;//pointer is returned to zero
                else
                    ptr ++;
            }
            
            // < moves the pointer to the left
            else if (s.charAt(i) == '<')
            {
                if (ptr == 0) // If the pointer reaches zero

                    // pointer is returned to rightmost memory
                    // position
                    ptr = length - 1;
                else
                    ptr --;
            }
            
            // + increments the value of the m
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/19826.html
点赞
0.00 平均评分 (0% 分数) - 0