首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Brainfuck解释器方法

Java Brainfuck解释器方法
EN

Code Review用户
提问于 2016-08-18 04:41:17
回答 1查看 181关注 0票数 4

由于以前没有人发过这篇文章(讽刺),我用java做了一个brainfuck翻译。解释器适合于一个单一的方法,并被设计成可读性、快速性和简洁性,因此请回顾这些内容。我对它进行了测试,以确定它是否有效。

代码语言:javascript
复制
/**
 * Interpret program as a brainfuck program with the given standard input
 * and output.
 * 
 * @throws IOException
 *             if thrown by stdin or stdout
 */
public static void brainfuck(String program, OutputStream stdout, InputStream stdin) throws IOException {
    int[] commands = program.chars().filter(c -> "><+-./[]".indexOf(c) != -1).toArray();
    int commandPointer = 0;
    int[] memory = new int[30_000];
    int memoryPointer = 0;
    while (commandPointer < commands.length) {
        switch (commands[commandPointer]) {
        case '>':
            memoryPointer++;
            if (memoryPointer >= memory.length)
                memoryPointer = 0;
            break;
        case '<':
            memoryPointer--;
            if (memoryPointer < 0)
                memoryPointer = memory.length - 1;
            break;
        case '+':
            memory[memoryPointer]++;
            if (memory[memoryPointer] > 255)
                memory[memoryPointer] = 0;
            break;
        case '-':
            memory[memoryPointer]--;
            if (memory[memoryPointer] < 0)
                memory[memoryPointer] = 255;
            break;
        case '.':
            stdout.write(memory[memoryPointer]);
            break;
        case ',':
            memory[memoryPointer] = stdin.read();
            memory[memoryPointer] %= 256;
            break;
        case '[':
            if (memory[memoryPointer] == 0) {
                int depth = 1;
                while (depth > 0) {
                    commandPointer++;
                    if (commands[commandPointer] == '[')
                        depth++;
                    else if (commands[commandPointer] == ']')
                        depth--;
                }
            }
            break;
        case ']':
            if (memory[memoryPointer] != 0) {
                int depth = 1;
                while (depth > 0) {
                    commandPointer--;
                    if (commands[commandPointer] == ']')
                        depth++;
                    else if (commands[commandPointer] == '[')
                        depth--;
                }
            }
            break;
        }
        commandPointer++;
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2016-09-17 07:45:43

你已经达到了两个目标。翻译是非常可读的和非常简洁的。它非常快,但是可以很容易地变得更快,但是这样代码就会变得更长、更复杂。

如果您希望解释器保持可读性,请保持原样。也许可以在Javadoc中记录环绕语义。

您可以更改的一件事是,,命令只是memory[memoryPointer] = stdin.read() & 0xFF;。这比% 256更常见,因为这是关于比特的规定,而不是算术。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/139015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档