标题:
BF 科普 & BF 解释器的 JS 实现(3)
[打印本页]
作者:
look_w
时间:
2019-3-11 20:10
标题:
BF 科普 & BF 解释器的 JS 实现(3)
BF 解释器的 JS 函数实现
代码奉上:
function brainLuck(code, input) { // @1
const inputChars = input.split(''); // @2
const codes = code.split(''); // @3
let codeIdx = 0;
const arr = []; // @4
let arrIdx = 0;
let outputStr = ''; // @5
while (codeIdx < code.length) { // @6
const ops = codes[codeIdx];
const handleLeftBracket = () => { // @7
if (~~arr[arrIdx] === 0) {
let cnt = 1;
while (cnt) {
codeIdx++;
if (codes[codeIdx] === '[') {
cnt += 1;
}
if (codes[codeIdx] === ']') {
cnt -= 1;
}
}
}
};
const handleRightBracket = () => { // @8
if (~~arr[arrIdx] !== 0) {
let cnt = 1;
while (cnt) {
codeIdx--;
if (codes[codeIdx] === ']') {
cnt += 1;
}
if (codes[codeIdx] === '[') {
cnt -= 1;
}
}
}
};
switch (ops) { // @9
case '>':
arrIdx += 1;
break;
case '<':
arrIdx -= 1;
break;
case '+':
arr[arrIdx] = (~~arr[arrIdx] + 1) % 256;
break;
case '-':
arr[arrIdx] = (~~arr[arrIdx] || 256) - 1;
break;
case ',':
const iptChar = inputChars.shift();
arr[arrIdx] = iptChar ? iptChar.charCodeAt(0) : arr[arrIdx];
break;
case '.':
outputStr += String.fromCharCode(arr[arrIdx]);
break;
case '[':
handleLeftBracket();
break;
case ']':
handleRightBracket();
break;
}
codeIdx++; // @10
}
return outputStr; // @11
}
实现思路阐述(与代码中注释的序号对应):
(1) 我们实现了一个函数 brainLuck 用以模拟 BF 语言的解释执行,函数 brainLuck 的用例如下:
const code = ',+[-.,+]';
const input = 'Parksben' + String.fromCharCode(255);
const output = brainLuck(code, input);
console.log(output); // -> 'Parksben'
(2) 将输入的字符串切割为单个字符,暂存进数组 inputChars;
(3) 将 BF 程序切割为单个操作符,方便遍历每个指令,用 codeIdx 作为下标进行遍历;
(4) 声明一个数组 arr 用以模拟机器内存,过程产生的数值存储到此数组中;
(5) 用字符串 outputStr 存储程序的输出;
(6) 遍历 BF 运算符,对不同指令进行相应的操作;
(7) 方法 handleLeftBracket,用以匹配到与当前 [ 对应的 ](通过操作下标 codeIdx);
(8) 方法 handleRightBracket,用以匹配到与当前 ] 对应的 [(通过操作下标 codeIdx);
(9) 用以处理不同指令的 switch 语句;
(10) codeIdx 加一,以向前遍历 codes;
(11) 程序输出;
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0