summaryrefslogtreecommitdiff
path: root/godel
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth.hunt@simponic.xyz>2023-11-17 10:04:55 -0700
committerElizabeth Hunt <elizabeth.hunt@simponic.xyz>2023-11-17 10:04:55 -0700
commit7d897cb2b5f3292c403700dbac98f79f1052422b (patch)
tree97bd7f9949e0c5730bb821d7569c08b2c36ccdc7 /godel
parent56bf4878236f5464ba19d27b4342fa2a3a99eac6 (diff)
downloadsimponic.xyz-7d897cb2b5f3292c403700dbac98f79f1052422b.tar.gz
simponic.xyz-7d897cb2b5f3292c403700dbac98f79f1052422b.zip
add addition l-program
Diffstat (limited to 'godel')
-rw-r--r--godel/index.html116
-rw-r--r--godel/js/compiler.js22
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 &lt;- X1
+[ A1 ] IF X1 != 0 GOTO A2
+ GOTO B1
+[ A2 ] X1 &lt;- X1 - 1
+ Y &lt;- Y + 1
+ GOTO A1
+
+// Z1 &lt;- X2
+[ B1 ] IF X2 != 0 GOTO B2
+ GOTO C1
+[ B2 ] X2 &lt;- X2 - 1
+ Z1 &lt;- Z1 + 1
+ GOTO B1
+
+// Y &lt;- Y + Z1
+[ C1 ] IF Z1 != 0 GOTO C2
+ GOTO E
+[ C2 ] Z1 &lt;- Z1 - 1
+ Y &lt;- 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,
});
};