gpt4 book ai didi

javascript - 如何制作功能齐全的 Brainf*ck 解释器?

转载 作者:行者123 更新时间:2023-12-04 09:08:49 26 4
gpt4 key购买 nike

我试图在 Javascript 中实现一个 BF 解释器。它适用于许多程序,如打印 Hello world 、循环等。
这是我用于比较输出的示例解释器的链接:https://sange.fi/esoteric/brainfuck/impl/interp/i.html
但是当我尝试运行 BF to C 时程序,它就像陷入无限循环一样卡住了。然而,它确实适用于上面的示例解释器。我究竟做错了什么?
这是一个 BF转换输入的代码 BF代码到 C .

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

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

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

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

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

<[
-[-[>+<-]>]
<[<<<<.>+++.+.+++.-------.>---.++.<.>-.++<<<<.[>]>>>>>>>>>]
<[[<]>++.--[>]>>>>>>>>]
<[<<++..-->>>>>>]
<[<<..>>>>>]
<[<<..-.+>>>>]
<[<<++..---.+>>>]
<[<<<.>>.>>>>>]
<[<<<<-----.+++++>.----.+++.+>---.<<<-.[>]>]
<[<<<<.-----.>++++.<++.+++>----.>---.<<<.-[>]]
<[<<<<<----.>>.<<.+++++.>>>+.++>.>>]
<.>
]>
,]

<<<<<.<+.>++++.<----.>>---.<<<-.>>>+.>.>.[<]>++.[>]<.
这是我的实现:
class Node {
constructor() {
this.value = 0;
this.next = null;
this.prev = null;
}

increment() {
this.value++;
}

decrement() {
this.value--;
}
}


class Memory {
constructor() {
this.current = new Node();
this.outputBuffer = [];
}

moveRight() {
if (this.current.next === null) {
const rightNode = new Node();
rightNode.prev = this.current
this.current.next = rightNode;
}
this.current = this.current.next;
}

moveLeft() {
if (this.current.prev === null) {
const leftNode = new Node()
leftNode.next = this.current;
this.current.prev = leftNode;
}
this.current = this.current.prev;
}

increment() {
this.current.increment();
}

decrement() {
this.current.decrement();
}

print() {
this.outputBuffer.push(String.fromCharCode(this.current.value));
}

input(ch) {
this.current.value = ch.charCodeAt(0);
}
}

class Interpreter {
reset() {
this.memory = new Memory();
this.instructionPointer = 0;
this.inputPointer = 0;
this.openingToClosingBrackets = new Map();
this.closingToOpeningBrackets = new Map();
}

interpret(code, input = "") {
this.reset();
this.code = code;
this.matchSquareBrackets();
this.input = input;

while (!this.reachedEOF()) {
const instruction = this.code[this.instructionPointer];

switch (instruction) {
case "+": this.memory.increment(); break;
case "-": this.memory.decrement(); break;
case ">": this.memory.moveRight(); break;
case "<": this.memory.moveLeft(); break;
case ".": this.memory.print(); break;
case ",": this.memory.input(this.getNextCharacter()); break;
case "[": this.loopStart(); break;
case "]": this.loopEnd(); break;
}
this.instructionPointer++;
}
return this.memory.outputBuffer.join("");
}

reachedEOF() {
return this.instructionPointer >= this.code.length;
}

getNextCharacter() {
if (this.inputPointer >= this.input.length) {
throw new Error("EOF. Expected more input characters.");
}
return this.input[this.inputPointer];
}

loopStart() {
if (this.memory.current.value !== 0) {
return;
}
this.instructionPointer = this.openingToClosingBrackets.get(
this.instructionPointer
);
}

loopEnd() {
if (this.memory.current.value === 0) {
return;
}
this.instructionPointer = this.closingToOpeningBrackets.get(
this.instructionPointer
);
}

matchSquareBrackets() {
const openingStack = [];
for (let i = 0; i < this.code.length; i++) {
const ch = this.code[i];
if (ch === "[") {
openingStack.push(i);
}
if (ch === "]") {
if (openingStack.length === 0) {
throw new Error("No matching '[' for ']' at index: " + i);
}
const openingMatch = openingStack.pop();
this.openingToClosingBrackets.set(openingMatch, i);
this.closingToOpeningBrackets.set(i, openingMatch);
}
}
if (openingStack.length > 0) {
throw new Error(
"No matching ']' for '[' at indices: " + openingStack.join(", ")
);
}
}
}

最佳答案

您的 getNextCharacter工作不正常:如果至少有一个输入字符,它会在每次调用时返回该字符——它永远不会增加输入索引。由于 bf2c 程序不断读取输入,直到没有更多输入,这会导致无限循环。
您的代码的另一个问题是您在 , 时抛出异常。被使用并且没有更多输入,导致 bf2c 在到达输入末尾时异常中止。所以你要么需要用 \0 显式地终止输入,以便 bf2c 程序知道何时停止读取或更改 getNextCharacter返回 '\0'在输入的末尾而不是抛出异常。

关于javascript - 如何制作功能齐全的 Brainf*ck 解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63397166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com