当前位置: 首页 > 知识库问答 >
问题:

我如何实现循环功能在我的大脑他妈的解释器?

辛成周
2023-03-14

这里已经有很多问题了,但我还是会继续。这是一个简单的脑力操翻译。我想出了所有其他符号,但我不知道如何实现循环。有人能帮忙吗?

package com.lang.bfinterpreter;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;


import com.lang.exceptions.TapeSizeExceededException;


public class Interpreter {

    private Interpreter() {
        super();
    }

    private static String getCode(final String inputFile) throws IOException {
        String code = "";
        
        // store the entire code
        final BufferedReader br = new BufferedReader(new FileReader(inputFile));
        for (String line = br.readLine(); line != null; line = br.readLine()) {
            code += line;
        }
        br.close();

        return code;
    }
    
    public static void interpret(final String inputFile) throws IOException,TapeSizeExceededException,IndexOutOfBoundsException {
        // get the program as a string
        final String code = getCode(inputFile);

        // create the Turing tape (static size)
        Character[] tape = new Character[12000];
        Integer indexPointer = 0;
        for (int i = 0; i != 12000; i++) {
            switch (code.toCharArray()[i]) {
                case ',':
                    tape[indexPointer] = (char) System.in.read();
                    break;
                
                case '.':
                    System.out.println(tape[indexPointer]);
                    break;

                case '+':
                    tape[indexPointer]++;
                    break;

                case '-':
                    tape[indexPointer]--;
                    break;

                case '>':
                    if (indexPointer == 11999) {
                        throw new IndexOutOfBoundsException();
                    }
                    else {
                        indexPointer++;
                    }
                    break;

                case '<':
                    if (indexPointer == 0) {
                        throw new IndexOutOfBoundsException();
                    }
                    else {
                        indexPointer--;
                    }
                    break;
                    
                case '[':
                    // I have a feeling I'll need stack to store nested loops   
                    break;
                    
                    case ']':
                    // I have a feeling I'll need stack to store nested loops   
                    break;
                    
                default:
                    break;
            }
        }

    } 
}

我有一种感觉,我需要使用Stack,但我似乎不知道如何使用。我以前构建过表达式计算器。。。这需要同样的逻辑吗?

共有1个答案

祖利
2023-03-14

我想,最具挑战性的部分是找到匹配的括号。找到匹配括号的位置后,只需检查磁带[indexPointer]的值,然后将i设置到它后面的位置,这应该很容易做到。

给定code中索引i处的一个左括号,要找到与其匹配的右括号,只需转到codei的右侧即可。你从一个堆栈开始,堆栈中只有一个[——这就是[i上的[。每当你遇到一个新的[,你就把它推到堆栈上。每当你遇到]时,你从堆栈中弹出一个[——这个]与你弹出的[匹配!当你从堆栈中弹出最后一个[时(即堆栈变空时),你知道你在i处找到了匹配的左括号。

在代码中,您甚至不需要Stack。您可以使用int来编码堆栈中有多少元素-在推送时递增,在弹出时递减。

private static int findMatchingCloseBracketAfterOpenBracket(char[] code, int openBracketIndex) {
    // parameter validations omitted
    int stack = 1;
    for (int i = openBracketIndex + 1; i < code.length ; i++) {
        if (code[i] == '[') {
            stack++;
        } else if (code[i] == ']') {
            stack--;
        }
        if (stack == 0) {
            return i;
        }
    }
    return -1; // brackets not balanced!
}

要找到与之匹配的[],方法是一样的,只不过你要走另一个方向,并反转推送和弹出动作。

private static int findMatchingOpenBracketBeforeCloseBracket(char[] code, int closeBracketIndex) {
    // parameter validations omitted
    int stack = 1;
    for (int i = closeBracketIndex - 1; i >= 0 ; i--) {
        if (code[i] == '[') {
            stack--;
        } else if (code[i] == ']') {
            stack++;
        }
        if (stack == 0) {
            return i;
        }
    }
    return -1; // brackets not balanced!
}

(重构这里的代码复制留给读者作为练习)

 类似资料:
  • 我有一个数据框的苹果股票价格年初至今如下文件名appl。csv 我想把上面的数据转换成一个动物园时间序列对象,这样我就可以使用时间序列分析的力量。我尝试编写如下代码,但没有得到结果。有人能帮我理解我在下面的代码中犯的错误吗? r给出了以下结果 读取错误。zoo(“appl.csv”,format=“%m-%d-%y”,tz=“”,FUN=NULL,:索引在数据行中有145个错误条目:1234561

  • 本文向大家介绍Python循环实现n的全排列功能,包括了Python循环实现n的全排列功能的使用技巧和注意事项,需要的朋友参考一下 描述: 输入一个大于0的整数n,输出1到n的全排列: 例如: 思路: 代码: 总结 以上所述是小编给大家介绍的Python循环实现n的全排列功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持! 如果你觉

  • 我所知道的是: 注释是在java 5中添加的 注释可以在方法、类和属性中使用 注释可以在运行时、类、源代码中使用(我不知道如何使用类和源代码,以及它们的特性) 当java程序运行时,可以实现带有保留的注释,即运行时注释 我想实现一个注释,具有以下特性: > @MyAnnotation(allowMethods={xxx.doSomething}) public void getValue(){}

  • 我正在创建E4 RCP应用程序,因为我有一个部分。我想为我的部分实现“另存为”功能,因为它是为编辑器实现的(例如:Java文件编辑器)。 要求: 当用户单击我的零件时,应启用“另存为”选项 因此,我的问题是,我应该做什么,我必须实现任何扩展点或任何其他?

  • 但我需要一个解释,因为代码的工作方式与预期的不同。 我想在我的网站上有一个链接,用户可以点击whatsapp链接,开始与联系人的对话。 我添加的代码是这样的: null 这段代码在Android和iPhone上都可以使用,但它不允许我添加自定义联系号码: abid只能是已保存在您手机中的联系人的ID,否则它将打开whatsapp中的联系人选择页面 请不要在没有内容解释的情况下分享链接,因为我不是一

  • 我对C语言编程有点陌生,我觉得用C语言做一个brainfuck解释器是学习这门语言的好方法。我可以用这些bf代码编写和测试: 这应该会打印一个hello world 这和预期的一样,所以我认为我的解释器工作得很好,但是当我用你好世界代码的几个变体进行测试时,奇怪的事情发生了。 这个bf代码也应该打印一个hello world,但它会打印出