首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

BF 科普 & BF 解释器的 JS 实现(3)

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) 程序输出;
返回列表