Node.js에서 PEG.js에서 Brainf*ck
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()
});
Reference
이 문제에 관하여(Node.js에서 PEG.js에서 Brainf*ck), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/uehaj/items/68fa097e03d0572aefe4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)