diff options
Diffstat (limited to 'godel')
-rw-r--r-- | godel/index.html | 116 | ||||
-rw-r--r-- | godel/js/compiler.js | 22 |
2 files changed, 88 insertions, 50 deletions
diff --git a/godel/index.html b/godel/index.html index 055f13d..1769959 100644 --- a/godel/index.html +++ b/godel/index.html @@ -1,46 +1,82 @@ -<!doctype html> +<!DOCTYPE html> <html> - <head> - <title>Liz's L-Program Compiler</title> - <link rel="stylesheet" type="text/css" href="codemirror/codemirror.css" /> - <link rel="stylesheet" type="text/css" href="css/styles.css" /> - </head> - <body> - <div class="container"> - <h1>Liz's L-Program Compiler</h1> - <p><i>Developed for Kulyukin's CS5000</i></p> - <hr /> - <div class="source-container"> - <div class="textarea-container"> - <h3>L Source</h3> - <textarea id="instructions"> -// asdf -[ B1 ] X1 <- X1 + 1 - IF X1 != 0 GOTO B1 - X1 <- X1 -</textarea - > - <div> - <button id="compile">Compile</button - ><span style="margin-left: 0.5rem" id="compile_status"></span> - </div> +<head> + <title>Liz's L-Program Compiler</title> + <link rel="stylesheet" type="text/css" href= + "codemirror/codemirror.css"> + <link rel="stylesheet" type="text/css" href="css/styles.css"> +</head> +<body> + <div class="container"> + <h1>Liz's L-Program Compiler</h1> + <p><i>Developed for Kulyukin's CS5000</i></p> + <hr> + <div class="source-container"> + <div class="textarea-container"> + <h3>L Source</h3> + <textarea id= + "instructions">// 0. primitive instructions only +// 1. labels match the regex [A-E](:digit:)+. +// 2. variables are initialized to zero +// and match (Y | (X|Z)(:digit:)+). +// 3. instructions must be delimited by a newline. +// 4. anything following the comment token "//" up to a +// newline are ignored. +// 5. by default, a computation that takes more than 500_000 +// "procedures", it will be halted. +// 6. the implicit exit label "E" exists; thus to exit +// prematurely, "GOTO E". +// 7. input your initial snapshot in the "variables" map +// on the Program in the compiled JS output +// 8. for a more detailed view on the grammar, it's at +// /godel/grammar.peg + +// Y <- X1 +[ A1 ] IF X1 != 0 GOTO A2 + GOTO B1 +[ A2 ] X1 <- X1 - 1 + Y <- Y + 1 + GOTO A1 + +// Z1 <- X2 +[ B1 ] IF X2 != 0 GOTO B2 + GOTO C1 +[ B2 ] X2 <- X2 - 1 + Z1 <- Z1 + 1 + GOTO B1 + +// Y <- Y + Z1 +[ C1 ] IF Z1 != 0 GOTO C2 + GOTO E +[ C2 ] Z1 <- Z1 - 1 + Y <- Y + 1 + GOTO C1</textarea> + <div> + <button id="compile">Compile</button> </div> - <div class="textarea-container"> - <h3>Compiled JS</h3> - <textarea id="compiled"></textarea> - <div> - <button id="eval">Eval</button - ><span style="margin-left: 0.5rem" id="eval_status"></span> - </div> + <div> + <span style="margin-left: 0.5rem" id= + "compile_status"></span> + </div> + </div> + <div class="textarea-container"> + <h3>Compiled JS</h3> + <textarea id="compiled"></textarea> + <div> + <button id="eval">Eval</button> + </div> + <div> + <span style="margin-left: 0.5rem" id= + "eval_status"></span> </div> </div> </div> - <script src="codemirror/codemirror.js"></script> - <script src="js-beautify/js-beautify.js"></script> - - <script src="js/observable.js"></script> - <script src="js/parser.js"></script> - <script src="js/compiler.js"></script> - <script src="js/main.js"></script> - </body> + </div> + <script src="codemirror/codemirror.js"></script> + <script src="js-beautify/js-beautify.js"></script> + <script src="js/observable.js"></script> + <script src="js/parser.js"></script> + <script src="js/compiler.js"></script> + <script src="js/main.js"></script> +</body> </html> diff --git a/godel/js/compiler.js b/godel/js/compiler.js index 65ebbcd..e63f5b0 100644 --- a/godel/js/compiler.js +++ b/godel/js/compiler.js @@ -65,7 +65,8 @@ const compile = (ast) => { this.finalInstruction = ${ ast.instructions.length + 1 }; // instruction of the implied "exit" label - this.labelInstructions.set("E", this.finalInstruction); // "E" is the exit label + // "E" is the exit label + this.labelInstructions.set("E", this.finalInstruction); } get(variable) { @@ -106,13 +107,14 @@ const compile = (ast) => { return this.variables.get("Y"); } - run(maxIter=50000) { + run(maxIter=500_000) { let iter = 0; while (!this.isCompleted() && (++iter) < maxIter) this.step(); if (iter < maxIter) { return this.getResult(); } - throw new Error("Iterations went over maxIter=(" + maxIter + "). To resolve, please ask Turing how we can tell if a program will halt during compilation."); + throw new Error("Too many iterations. To resolve, please ask" + + " Turing how we can find if a program will halt during compilation."); } main() { @@ -124,10 +126,10 @@ const compile = (ast) => { const instructionIdx = i + 1; if (line.label) { stringBuilder.add( - `this.instructions.set(${instructionIdx}, () => this.${line.label}());\n`, + `this.instructions.set(${instructionIdx}, () => this.${line.label}());\n` ); stringBuilder.add( - `this.labelInstructions.set("${line.label}", ${instructionIdx});\n`, + `this.labelInstructions.set("${line.label}", ${instructionIdx});\n` ); } } @@ -138,7 +140,7 @@ const compile = (ast) => { const instructionIdx = i + 1; if (instruction.label) { stringBuilder.add( - ` this.followGoto("${instruction.label}");\n}\n\n${instruction.label}() {\n`, + ` this.followGoto("${instruction.label}");\n}\n\n${instruction.label}() {\n` ); stringBuilder.add(`this.instructionPointer = ${instructionIdx};\n`); instruction = instruction.instruction; @@ -152,12 +154,12 @@ const compile = (ast) => { stringBuilder.add("const program = new Program();\n\n"); stringBuilder.add("// set the initial Snapshot here\n"); stringBuilder.add('// program.variables.set("X1", 2);\n\n'); - stringBuilder.add( - "program.run(50_000); // 50_000 is the max iterations before throwing an exception\n", - ); + stringBuilder.add("program.run();\n"); + stringBuilder.add("console.log(program.variables);\n"); + stringBuilder.add("program.getResult();\n"); return js_beautify(stringBuilder.build(), { indent_size: 2, - wrap_line_length: 120, + wrap_line_length: 100, }); }; |