- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 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/
我现在正在使用 CK Editor,试图将数据保存到数据库中。然而这个错误出现在控制台中,想确保我没有做错任何事情。 我使用以下 HTML 作为动态 Bootstrap 选项卡系统的一部分,不要认为这
我正在尝试从数据库绑定(bind) CK 编辑器中的数据。但它也不能正常工作,数据获取但不显示,仅在 Google Chrome 中单击检查元素时显示。 HTML JS $(document)
我遇到了使用 ckeditor 的恼人功能. 当您上传图像时,在您的文本内容之间或任何地方,ckeditor 会默认自动填充宽度和高度输入字段,这会导致带有 width 和 height 的 html
我想在 ck 编辑器中添加印地语字体。我在 ckeditor 的 content.css 中添加了以下 css。 font-family: 'kruti_dev_010regular'; src: u
我无法定位我的 ck 编辑器。 下面是JS客户端代码 Template.a.onRendered(function(){ CKEDITOR.replace('b'); $('CKE
CK editor initialization function initEditor(){ CKEDITOR.replace( 'editor1', {
根据我的需要,我需要为不同的 CKEditor 实例设置不同的占位符项。我已将 dialogs\placeholder.js 更改为选择框。我试图通过几种不同的方式添加占位符项目,但我没有运气。我的梦
如何关闭这个底部位?似乎无法在文档中找到它,可以做几乎所有其他事情...... config.??? = false; 男孩女孩明信片上的答案。 :D 最佳答案 config.removePlugin
我正在使用 CK 编辑器。对于我使用 mysql 的数据库。但是,当我单击提交按钮提交表单时,数据库正在更新,但页面没有重定向到其他位置。 column1; if(isset($_POST['
我想要多个textarea(ck编辑器),用户可以在其中输入多个数据,我尝试了jquery的各种功能和方法,例如clone()和 appendTo 但问题是他们正在克隆 textarea 但 cked
有什么方法可以在CK编辑器中的样式菜单打开时获得事件吗? 它在页面中创建了一个 iFame,我需要在它打开时将一个类名注入(inject)到该 iFrame 的 body 标记中.... 最佳答案 您
我正在用 Python 编写 Brainfuck 解释器,我目前正在测试这段代码: ,>++++++[-],[-]<. 使用此输入: 43 波兰维基百科说结果应该是 7,但这里有些地方不对。我应该如何
我如何才能让 ckeditor 的预览按钮将内容发送到服务器,以便我可以在单击预览时在自定义页面中显示它? 最佳答案 除了我们在加载编辑器的页面上有一个预览链接外,我们正在做类似的事情。该方法可用于编
我想测试 CKEditor(富文本)字段是否作为某些业务逻辑的一部分为空。 我不想使用内置的验证功能。 如果 CK 编辑器字段以前有文本,然后删除此文本,则仍有内容,例如 我可以使用
我试图在 Javascript 中实现一个 BF 解释器。它适用于许多程序,如打印 Hello world 、循环等。 这是我用于比较输出的示例解释器的链接:https://sange.fi/esot
我想更改 ckeditor 上的工具菜单选项。 例如我删除了一些我不需要使用的。 我怎样才能做到这一点 ? 最佳答案 有一个配置设置,可让您设置将显示哪些按钮。 您只需创建自己的工具栏布局。我已经包含
我正在使用 javascript ckEditor,我遇到了一个调整大小的问题,这在过去几天一直困扰着我。我有一个名为 ckEditorConfig 的 Angular 对象,我在其中存储我的 ckE
我在网上查了所有的解决方案,都无法修复。 我正在开发一种 CMS,我将 HTML 小部件拖放到 DOM 中,我需要将 CK 编辑器应用于动态生成的元素,但我在这里遇到了一些问题。 下面是放置小部件时触
我在我的应用程序中使用 gwt-ckeditor。我正在使用 GWT 2.5 并且在 GWT 中嵌入了 CKEDITOR。我也有一些包含 CKEditor 的表单字段。当我从一种形式导航到另一种形式时
我在一个页面上有太多的 ckeditors,有人告诉我这是错误的做法。所以,我找到了 Bootstrap Tab Panels 的 stackflow 示例它可以让我减少 ckeditors 的数量,
我是一名优秀的程序员,十分优秀!