
This is a rather large commit that includes all of the following: - React UI with code editor, runtime renderer and input-output panes - Language providers for a sample language and Brainfuck - Implementation of code execution in a web worker - All-at-once unabortable execution of program fully functional
82 lines
2.6 KiB
TypeScript
82 lines
2.6 KiB
TypeScript
import { MonacoTokensProvider } from "../types";
|
|
|
|
export type BFRS = {
|
|
tape: { [k: number]: number };
|
|
pointer: number;
|
|
};
|
|
|
|
export enum BF_OP {
|
|
LEFT = "<",
|
|
RIGHT = ">",
|
|
INCR = "+",
|
|
DECR = "-",
|
|
OUT = ".",
|
|
IN = ",",
|
|
LOOPIN = "[",
|
|
LOOPOUT = "]",
|
|
}
|
|
|
|
/** A single instruction of the program */
|
|
export type BFInstruction = {
|
|
/** Type of instruction */
|
|
type: BF_OP;
|
|
/** Used for location of opposite end of loops */
|
|
param?: number;
|
|
};
|
|
|
|
/** A single element of the program's AST */
|
|
export type BFAstStep = {
|
|
instr: BFInstruction;
|
|
location: { line: number; char: number };
|
|
};
|
|
|
|
/** Sample program printing "Hello World!" */
|
|
export const sampleProgram = [
|
|
"+++++ +++ Set Cell #0 to 8",
|
|
"[",
|
|
" >++++ Add 4 to Cell #1; this will always set Cell #1 to 4",
|
|
" [ as the cell will be cleared by the loop",
|
|
" >++ Add 4*2 to Cell #2",
|
|
" >+++ Add 4*3 to Cell #3",
|
|
" >+++ Add 4*3 to Cell #4",
|
|
" >+ Add 4 to Cell #5",
|
|
" <<<<- Decrement the loop counter in Cell #1",
|
|
" ] Loop till Cell #1 is zero",
|
|
" >+ Add 1 to Cell #2",
|
|
" >+ Add 1 to Cell #3",
|
|
" >- Subtract 1 from Cell #4",
|
|
" >>+ Add 1 to Cell #6",
|
|
" [<] Move back to the first zero cell you find; this will",
|
|
" be Cell #1 which was cleared by the previous loop",
|
|
" <- Decrement the loop Counter in Cell #0",
|
|
"] Loop till Cell #0 is zero",
|
|
"",
|
|
"The result of this is:",
|
|
"Cell No : 0 1 2 3 4 5 6",
|
|
"Contents: 0 0 72 104 88 32 8",
|
|
"Pointer : ^",
|
|
"",
|
|
">>. Cell #2 has value 72 which is 'H'",
|
|
">---. Subtract 3 from Cell #3 to get 101 which is 'e'",
|
|
"+++++ ++..+++. Likewise for 'llo' from Cell #3",
|
|
">>. Cell #5 is 32 for the space",
|
|
"<-. Subtract 1 from Cell #4 for 87 to give a 'W'",
|
|
"<. Cell #3 was set to 'o' from the end of 'Hello'",
|
|
"+++.----- -.----- ---. Cell #3 for 'rl' and 'd'",
|
|
">>+. Add 1 to Cell #5 gives us an exclamation point",
|
|
">++. And finally a newline from Cell #6",
|
|
].join("\n");
|
|
|
|
/** Tokens provider */
|
|
export const editorTokensProvider: MonacoTokensProvider = {
|
|
tokenizer: {
|
|
root: [
|
|
[/[-\+]/, "operator"],
|
|
[/[<>]/, "annotation"],
|
|
[/[\[\]]/, "keyword"],
|
|
[/[\,\.]/, "type.identifier"],
|
|
],
|
|
},
|
|
defaultToken: "comment",
|
|
};
|