+
+ Write In Your Language Here
+
+
+
-
-
+
+ Results
+
+
+
+
+
+
+
diff --git a/dingus/dingus.js b/dingus/dingus.js
index d43f1bd..9a4c6a9 100644
--- a/dingus/dingus.js
+++ b/dingus/dingus.js
@@ -1,4 +1,16 @@
const STATUS = document.getElementById("status-line");
+const ERRORS = document.getElementById("error-root");
+const TREE = document.getElementById("tree-root");
+
+function show_tree() {
+ ERRORS.classList.add("hidden");
+ TREE.classList.remove("hidden");
+}
+
+function show_errors() {
+ ERRORS.classList.remove("hidden");
+ TREE.classList.add("hidden");
+}
const DOC_CHAINS = {};
function chain_document_submit(kind, editor, on_success) {
@@ -34,6 +46,10 @@ function chain_document_submit(kind, editor, on_success) {
if (message.status === "ok" && on_success) {
on_success(message);
}
+
+ if (message.status === "error") {
+ render_errors(message.errors);
+ }
}
DOC_CHAINS[kind] = on_result;
@@ -71,6 +87,10 @@ worker.onmessage = (e) => {
let grammar_editor = null;
let input_editor = null;
+function render_errors(errors) {
+ ERRORS.innerText = errors.join("\n")
+}
+
function render_parse_results(message) {
function render_tree_node(parent, node) {
const tree_div = document.createElement("div");
@@ -104,9 +124,10 @@ function render_parse_results(message) {
parent.appendChild(tree_div);
}
- const root = document.getElementById("output-root");
+ const root = document.getElementById("tree-root");
root.innerHTML = "";
render_tree_node(root, message.tree);
+ render_errors(message.errors);
}
function setup_editors() {
diff --git a/dingus/style.css b/dingus/style.css
index 4ae038f..eb95b4a 100644
--- a/dingus/style.css
+++ b/dingus/style.css
@@ -8,49 +8,73 @@ body {
.page-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
- grid-template-rows: 4rem 1fr 2em;
+ grid-template-rows: 4rem 2rem 1fr 2rem;
width: 100%;
height: 100%;
}
-.grammar-container {
- grid-column: 1;
- grid-row: 2;
+.panel {
padding: 0.25rem;
/* Establishing minimum sizes here causes the codemirror CSS to work */
min-height: 0;
min-width: 0;
+ overflow-y: scroll;
+ border-left: 1px solid;
+ border-right: 1px solid;
+ border-bottom: 1px solid;
}
-.status {
- grid-column: 1 / 3;
+.panel-top {
+ padding: 0.5rem;
+ border-bottom: 1px dashed;
+ border-right: 1px solid;
+ border-left: 1px solid;
+ border-top: 1px solid;
+}
+
+.grammar-title {
+ grid-column: 1;
+ grid-row: 2;
+}
+
+.grammar-container {
+ grid-column: 1;
grid-row: 3;
- padding: 0.25rem;
+}
+
+.input-title {
+ grid-column: 2;
+ grid-row: 2;
}
.input-container {
grid-column: 2;
- grid-row: 2;
- padding: 0.25rem;
-
- /* Establishing minimum sizes here causes the codemirror CSS to work */
- min-height: 0;
- min-width: 0;
+ grid-row: 3;
}
-.input-status {
- grid-column: 2;
- grid-row: 3;
- padding: 0.25rem;
+.result-selector {
+ position: relative;
+ grid-column: 3;
+ grid-row: 2;
+}
+
+.result-selector-buttons {
+ position: absolute;
+ top: 0.25rem;
+ right: 1rem;
}
.results-container {
grid-column: 3;
- grid-row: 2;
- padding: 0.25rem;
+ grid-row: 3;
+}
- overflow-y: scroll;
+.status {
+ grid-column: 1 / 4;
+ grid-row: 4;
+ padding: 0.25rem;
+ border: 1px solid;
}
.parsed-node {
@@ -66,6 +90,10 @@ body {
width: 100%;
}
+.hidden {
+ display: none;
+}
+
.CodeMirror {
height: 100%;
}
diff --git a/dingus/worker.js b/dingus/worker.js
index 4d508f6..adeb615 100644
--- a/dingus/worker.js
+++ b/dingus/worker.js
@@ -31,9 +31,15 @@ const dingus_module = {
postMessage({kind: "grammar", status: "ok", message: msg});
},
- post_grammar_error: function(error) {
- console.log("Grammar Error:", error);
- postMessage({kind:"grammar", status: "error", message: error});
+ post_grammar_error: function(errors) {
+ errors = data_to_js(errors);
+ console.log("Grammar Error:", errors);
+ postMessage({
+ kind:"grammar",
+ status: "error",
+ message: "An error occurred loading the grammar",
+ errors: errors,
+ });
},
post_doc_parse: function(tree, errors) {
@@ -50,9 +56,15 @@ const dingus_module = {
});
},
- post_doc_error: function(error) {
- console.log("Doc Error:", error);
- postMessage({kind:"input", status: "error", message: error});
+ post_doc_error: function(errors) {
+ errors = data_to_js(errors);
+ console.log("Doc Error:", errors);
+ postMessage({
+ kind:"input",
+ status: "error",
+ message: "An error occurred parsing the document",
+ errors: errors,
+ });
},
};
@@ -91,6 +103,7 @@ def eval_grammar(code):
try:
dingus.post_grammar_status("Evaluating grammar...")
+ print("Hey?")
grammar_globals={}
pyodide.code.eval_code(code, globals=grammar_globals)
@@ -119,8 +132,9 @@ def eval_grammar(code):
dingus.post_grammar_loaded(grammar.name)
except Exception as e:
- traceback.print_exc()
- dingus.post_grammar_error(f"{e}")
+ ohno = traceback.format_exc()
+ print(f"grammar: {ohno}")
+ dingus.post_grammar_error(ohno.splitlines())
def tree_to_js(tree):
if tree is None:
@@ -151,8 +165,9 @@ def eval_document(code):
tree, errors = runtime.parse(PARSE_TABLE, LEXER, code)
dingus.post_doc_parse(tree_to_js(tree), errors)
except Exception as e:
- traceback.print_exc()
- dingus.post_doc_error(f"{e}")
+ ohno = traceback.format_exc()
+ print(f"doc: {ohno}")
+ dingus.post_doc_error(ohno.splitlines())
`);
dingus_module.post_grammar_status("Ready.");