Node.js에서 PEG.js에서 Brainf*ck

Node.js의 Brainf*ck 해석기에서 수행됩니다.PEG.js 사용.
PEG.js를 배우기 위해 해봤어요.PEG.편해요.JS에 익숙해질 거야.
BF 처리 시스템으로서 방법을 강구하려면 실행할 때 명령열에서 순환 블록 문법 [과]의 대응을 스캔하는 것이 아니라/AST 구축을 해석하는 단계에서 문법의 문제로 해결해야 한다.뭐, 일반적으로 말하면 이렇겠지.
수고스럽게도 한 글자를 입력해서 표준고라고 부르면 될 줄 알았는데 찾지 못해서 했다별편 보도.
리퀘어 ("./parser") 에서 PEG.js online 로 생성된parser.js 파일 이름으로 다운로드하여 같은 디렉터리에 저장하십시오.
code = (normal_insn / block_insn / otherchar) *

normal_insn = ch:[><+-.,] { return ch }
block_insn = '[' brk:block ']' { return brk  }

block = cod:code {
  return cod;
}

otherchar = [^><+-.,\[\]] {
  return undefined
}

실행 예:

아래는main입니다.js
const readline = require('readline');
const rl = readline.createInterface({input:process.stdin});
let buf = "";

function getchar() {
  if (buf.length == 0) {
    if (process.stdin.AtEndOfStream) {
      return Promise.resolve(null); // EOF
    }
    return new Promise((resolve, reject) => {
      rl.once('line', (line) => {
        buf = buf + line + "\n";
        resolve(getchar());
      });
    });
  } else {
    const result = buf.charCodeAt(0);
    buf = buf.substring(1);
    return Promise.resolve(result);
  }
}

/*
  code = (normal_insn / block_insn / otherchar) *

  normal_insn = ch:[><+-.,] { return ch }
  block_insn = '[' brk:block ']' { return brk  }

  block = cod:code {
  return cod;
  }

  otherchar = [^><+-.,\[\]] {
  return undefined
  }
*/
// generated with PEG.js from above peg syntax.
const parser = require("./parser.js"); 


const source = `
>>++++++++[->++++++++<]>>>>+++++++++[->++++++++++<]>[<<,[->+<<+<<+>>>]<<<[
->>>+<<<]>>>>>[->+>>+<<<]>[<<[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<->]>-]>>[-<<<+
>>>]<<<<<<<[-<+<<+>>>]<[>>[-<+<<+>>>]<<<[->>>+<<<]>>[[-]>-<]<-]<<[->>>+<<<
]>>>>><[[-]>++++++++++++++++++++++++++++++++>[[-]<------------------------
-------->]<<]>>[-]<.>>]`;

const ast = parser.parse(source);

const memSize = 20;
let ptr = 0;
const memory = Array(memSize).fill(0);

async function run(code, prefix) {
  // console.log("run code=",code,'mem=',memory,'ptr=',ptr);
  for (const i of code) {
    // console.log("  ins=",i);
    if (Array.isArray(i)) {
      while (memory[ptr] !== 0) {
        await run(i, prefix+" ");
      }
    }
    else if (i === '>'){
      ptr += 1;
    }
    else if (i === '<'){
      ptr -= 1;
    }
    else if (i === '+'){
      memory[ptr] += 1;
    }
    else if (i === '-'){
      memory[ptr] -= 1;
    }
    else if (i === '.'){
      process.stdout.write(String.fromCharCode(memory[ptr]));
    }
    else if (i === ','){
      memory[ptr] = await getchar();
    }
  }
}

run(ast, "").then(()=>{
  console.log(memory);
  process.exit()
});

좋은 웹페이지 즐겨찾기