summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Cully <bjc@spork.org>2025-08-22 13:38:47 -0400
committerBrian Cully <bjc@spork.org>2025-08-22 14:42:36 -0400
commit79441128958669b16ce8dfe39a3684069921f604 (patch)
tree4112092916e7bf568cc67e6bcd0621779e2d6eae
parent4f7bbbf4ee269ef6638c69fc5982b0dfe4b8b947 (diff)
downloadautomathon-79441128958669b16ce8dfe39a3684069921f604.tar.gz
automathon-79441128958669b16ce8dfe39a3684069921f604.zip
make compile button actually compile
-rw-r--r--main.mjs21
-rw-r--r--src/forth/interp.rs6
-rwxr-xr-xsrc/forth/mod.rs4
-rw-r--r--src/forth/parser.rs5
-rwxr-xr-xsrc/lib.rs23
5 files changed, 29 insertions, 30 deletions
diff --git a/main.mjs b/main.mjs
index 2df434f..c07dccd 100644
--- a/main.mjs
+++ b/main.mjs
@@ -1,21 +1,22 @@
-import init from './pkg/automathon.js';
+import init, { compile, run, tick } from './pkg/automathon.js';
async function loaded() {
console.debug('running init');
const mod = await init();
console.debug('init done', mod);
- document.querySelector("#compile").onclick = e => {
- console.debug("compile clicked", e);
- mod.compile();
+ document.querySelector('#compile').onclick = e => {
+ console.debug('compile clicked', e);
+ let text = document.querySelector('textarea').textContent;
+ compile(text);
};
- document.querySelector("#tick").onclick = e => {
- console.debug("tick clicked", e);
- mod.tick();
+ document.querySelector('#tick').onclick = e => {
+ console.debug('tick clicked', e);
+ tick();
};
- document.querySelector("#run").onclick = e => {
- console.debug("run clicked", e);
- mod.run();
+ document.querySelector('#run').onclick = e => {
+ console.debug('run clicked', e);
+ run();
};
}
diff --git a/src/forth/interp.rs b/src/forth/interp.rs
index c6dcb72..b34ed31 100644
--- a/src/forth/interp.rs
+++ b/src/forth/interp.rs
@@ -66,15 +66,15 @@ pub(super) struct DataStack(pub(super) Vec<i32>);
pub(super) struct CallStack(pub(super) Vec<InstructionPointer>);
#[derive(Clone, Debug)]
-pub(super) struct WordList(pub(super) Vec<ByteCode>);
+pub struct WordList(pub(super) Vec<ByteCode>);
#[derive(Debug)]
pub struct Interp {
// todo: don't be pub, probably
- pub stack: DataStack,
+ pub(super) stack: DataStack,
callstack: CallStack,
// todo: don't be pub
- pub wordlist: WordList,
+ pub(super) wordlist: WordList,
ip: InstructionPointer,
}
diff --git a/src/forth/mod.rs b/src/forth/mod.rs
index 5792148..063b40e 100755
--- a/src/forth/mod.rs
+++ b/src/forth/mod.rs
@@ -1,5 +1,5 @@
-mod interp;
-mod parser;
+pub mod interp;
+pub mod parser;
#[cfg(test)]
mod tests {
diff --git a/src/forth/parser.rs b/src/forth/parser.rs
index 55ad64b..ac6715d 100644
--- a/src/forth/parser.rs
+++ b/src/forth/parser.rs
@@ -1,5 +1,7 @@
use super::interp::{ByteCode, OpCode, WordList};
+use log::debug;
+
use std::collections::HashMap;
use std::iter::{Enumerate, Iterator};
use std::str::Chars;
@@ -45,7 +47,7 @@ pub struct Parser<'a> {
// todo: don't be pub, have a method to extract a wordlist
pub wordlist: WordList,
// catalog of word to word index in `wordlist`
- wordalog: WordCatalog<'a>,
+ pub wordalog: WordCatalog<'a>,
// holds a stack of indices into `wordlist` that are currently
// being defined, with the top of stack being the most recent
// definition.
@@ -79,6 +81,7 @@ impl<'a> Parser<'a> {
self.enumerator.by_ref()
.find(|(_i, c)| c.is_whitespace())?;
let word = &self.text[start..end];
+ debug!("Parser::next_word → ‘{}’ ({} → {})", word, start, end);
Some((word, start, end))
}
diff --git a/src/lib.rs b/src/lib.rs
index 716ad09..f4fc294 100755
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -2,7 +2,7 @@ use log::{Level, debug, info};
use console_log;
use wasm_bindgen::prelude::*;
-mod forth;
+pub mod forth;
#[wasm_bindgen]
extern {
@@ -11,8 +11,13 @@ extern {
}
#[wasm_bindgen]
-pub fn compile() {
- info!("compiling code");
+pub fn compile(text: &str) {
+ info!("compiling code: `{}`", text);
+ let mut p = forth::parser::Parser::new(&text);
+ p.parse().expect("couldn't parse text");
+ debug!("wordlist: {:?}", &p.wordlist);
+ let interp = forth::interp::Interp::new(p.wordlist);
+ debug!("interp: {:?}", interp);
}
#[wasm_bindgen]
@@ -28,17 +33,7 @@ pub fn run() {
#[wasm_bindgen(start)]
pub fn init() -> Result<(), JsValue> {
console_log::init_with_level(Level::Debug).expect("couldn't init console log");
- debug!("starting run");
-
- let window = web_sys::window().expect("no global `window` exists");
- let document = window.document().expect("should have `document` on window");
- let body = document.body().expect("document should have `body`");
-
- let val = document.create_element("p")?;
- val.set_text_content(Some("hi there"));
- body.append_child(&val)?;
-
- debug!("done in rust's run");
+ info!("wasm init");
Ok(())
}