add addition l-program
This commit is contained in:
parent
56bf487823
commit
7d897cb2b5
@ -1,46 +1,82 @@
|
|||||||
<!doctype html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Liz's L-Program Compiler</title>
|
<title>Liz's L-Program Compiler</title>
|
||||||
<link rel="stylesheet" type="text/css" href="codemirror/codemirror.css" />
|
<link rel="stylesheet" type="text/css" href=
|
||||||
<link rel="stylesheet" type="text/css" href="css/styles.css" />
|
"codemirror/codemirror.css">
|
||||||
</head>
|
<link rel="stylesheet" type="text/css" href="css/styles.css">
|
||||||
<body>
|
</head>
|
||||||
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1>Liz's L-Program Compiler</h1>
|
<h1>Liz's L-Program Compiler</h1>
|
||||||
<p><i>Developed for Kulyukin's CS5000</i></p>
|
<p><i>Developed for Kulyukin's CS5000</i></p>
|
||||||
<hr />
|
<hr>
|
||||||
<div class="source-container">
|
<div class="source-container">
|
||||||
<div class="textarea-container">
|
<div class="textarea-container">
|
||||||
<h3>L Source</h3>
|
<h3>L Source</h3>
|
||||||
<textarea id="instructions">
|
<textarea id=
|
||||||
// asdf
|
"instructions">// 0. primitive instructions only
|
||||||
[ B1 ] X1 <- X1 + 1
|
// 1. labels match the regex [A-E](:digit:)+.
|
||||||
IF X1 != 0 GOTO B1
|
// 2. variables are initialized to zero
|
||||||
X1 <- X1
|
// and match (Y | (X|Z)(:digit:)+).
|
||||||
</textarea
|
// 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>
|
<div>
|
||||||
<button id="compile">Compile</button
|
<button id="compile">Compile</button>
|
||||||
><span style="margin-left: 0.5rem" id="compile_status"></span>
|
</div>
|
||||||
|
<div>
|
||||||
|
<span style="margin-left: 0.5rem" id=
|
||||||
|
"compile_status"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="textarea-container">
|
<div class="textarea-container">
|
||||||
<h3>Compiled JS</h3>
|
<h3>Compiled JS</h3>
|
||||||
<textarea id="compiled"></textarea>
|
<textarea id="compiled"></textarea>
|
||||||
<div>
|
<div>
|
||||||
<button id="eval">Eval</button
|
<button id="eval">Eval</button>
|
||||||
><span style="margin-left: 0.5rem" id="eval_status"></span>
|
</div>
|
||||||
|
<div>
|
||||||
|
<span style="margin-left: 0.5rem" id=
|
||||||
|
"eval_status"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="codemirror/codemirror.js"></script>
|
<script src="codemirror/codemirror.js"></script>
|
||||||
<script src="js-beautify/js-beautify.js"></script>
|
<script src="js-beautify/js-beautify.js"></script>
|
||||||
|
|
||||||
<script src="js/observable.js"></script>
|
<script src="js/observable.js"></script>
|
||||||
<script src="js/parser.js"></script>
|
<script src="js/parser.js"></script>
|
||||||
<script src="js/compiler.js"></script>
|
<script src="js/compiler.js"></script>
|
||||||
<script src="js/main.js"></script>
|
<script src="js/main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -65,7 +65,8 @@ const compile = (ast) => {
|
|||||||
this.finalInstruction = ${
|
this.finalInstruction = ${
|
||||||
ast.instructions.length + 1
|
ast.instructions.length + 1
|
||||||
}; // instruction of the implied "exit" label
|
}; // 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) {
|
get(variable) {
|
||||||
@ -106,13 +107,14 @@ const compile = (ast) => {
|
|||||||
return this.variables.get("Y");
|
return this.variables.get("Y");
|
||||||
}
|
}
|
||||||
|
|
||||||
run(maxIter=50000) {
|
run(maxIter=500_000) {
|
||||||
let iter = 0;
|
let iter = 0;
|
||||||
while (!this.isCompleted() && (++iter) < maxIter) this.step();
|
while (!this.isCompleted() && (++iter) < maxIter) this.step();
|
||||||
if (iter < maxIter) {
|
if (iter < maxIter) {
|
||||||
return this.getResult();
|
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() {
|
main() {
|
||||||
@ -124,10 +126,10 @@ const compile = (ast) => {
|
|||||||
const instructionIdx = i + 1;
|
const instructionIdx = i + 1;
|
||||||
if (line.label) {
|
if (line.label) {
|
||||||
stringBuilder.add(
|
stringBuilder.add(
|
||||||
`this.instructions.set(${instructionIdx}, () => this.${line.label}());\n`,
|
`this.instructions.set(${instructionIdx}, () => this.${line.label}());\n`
|
||||||
);
|
);
|
||||||
stringBuilder.add(
|
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;
|
const instructionIdx = i + 1;
|
||||||
if (instruction.label) {
|
if (instruction.label) {
|
||||||
stringBuilder.add(
|
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`);
|
stringBuilder.add(`this.instructionPointer = ${instructionIdx};\n`);
|
||||||
instruction = instruction.instruction;
|
instruction = instruction.instruction;
|
||||||
@ -152,12 +154,12 @@ const compile = (ast) => {
|
|||||||
stringBuilder.add("const program = new Program();\n\n");
|
stringBuilder.add("const program = new Program();\n\n");
|
||||||
stringBuilder.add("// set the initial Snapshot here\n");
|
stringBuilder.add("// set the initial Snapshot here\n");
|
||||||
stringBuilder.add('// program.variables.set("X1", 2);\n\n');
|
stringBuilder.add('// program.variables.set("X1", 2);\n\n');
|
||||||
stringBuilder.add(
|
stringBuilder.add("program.run();\n");
|
||||||
"program.run(50_000); // 50_000 is the max iterations before throwing an exception\n",
|
stringBuilder.add("console.log(program.variables);\n");
|
||||||
);
|
stringBuilder.add("program.getResult();\n");
|
||||||
|
|
||||||
return js_beautify(stringBuilder.build(), {
|
return js_beautify(stringBuilder.build(), {
|
||||||
indent_size: 2,
|
indent_size: 2,
|
||||||
wrap_line_length: 120,
|
wrap_line_length: 100,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user