L-Program and Godel Numbers #3
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
**/.DS_STORE
|
488
godel/codemirror/codemirror.css
Normal file
488
godel/codemirror/codemirror.css
Normal file
@ -0,0 +1,488 @@
|
|||||||
|
/* BASICS */
|
||||||
|
|
||||||
|
.CodeMirror {
|
||||||
|
/* Set height, width, borders, and global font properties here */
|
||||||
|
font-family: monospace !important;
|
||||||
|
height: 300px;
|
||||||
|
color: black;
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* PADDING */
|
||||||
|
|
||||||
|
.CodeMirror-lines {
|
||||||
|
padding: 4px 0; /* Vertical padding around content */
|
||||||
|
}
|
||||||
|
.CodeMirror pre.CodeMirror-line,
|
||||||
|
.CodeMirror pre.CodeMirror-line-like {
|
||||||
|
padding: 0 4px; /* Horizontal padding of content */
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-scrollbar-filler,
|
||||||
|
.CodeMirror-gutter-filler {
|
||||||
|
background-color: white; /* The little square between H and V scrollbars */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* GUTTER */
|
||||||
|
|
||||||
|
.CodeMirror-gutters {
|
||||||
|
border-right: 1px solid #ddd;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.CodeMirror-linenumbers {
|
||||||
|
}
|
||||||
|
.CodeMirror-linenumber {
|
||||||
|
padding: 0 3px 0 5px;
|
||||||
|
min-width: 20px;
|
||||||
|
text-align: right;
|
||||||
|
color: #999;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-guttermarker {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
.CodeMirror-guttermarker-subtle {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CURSOR */
|
||||||
|
|
||||||
|
.CodeMirror-cursor {
|
||||||
|
border-left: 1px solid black;
|
||||||
|
border-right: none;
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
/* Shown when moving in bi-directional text */
|
||||||
|
.CodeMirror div.CodeMirror-secondarycursor {
|
||||||
|
border-left: 1px solid silver;
|
||||||
|
}
|
||||||
|
.cm-fat-cursor .CodeMirror-cursor {
|
||||||
|
width: auto;
|
||||||
|
border: 0 !important;
|
||||||
|
background: #7e7;
|
||||||
|
}
|
||||||
|
.cm-fat-cursor div.CodeMirror-cursors {
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.cm-fat-cursor .CodeMirror-line::selection,
|
||||||
|
.cm-fat-cursor .CodeMirror-line > span::selection,
|
||||||
|
.cm-fat-cursor .CodeMirror-line > span > span::selection {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.cm-fat-cursor .CodeMirror-line::-moz-selection,
|
||||||
|
.cm-fat-cursor .CodeMirror-line > span::-moz-selection,
|
||||||
|
.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.cm-fat-cursor {
|
||||||
|
caret-color: transparent;
|
||||||
|
}
|
||||||
|
@-moz-keyframes blink {
|
||||||
|
0% {
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@-webkit-keyframes blink {
|
||||||
|
0% {
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes blink {
|
||||||
|
0% {
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Can style cursor different in overwrite (non-insert) mode */
|
||||||
|
.CodeMirror-overwrite .CodeMirror-cursor {
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-tab {
|
||||||
|
display: inline-block;
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-rulers {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: -50px;
|
||||||
|
bottom: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.CodeMirror-ruler {
|
||||||
|
border-left: 1px solid #ccc;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* DEFAULT THEME */
|
||||||
|
|
||||||
|
.cm-s-default .cm-header {
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-quote {
|
||||||
|
color: #090;
|
||||||
|
}
|
||||||
|
.cm-negative {
|
||||||
|
color: #d44;
|
||||||
|
}
|
||||||
|
.cm-positive {
|
||||||
|
color: #292;
|
||||||
|
}
|
||||||
|
.cm-header,
|
||||||
|
.cm-strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.cm-em {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.cm-link {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
.cm-strikethrough {
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-s-default .cm-keyword {
|
||||||
|
color: #708;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-atom {
|
||||||
|
color: #219;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-number {
|
||||||
|
color: #164;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-def {
|
||||||
|
color: #00f;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-variable,
|
||||||
|
.cm-s-default .cm-punctuation,
|
||||||
|
.cm-s-default .cm-property,
|
||||||
|
.cm-s-default .cm-operator {
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-variable-2 {
|
||||||
|
color: #05a;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-variable-3,
|
||||||
|
.cm-s-default .cm-type {
|
||||||
|
color: #085;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-comment {
|
||||||
|
color: #a50;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-string {
|
||||||
|
color: #a11;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-string-2 {
|
||||||
|
color: #f50;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-meta {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-qualifier {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-builtin {
|
||||||
|
color: #30a;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-bracket {
|
||||||
|
color: #997;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-tag {
|
||||||
|
color: #170;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-attribute {
|
||||||
|
color: #00c;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-hr {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.cm-s-default .cm-link {
|
||||||
|
color: #00c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-s-default .cm-error {
|
||||||
|
color: #f00;
|
||||||
|
}
|
||||||
|
.cm-invalidchar {
|
||||||
|
color: #f00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-composing {
|
||||||
|
border-bottom: 2px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Default styles for common addons */
|
||||||
|
|
||||||
|
div.CodeMirror span.CodeMirror-matchingbracket {
|
||||||
|
color: #0b0;
|
||||||
|
}
|
||||||
|
div.CodeMirror span.CodeMirror-nonmatchingbracket {
|
||||||
|
color: #a22;
|
||||||
|
}
|
||||||
|
.CodeMirror-matchingtag {
|
||||||
|
background: rgba(255, 150, 0, 0.3);
|
||||||
|
}
|
||||||
|
.CodeMirror-activeline-background {
|
||||||
|
background: #e8f2ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* STOP */
|
||||||
|
|
||||||
|
/* The rest of this file contains styles related to the mechanics of
|
||||||
|
the editor. You probably shouldn't touch them. */
|
||||||
|
|
||||||
|
.CodeMirror {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-scroll {
|
||||||
|
overflow: scroll !important; /* Things will break if this is overridden */
|
||||||
|
/* 50px is the magic margin used to hide the element's real scrollbars */
|
||||||
|
/* See overflow: hidden in .CodeMirror */
|
||||||
|
margin-bottom: -50px;
|
||||||
|
margin-right: -50px;
|
||||||
|
padding-bottom: 50px;
|
||||||
|
height: 100%;
|
||||||
|
outline: none; /* Prevent dragging from highlighting the element */
|
||||||
|
position: relative;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
.CodeMirror-sizer {
|
||||||
|
position: relative;
|
||||||
|
border-right: 50px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The fake, visible scrollbars. Used to force redraw during scrolling
|
||||||
|
before actual scrolling happens, thus preventing shaking and
|
||||||
|
flickering artifacts. */
|
||||||
|
.CodeMirror-vscrollbar,
|
||||||
|
.CodeMirror-hscrollbar,
|
||||||
|
.CodeMirror-scrollbar-filler,
|
||||||
|
.CodeMirror-gutter-filler {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 6;
|
||||||
|
display: none;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.CodeMirror-vscrollbar {
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
.CodeMirror-hscrollbar {
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
overflow-y: hidden;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
.CodeMirror-scrollbar-filler {
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
.CodeMirror-gutter-filler {
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-gutters {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
min-height: 100%;
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
.CodeMirror-gutter {
|
||||||
|
white-space: normal;
|
||||||
|
height: 100%;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
margin-bottom: -50px;
|
||||||
|
}
|
||||||
|
.CodeMirror-gutter-wrapper {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 4;
|
||||||
|
background: none !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
.CodeMirror-gutter-background {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 4;
|
||||||
|
}
|
||||||
|
.CodeMirror-gutter-elt {
|
||||||
|
position: absolute;
|
||||||
|
cursor: default;
|
||||||
|
z-index: 4;
|
||||||
|
}
|
||||||
|
.CodeMirror-gutter-wrapper ::selection {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
.CodeMirror-gutter-wrapper ::-moz-selection {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lines {
|
||||||
|
cursor: text;
|
||||||
|
min-height: 1px; /* prevents collapsing before first draw */
|
||||||
|
}
|
||||||
|
.CodeMirror pre.CodeMirror-line,
|
||||||
|
.CodeMirror pre.CodeMirror-line-like {
|
||||||
|
/* Reset some styles that the rest of the page might have set */
|
||||||
|
-moz-border-radius: 0;
|
||||||
|
-webkit-border-radius: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
border-width: 0;
|
||||||
|
background: transparent;
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
margin: 0;
|
||||||
|
white-space: pre;
|
||||||
|
word-wrap: normal;
|
||||||
|
line-height: inherit;
|
||||||
|
color: inherit;
|
||||||
|
z-index: 2;
|
||||||
|
position: relative;
|
||||||
|
overflow: visible;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
-webkit-font-variant-ligatures: contextual;
|
||||||
|
font-variant-ligatures: contextual;
|
||||||
|
}
|
||||||
|
.CodeMirror-wrap pre.CodeMirror-line,
|
||||||
|
.CodeMirror-wrap pre.CodeMirror-line-like {
|
||||||
|
word-wrap: break-word;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-break: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-linebackground {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-linewidget {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
padding: 0.1px; /* Force widget margins to stay inside of the container */
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-widget {
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-rtl pre {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-code {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Force content-box sizing for the elements where we expect it */
|
||||||
|
.CodeMirror-scroll,
|
||||||
|
.CodeMirror-sizer,
|
||||||
|
.CodeMirror-gutter,
|
||||||
|
.CodeMirror-gutters,
|
||||||
|
.CodeMirror-linenumber {
|
||||||
|
-moz-box-sizing: content-box;
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-measure {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-cursor {
|
||||||
|
position: absolute;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.CodeMirror-measure pre {
|
||||||
|
position: static;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.CodeMirror-cursors {
|
||||||
|
visibility: hidden;
|
||||||
|
position: relative;
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
div.CodeMirror-dragcursors {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-focused div.CodeMirror-cursors {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-selected {
|
||||||
|
background: #d9d9d9;
|
||||||
|
}
|
||||||
|
.CodeMirror-focused .CodeMirror-selected {
|
||||||
|
background: #d7d4f0;
|
||||||
|
}
|
||||||
|
.CodeMirror-crosshair {
|
||||||
|
cursor: crosshair;
|
||||||
|
}
|
||||||
|
.CodeMirror-line::selection,
|
||||||
|
.CodeMirror-line > span::selection,
|
||||||
|
.CodeMirror-line > span > span::selection {
|
||||||
|
background: #d7d4f0;
|
||||||
|
}
|
||||||
|
.CodeMirror-line::-moz-selection,
|
||||||
|
.CodeMirror-line > span::-moz-selection,
|
||||||
|
.CodeMirror-line > span > span::-moz-selection {
|
||||||
|
background: #d7d4f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-searching {
|
||||||
|
background-color: #ffa;
|
||||||
|
background-color: rgba(255, 255, 0, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used to force a border model for a node */
|
||||||
|
.cm-force-border {
|
||||||
|
padding-right: 0.1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
/* Hide the cursor when printing */
|
||||||
|
.CodeMirror div.CodeMirror-cursors {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See issue #2901 */
|
||||||
|
.cm-tab-wrap-hack:after {
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Help users use markselection to safely style text background */
|
||||||
|
span.CodeMirror-selectedtext {
|
||||||
|
background: none;
|
||||||
|
}
|
9874
godel/codemirror/codemirror.js
Normal file
9874
godel/codemirror/codemirror.js
Normal file
File diff suppressed because it is too large
Load Diff
60
godel/css/styles.css
Normal file
60
godel/css/styles.css
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
background: #bbbbbb;
|
||||||
|
border: 1px solid white;
|
||||||
|
border-radius: 0.2rem;
|
||||||
|
padding: 0.3rem;
|
||||||
|
display: inline-block;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
background: #cccccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: "Trebuchet MS", sans-serif;
|
||||||
|
background-color: #aaaaaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
width: 90%;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.textarea-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
|
box-shadow: 5px 5px 5px #666666;
|
||||||
|
border: 2px solid white;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
height: 50vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.success {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border-top: 2px solid black;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
48
godel/grammar.peg
Normal file
48
godel/grammar.peg
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
Program = instructions: Line* {
|
||||||
|
return { instructions: instructions };
|
||||||
|
}
|
||||||
|
|
||||||
|
Line = instruction: (LabeledInstruction / Instruction) _ {
|
||||||
|
return instruction;
|
||||||
|
}
|
||||||
|
|
||||||
|
LabeledInstruction = label:Label _ instruction:Instruction {
|
||||||
|
return { label, instruction };
|
||||||
|
}
|
||||||
|
|
||||||
|
Label = "[" _? label:LABEL_V _? "]" {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instruction = conditional: Conditional { return { conditional }; }
|
||||||
|
/ assignment: Assignment { return { assignment }; }
|
||||||
|
|
||||||
|
Conditional = "IF" _ variable: VAR _ "!=" _ "0" _ "GOTO" _ label: Label {
|
||||||
|
return { variable, label };
|
||||||
|
}
|
||||||
|
|
||||||
|
Assignment = variable: VAR _ "<-" _ expr: Expression {
|
||||||
|
if (expr.left != variable) {
|
||||||
|
error("left hand variable must match right hand");
|
||||||
|
}
|
||||||
|
return { variable, expr };
|
||||||
|
}
|
||||||
|
|
||||||
|
Expression = left: VAR _ opr: OPERATION _ "1" {
|
||||||
|
return { left, opr };
|
||||||
|
}
|
||||||
|
|
||||||
|
VAR = symbol:"Y" { return symbol } / symbol:("X" / "Z") ind:Integer+ {
|
||||||
|
return symbol + ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
OPERATION = "+" / "-"
|
||||||
|
|
||||||
|
LABEL_V = symbol:[A-E] ind:Integer+ {
|
||||||
|
return symbol + ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
Integer "integer"
|
||||||
|
= _ [0-9]+ { return parseInt(text(), 10); }
|
||||||
|
|
||||||
|
_ "whitespace" = [ \t\n\r]* { }
|
35
godel/index.html
Normal file
35
godel/index.html
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>L-Program Compiler</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/styles.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href=
|
||||||
|
"codemirror/codemirror.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>L-Program Compiler</h1>
|
||||||
|
<p><i>Developed for Kulyukin's CS5000</i></p>
|
||||||
|
<hr>
|
||||||
|
<div class="textarea-container">
|
||||||
|
<textarea id="instructions">// asdf
|
||||||
|
q0 B 1 q1
|
||||||
|
q1 1 R q1
|
||||||
|
q1 B 1 q2
|
||||||
|
q2 1 R q2
|
||||||
|
q2 B 1 f</textarea>
|
||||||
|
<div>
|
||||||
|
<button id="compile">Compile</button><span style=
|
||||||
|
"margin-left: 0.5rem" id="compile_status"></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button id="copy_state">Copy State</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="codemirror/codemirror.js"></script>
|
||||||
|
<script src="js/observable.js"></script>
|
||||||
|
<script src="js/parser.js"></script>
|
||||||
|
<script src="js/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
5
godel/js/main.js
Normal file
5
godel/js/main.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
const MESSAGES = {};
|
||||||
|
|
||||||
|
// -- the "real" code
|
||||||
|
|
||||||
|
const state = new Observable();
|
14
godel/js/observable.js
Normal file
14
godel/js/observable.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
class Observable {
|
||||||
|
constructor() {
|
||||||
|
this.observers = [];
|
||||||
|
}
|
||||||
|
subscribe(f) {
|
||||||
|
this.observers.push(f);
|
||||||
|
}
|
||||||
|
unsubscribe(f) {
|
||||||
|
this.observers = this.observers.filter((subscriber) => subscriber !== f);
|
||||||
|
}
|
||||||
|
notify(data) {
|
||||||
|
this.observers.forEach((observer) => observer(data));
|
||||||
|
}
|
||||||
|
}
|
72
godel/js/turing_machine.js
Normal file
72
godel/js/turing_machine.js
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
class TuringMachine {
|
||||||
|
constructor(tape = [], rules = [], initialState = "q0", acceptState = "f") {
|
||||||
|
this.tape = tape;
|
||||||
|
this.rules = this.parseRules(rules);
|
||||||
|
this.state = initialState;
|
||||||
|
this.head = 0;
|
||||||
|
this.acceptState = acceptState;
|
||||||
|
|
||||||
|
this.iteration = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
getStateStatus() {
|
||||||
|
return `State: ${this.state}, Step: ${this.iteration}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHead() {
|
||||||
|
return this.head;
|
||||||
|
}
|
||||||
|
|
||||||
|
getState() {
|
||||||
|
return this.state;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTapeAtCell(idx) {
|
||||||
|
return this.tape[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
setTapeAtCell(idx, val) {
|
||||||
|
this.tape[idx] = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
isAccepting() {
|
||||||
|
return this.state == this.acceptState;
|
||||||
|
}
|
||||||
|
|
||||||
|
parseRules(rules) {
|
||||||
|
const parsedRules = {};
|
||||||
|
for (const [currentState, readSymbol, action, newState] of rules) {
|
||||||
|
const key = `${currentState},${readSymbol}`;
|
||||||
|
const value = `${newState},${action}`;
|
||||||
|
parsedRules[key] = value;
|
||||||
|
}
|
||||||
|
return parsedRules;
|
||||||
|
}
|
||||||
|
|
||||||
|
step() {
|
||||||
|
const currentSymbol = this.tape[this.head];
|
||||||
|
const key = `${this.state},${currentSymbol}`;
|
||||||
|
if (!(key in this.rules)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const rule = this.rules[key];
|
||||||
|
const [newState, action] = rule.split(",");
|
||||||
|
|
||||||
|
this.state = newState;
|
||||||
|
this.iteration++;
|
||||||
|
|
||||||
|
if (action === "R") {
|
||||||
|
this.head += 1;
|
||||||
|
} else if (action === "L") {
|
||||||
|
this.head -= 1;
|
||||||
|
} else {
|
||||||
|
this.tape[this.head] = action;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.isAccepting()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.head >= 0 && this.head < this.tape.length;
|
||||||
|
}
|
||||||
|
}
|
931
godel/parser.js
Normal file
931
godel/parser.js
Normal file
@ -0,0 +1,931 @@
|
|||||||
|
module.exports = /*
|
||||||
|
* Generated by PEG.js 0.10.0.
|
||||||
|
*
|
||||||
|
* http://pegjs.org/
|
||||||
|
*/
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function peg$subclass(child, parent) {
|
||||||
|
function ctor() { this.constructor = child; }
|
||||||
|
ctor.prototype = parent.prototype;
|
||||||
|
child.prototype = new ctor();
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$SyntaxError(message, expected, found, location) {
|
||||||
|
this.message = message;
|
||||||
|
this.expected = expected;
|
||||||
|
this.found = found;
|
||||||
|
this.location = location;
|
||||||
|
this.name = "SyntaxError";
|
||||||
|
|
||||||
|
if (typeof Error.captureStackTrace === "function") {
|
||||||
|
Error.captureStackTrace(this, peg$SyntaxError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
peg$subclass(peg$SyntaxError, Error);
|
||||||
|
|
||||||
|
peg$SyntaxError.buildMessage = function(expected, found) {
|
||||||
|
var DESCRIBE_EXPECTATION_FNS = {
|
||||||
|
literal: function(expectation) {
|
||||||
|
return "\"" + literalEscape(expectation.text) + "\"";
|
||||||
|
},
|
||||||
|
|
||||||
|
"class": function(expectation) {
|
||||||
|
var escapedParts = "",
|
||||||
|
i;
|
||||||
|
|
||||||
|
for (i = 0; i < expectation.parts.length; i++) {
|
||||||
|
escapedParts += expectation.parts[i] instanceof Array
|
||||||
|
? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])
|
||||||
|
: classEscape(expectation.parts[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
|
||||||
|
},
|
||||||
|
|
||||||
|
any: function(expectation) {
|
||||||
|
return "any character";
|
||||||
|
},
|
||||||
|
|
||||||
|
end: function(expectation) {
|
||||||
|
return "end of input";
|
||||||
|
},
|
||||||
|
|
||||||
|
other: function(expectation) {
|
||||||
|
return expectation.description;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function hex(ch) {
|
||||||
|
return ch.charCodeAt(0).toString(16).toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function literalEscape(s) {
|
||||||
|
return s
|
||||||
|
.replace(/\\/g, '\\\\')
|
||||||
|
.replace(/"/g, '\\"')
|
||||||
|
.replace(/\0/g, '\\0')
|
||||||
|
.replace(/\t/g, '\\t')
|
||||||
|
.replace(/\n/g, '\\n')
|
||||||
|
.replace(/\r/g, '\\r')
|
||||||
|
.replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
|
||||||
|
.replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); });
|
||||||
|
}
|
||||||
|
|
||||||
|
function classEscape(s) {
|
||||||
|
return s
|
||||||
|
.replace(/\\/g, '\\\\')
|
||||||
|
.replace(/\]/g, '\\]')
|
||||||
|
.replace(/\^/g, '\\^')
|
||||||
|
.replace(/-/g, '\\-')
|
||||||
|
.replace(/\0/g, '\\0')
|
||||||
|
.replace(/\t/g, '\\t')
|
||||||
|
.replace(/\n/g, '\\n')
|
||||||
|
.replace(/\r/g, '\\r')
|
||||||
|
.replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
|
||||||
|
.replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); });
|
||||||
|
}
|
||||||
|
|
||||||
|
function describeExpectation(expectation) {
|
||||||
|
return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
|
||||||
|
}
|
||||||
|
|
||||||
|
function describeExpected(expected) {
|
||||||
|
var descriptions = new Array(expected.length),
|
||||||
|
i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < expected.length; i++) {
|
||||||
|
descriptions[i] = describeExpectation(expected[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
descriptions.sort();
|
||||||
|
|
||||||
|
if (descriptions.length > 0) {
|
||||||
|
for (i = 1, j = 1; i < descriptions.length; i++) {
|
||||||
|
if (descriptions[i - 1] !== descriptions[i]) {
|
||||||
|
descriptions[j] = descriptions[i];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
descriptions.length = j;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (descriptions.length) {
|
||||||
|
case 1:
|
||||||
|
return descriptions[0];
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
return descriptions[0] + " or " + descriptions[1];
|
||||||
|
|
||||||
|
default:
|
||||||
|
return descriptions.slice(0, -1).join(", ")
|
||||||
|
+ ", or "
|
||||||
|
+ descriptions[descriptions.length - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function describeFound(found) {
|
||||||
|
return found ? "\"" + literalEscape(found) + "\"" : "end of input";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
|
||||||
|
};
|
||||||
|
|
||||||
|
function peg$parse(input, options) {
|
||||||
|
options = options !== void 0 ? options : {};
|
||||||
|
|
||||||
|
var peg$FAILED = {},
|
||||||
|
|
||||||
|
peg$startRuleFunctions = { Program: peg$parseProgram },
|
||||||
|
peg$startRuleFunction = peg$parseProgram,
|
||||||
|
|
||||||
|
peg$c0 = function(instructions) {
|
||||||
|
return { instructions: instructions };
|
||||||
|
},
|
||||||
|
peg$c1 = function(instruction) {
|
||||||
|
return instruction;
|
||||||
|
},
|
||||||
|
peg$c2 = function(label, instruction) {
|
||||||
|
return { label, instruction };
|
||||||
|
},
|
||||||
|
peg$c3 = "[",
|
||||||
|
peg$c4 = peg$literalExpectation("[", false),
|
||||||
|
peg$c5 = "]",
|
||||||
|
peg$c6 = peg$literalExpectation("]", false),
|
||||||
|
peg$c7 = function(label) {
|
||||||
|
return label;
|
||||||
|
},
|
||||||
|
peg$c8 = function(conditional) { return { conditional }; },
|
||||||
|
peg$c9 = function(assignment) { return { assignment }; },
|
||||||
|
peg$c10 = "IF",
|
||||||
|
peg$c11 = peg$literalExpectation("IF", false),
|
||||||
|
peg$c12 = "!=",
|
||||||
|
peg$c13 = peg$literalExpectation("!=", false),
|
||||||
|
peg$c14 = "0",
|
||||||
|
peg$c15 = peg$literalExpectation("0", false),
|
||||||
|
peg$c16 = "GOTO",
|
||||||
|
peg$c17 = peg$literalExpectation("GOTO", false),
|
||||||
|
peg$c18 = function(variable, label) {
|
||||||
|
return { variable, label };
|
||||||
|
},
|
||||||
|
peg$c19 = "<-",
|
||||||
|
peg$c20 = peg$literalExpectation("<-", false),
|
||||||
|
peg$c21 = function(variable, expr) {
|
||||||
|
if (expr.left != variable) {
|
||||||
|
error("left hand variable must match right hand");
|
||||||
|
}
|
||||||
|
return { variable, expr };
|
||||||
|
},
|
||||||
|
peg$c22 = "1",
|
||||||
|
peg$c23 = peg$literalExpectation("1", false),
|
||||||
|
peg$c24 = function(left, opr) {
|
||||||
|
return { left, opr };
|
||||||
|
},
|
||||||
|
peg$c25 = "Y",
|
||||||
|
peg$c26 = peg$literalExpectation("Y", false),
|
||||||
|
peg$c27 = function(symbol) { return symbol },
|
||||||
|
peg$c28 = "X",
|
||||||
|
peg$c29 = peg$literalExpectation("X", false),
|
||||||
|
peg$c30 = "Z",
|
||||||
|
peg$c31 = peg$literalExpectation("Z", false),
|
||||||
|
peg$c32 = function(symbol, ind) {
|
||||||
|
return symbol + ind;
|
||||||
|
},
|
||||||
|
peg$c33 = "+",
|
||||||
|
peg$c34 = peg$literalExpectation("+", false),
|
||||||
|
peg$c35 = "-",
|
||||||
|
peg$c36 = peg$literalExpectation("-", false),
|
||||||
|
peg$c37 = /^[A-E]/,
|
||||||
|
peg$c38 = peg$classExpectation([["A", "E"]], false, false),
|
||||||
|
peg$c39 = peg$otherExpectation("integer"),
|
||||||
|
peg$c40 = /^[0-9]/,
|
||||||
|
peg$c41 = peg$classExpectation([["0", "9"]], false, false),
|
||||||
|
peg$c42 = function() { return parseInt(text(), 10); },
|
||||||
|
peg$c43 = peg$otherExpectation("whitespace"),
|
||||||
|
peg$c44 = /^[ \t\n\r]/,
|
||||||
|
peg$c45 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false),
|
||||||
|
peg$c46 = function() { },
|
||||||
|
|
||||||
|
peg$currPos = 0,
|
||||||
|
peg$savedPos = 0,
|
||||||
|
peg$posDetailsCache = [{ line: 1, column: 1 }],
|
||||||
|
peg$maxFailPos = 0,
|
||||||
|
peg$maxFailExpected = [],
|
||||||
|
peg$silentFails = 0,
|
||||||
|
|
||||||
|
peg$result;
|
||||||
|
|
||||||
|
if ("startRule" in options) {
|
||||||
|
if (!(options.startRule in peg$startRuleFunctions)) {
|
||||||
|
throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
|
||||||
|
}
|
||||||
|
|
||||||
|
peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
|
||||||
|
}
|
||||||
|
|
||||||
|
function text() {
|
||||||
|
return input.substring(peg$savedPos, peg$currPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
function location() {
|
||||||
|
return peg$computeLocation(peg$savedPos, peg$currPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
function expected(description, location) {
|
||||||
|
location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
|
||||||
|
|
||||||
|
throw peg$buildStructuredError(
|
||||||
|
[peg$otherExpectation(description)],
|
||||||
|
input.substring(peg$savedPos, peg$currPos),
|
||||||
|
location
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function error(message, location) {
|
||||||
|
location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
|
||||||
|
|
||||||
|
throw peg$buildSimpleError(message, location);
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$literalExpectation(text, ignoreCase) {
|
||||||
|
return { type: "literal", text: text, ignoreCase: ignoreCase };
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$classExpectation(parts, inverted, ignoreCase) {
|
||||||
|
return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$anyExpectation() {
|
||||||
|
return { type: "any" };
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$endExpectation() {
|
||||||
|
return { type: "end" };
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$otherExpectation(description) {
|
||||||
|
return { type: "other", description: description };
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$computePosDetails(pos) {
|
||||||
|
var details = peg$posDetailsCache[pos], p;
|
||||||
|
|
||||||
|
if (details) {
|
||||||
|
return details;
|
||||||
|
} else {
|
||||||
|
p = pos - 1;
|
||||||
|
while (!peg$posDetailsCache[p]) {
|
||||||
|
p--;
|
||||||
|
}
|
||||||
|
|
||||||
|
details = peg$posDetailsCache[p];
|
||||||
|
details = {
|
||||||
|
line: details.line,
|
||||||
|
column: details.column
|
||||||
|
};
|
||||||
|
|
||||||
|
while (p < pos) {
|
||||||
|
if (input.charCodeAt(p) === 10) {
|
||||||
|
details.line++;
|
||||||
|
details.column = 1;
|
||||||
|
} else {
|
||||||
|
details.column++;
|
||||||
|
}
|
||||||
|
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
peg$posDetailsCache[pos] = details;
|
||||||
|
return details;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$computeLocation(startPos, endPos) {
|
||||||
|
var startPosDetails = peg$computePosDetails(startPos),
|
||||||
|
endPosDetails = peg$computePosDetails(endPos);
|
||||||
|
|
||||||
|
return {
|
||||||
|
start: {
|
||||||
|
offset: startPos,
|
||||||
|
line: startPosDetails.line,
|
||||||
|
column: startPosDetails.column
|
||||||
|
},
|
||||||
|
end: {
|
||||||
|
offset: endPos,
|
||||||
|
line: endPosDetails.line,
|
||||||
|
column: endPosDetails.column
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$fail(expected) {
|
||||||
|
if (peg$currPos < peg$maxFailPos) { return; }
|
||||||
|
|
||||||
|
if (peg$currPos > peg$maxFailPos) {
|
||||||
|
peg$maxFailPos = peg$currPos;
|
||||||
|
peg$maxFailExpected = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
peg$maxFailExpected.push(expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$buildSimpleError(message, location) {
|
||||||
|
return new peg$SyntaxError(message, null, null, location);
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$buildStructuredError(expected, found, location) {
|
||||||
|
return new peg$SyntaxError(
|
||||||
|
peg$SyntaxError.buildMessage(expected, found),
|
||||||
|
expected,
|
||||||
|
found,
|
||||||
|
location
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseProgram() {
|
||||||
|
var s0, s1, s2;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = [];
|
||||||
|
s2 = peg$parseLine();
|
||||||
|
while (s2 !== peg$FAILED) {
|
||||||
|
s1.push(s2);
|
||||||
|
s2 = peg$parseLine();
|
||||||
|
}
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c0(s1);
|
||||||
|
}
|
||||||
|
s0 = s1;
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseLine() {
|
||||||
|
var s0, s1, s2;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = peg$parseLabeledInstruction();
|
||||||
|
if (s1 === peg$FAILED) {
|
||||||
|
s1 = peg$parseInstruction();
|
||||||
|
}
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = peg$parse_();
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c1(s1);
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseLabeledInstruction() {
|
||||||
|
var s0, s1, s2, s3;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = peg$parseLabel();
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = peg$parse_();
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
s3 = peg$parseInstruction();
|
||||||
|
if (s3 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c2(s1, s3);
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseLabel() {
|
||||||
|
var s0, s1, s2, s3, s4, s5;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
if (input.charCodeAt(peg$currPos) === 91) {
|
||||||
|
s1 = peg$c3;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s1 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c4); }
|
||||||
|
}
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = peg$parse_();
|
||||||
|
if (s2 === peg$FAILED) {
|
||||||
|
s2 = null;
|
||||||
|
}
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
s3 = peg$parseLABEL_V();
|
||||||
|
if (s3 !== peg$FAILED) {
|
||||||
|
s4 = peg$parse_();
|
||||||
|
if (s4 === peg$FAILED) {
|
||||||
|
s4 = null;
|
||||||
|
}
|
||||||
|
if (s4 !== peg$FAILED) {
|
||||||
|
if (input.charCodeAt(peg$currPos) === 93) {
|
||||||
|
s5 = peg$c5;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s5 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c6); }
|
||||||
|
}
|
||||||
|
if (s5 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c7(s3);
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseInstruction() {
|
||||||
|
var s0, s1;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = peg$parseConditional();
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c8(s1);
|
||||||
|
}
|
||||||
|
s0 = s1;
|
||||||
|
if (s0 === peg$FAILED) {
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = peg$parseAssignment();
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c9(s1);
|
||||||
|
}
|
||||||
|
s0 = s1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseConditional() {
|
||||||
|
var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
if (input.substr(peg$currPos, 2) === peg$c10) {
|
||||||
|
s1 = peg$c10;
|
||||||
|
peg$currPos += 2;
|
||||||
|
} else {
|
||||||
|
s1 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c11); }
|
||||||
|
}
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = peg$parse_();
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
s3 = peg$parseVAR();
|
||||||
|
if (s3 !== peg$FAILED) {
|
||||||
|
s4 = peg$parse_();
|
||||||
|
if (s4 !== peg$FAILED) {
|
||||||
|
if (input.substr(peg$currPos, 2) === peg$c12) {
|
||||||
|
s5 = peg$c12;
|
||||||
|
peg$currPos += 2;
|
||||||
|
} else {
|
||||||
|
s5 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c13); }
|
||||||
|
}
|
||||||
|
if (s5 !== peg$FAILED) {
|
||||||
|
s6 = peg$parse_();
|
||||||
|
if (s6 !== peg$FAILED) {
|
||||||
|
if (input.charCodeAt(peg$currPos) === 48) {
|
||||||
|
s7 = peg$c14;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s7 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c15); }
|
||||||
|
}
|
||||||
|
if (s7 !== peg$FAILED) {
|
||||||
|
s8 = peg$parse_();
|
||||||
|
if (s8 !== peg$FAILED) {
|
||||||
|
if (input.substr(peg$currPos, 4) === peg$c16) {
|
||||||
|
s9 = peg$c16;
|
||||||
|
peg$currPos += 4;
|
||||||
|
} else {
|
||||||
|
s9 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c17); }
|
||||||
|
}
|
||||||
|
if (s9 !== peg$FAILED) {
|
||||||
|
s10 = peg$parse_();
|
||||||
|
if (s10 !== peg$FAILED) {
|
||||||
|
s11 = peg$parseLabel();
|
||||||
|
if (s11 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c18(s3, s11);
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseAssignment() {
|
||||||
|
var s0, s1, s2, s3, s4, s5;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = peg$parseVAR();
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = peg$parse_();
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
if (input.substr(peg$currPos, 2) === peg$c19) {
|
||||||
|
s3 = peg$c19;
|
||||||
|
peg$currPos += 2;
|
||||||
|
} else {
|
||||||
|
s3 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c20); }
|
||||||
|
}
|
||||||
|
if (s3 !== peg$FAILED) {
|
||||||
|
s4 = peg$parse_();
|
||||||
|
if (s4 !== peg$FAILED) {
|
||||||
|
s5 = peg$parseExpression();
|
||||||
|
if (s5 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c21(s1, s5);
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseExpression() {
|
||||||
|
var s0, s1, s2, s3, s4, s5;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = peg$parseVAR();
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = peg$parse_();
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
s3 = peg$parseOPERATION();
|
||||||
|
if (s3 !== peg$FAILED) {
|
||||||
|
s4 = peg$parse_();
|
||||||
|
if (s4 !== peg$FAILED) {
|
||||||
|
if (input.charCodeAt(peg$currPos) === 49) {
|
||||||
|
s5 = peg$c22;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s5 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c23); }
|
||||||
|
}
|
||||||
|
if (s5 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c24(s1, s3);
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseVAR() {
|
||||||
|
var s0, s1, s2, s3;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
if (input.charCodeAt(peg$currPos) === 89) {
|
||||||
|
s1 = peg$c25;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s1 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c26); }
|
||||||
|
}
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c27(s1);
|
||||||
|
}
|
||||||
|
s0 = s1;
|
||||||
|
if (s0 === peg$FAILED) {
|
||||||
|
s0 = peg$currPos;
|
||||||
|
if (input.charCodeAt(peg$currPos) === 88) {
|
||||||
|
s1 = peg$c28;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s1 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c29); }
|
||||||
|
}
|
||||||
|
if (s1 === peg$FAILED) {
|
||||||
|
if (input.charCodeAt(peg$currPos) === 90) {
|
||||||
|
s1 = peg$c30;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s1 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c31); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = [];
|
||||||
|
s3 = peg$parseInteger();
|
||||||
|
if (s3 !== peg$FAILED) {
|
||||||
|
while (s3 !== peg$FAILED) {
|
||||||
|
s2.push(s3);
|
||||||
|
s3 = peg$parseInteger();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s2 = peg$FAILED;
|
||||||
|
}
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c32(s1, s2);
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseOPERATION() {
|
||||||
|
var s0;
|
||||||
|
|
||||||
|
if (input.charCodeAt(peg$currPos) === 43) {
|
||||||
|
s0 = peg$c33;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c34); }
|
||||||
|
}
|
||||||
|
if (s0 === peg$FAILED) {
|
||||||
|
if (input.charCodeAt(peg$currPos) === 45) {
|
||||||
|
s0 = peg$c35;
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c36); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseLABEL_V() {
|
||||||
|
var s0, s1, s2, s3;
|
||||||
|
|
||||||
|
s0 = peg$currPos;
|
||||||
|
if (peg$c37.test(input.charAt(peg$currPos))) {
|
||||||
|
s1 = input.charAt(peg$currPos);
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s1 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c38); }
|
||||||
|
}
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = [];
|
||||||
|
s3 = peg$parseInteger();
|
||||||
|
if (s3 !== peg$FAILED) {
|
||||||
|
while (s3 !== peg$FAILED) {
|
||||||
|
s2.push(s3);
|
||||||
|
s3 = peg$parseInteger();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s2 = peg$FAILED;
|
||||||
|
}
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c32(s1, s2);
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parseInteger() {
|
||||||
|
var s0, s1, s2, s3;
|
||||||
|
|
||||||
|
peg$silentFails++;
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = peg$parse_();
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
s2 = [];
|
||||||
|
if (peg$c40.test(input.charAt(peg$currPos))) {
|
||||||
|
s3 = input.charAt(peg$currPos);
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s3 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c41); }
|
||||||
|
}
|
||||||
|
if (s3 !== peg$FAILED) {
|
||||||
|
while (s3 !== peg$FAILED) {
|
||||||
|
s2.push(s3);
|
||||||
|
if (peg$c40.test(input.charAt(peg$currPos))) {
|
||||||
|
s3 = input.charAt(peg$currPos);
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s3 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c41); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s2 = peg$FAILED;
|
||||||
|
}
|
||||||
|
if (s2 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c42();
|
||||||
|
s0 = s1;
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
peg$currPos = s0;
|
||||||
|
s0 = peg$FAILED;
|
||||||
|
}
|
||||||
|
peg$silentFails--;
|
||||||
|
if (s0 === peg$FAILED) {
|
||||||
|
s1 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c39); }
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function peg$parse_() {
|
||||||
|
var s0, s1, s2;
|
||||||
|
|
||||||
|
peg$silentFails++;
|
||||||
|
s0 = peg$currPos;
|
||||||
|
s1 = [];
|
||||||
|
if (peg$c44.test(input.charAt(peg$currPos))) {
|
||||||
|
s2 = input.charAt(peg$currPos);
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s2 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c45); }
|
||||||
|
}
|
||||||
|
while (s2 !== peg$FAILED) {
|
||||||
|
s1.push(s2);
|
||||||
|
if (peg$c44.test(input.charAt(peg$currPos))) {
|
||||||
|
s2 = input.charAt(peg$currPos);
|
||||||
|
peg$currPos++;
|
||||||
|
} else {
|
||||||
|
s2 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c45); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (s1 !== peg$FAILED) {
|
||||||
|
peg$savedPos = s0;
|
||||||
|
s1 = peg$c46();
|
||||||
|
}
|
||||||
|
s0 = s1;
|
||||||
|
peg$silentFails--;
|
||||||
|
if (s0 === peg$FAILED) {
|
||||||
|
s1 = peg$FAILED;
|
||||||
|
if (peg$silentFails === 0) { peg$fail(peg$c43); }
|
||||||
|
}
|
||||||
|
|
||||||
|
return s0;
|
||||||
|
}
|
||||||
|
|
||||||
|
peg$result = peg$startRuleFunction();
|
||||||
|
|
||||||
|
if (peg$result !== peg$FAILED && peg$currPos === input.length) {
|
||||||
|
return peg$result;
|
||||||
|
} else {
|
||||||
|
if (peg$result !== peg$FAILED && peg$currPos < input.length) {
|
||||||
|
peg$fail(peg$endExpectation());
|
||||||
|
}
|
||||||
|
|
||||||
|
throw peg$buildStructuredError(
|
||||||
|
peg$maxFailExpected,
|
||||||
|
peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
|
||||||
|
peg$maxFailPos < input.length
|
||||||
|
? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
|
||||||
|
: peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
SyntaxError: peg$SyntaxError,
|
||||||
|
parse: peg$parse
|
||||||
|
};
|
||||||
|
})();
|
11
index.html
11
index.html
@ -44,6 +44,17 @@
|
|||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<a class="project" href="/godel/">
|
||||||
|
<div class="project-logo-container">
|
||||||
|
<i class="fa-solid fa-microchip"></i>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="project-body">
|
||||||
|
<h1>Godel Explorer</h1>
|
||||||
|
<p>Compile L-Programs into JavaScript and Godel numbers.</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
<a class="project" href="/turing-machine/">
|
<a class="project" href="/turing-machine/">
|
||||||
<div class="project-logo-container">
|
<div class="project-logo-container">
|
||||||
<i class="fa-solid fa-tape"></i>
|
<i class="fa-solid fa-tape"></i>
|
||||||
|
Loading…
Reference in New Issue
Block a user