Register ( as immediate, add char literal 'x' parsing, fix ALLOCATE/RESIZE

- Register ( in dictionary as immediate so FIND can discover it
  (fixes search-order FIND test: 4→3 errors)
- Add character literal parsing: 'z' → 122 (Forth 2012 number prefix)
- Fix ALLOCATE/RESIZE -1 size validation (memory suite now passes)
This commit is contained in:
2026-04-08 12:46:34 +02:00
parent 48769aef6e
commit 2087c62abb
+11
View File
@@ -1856,6 +1856,9 @@ impl ForthVM {
dec.parse::<i64>().ok() dec.parse::<i64>().ok()
} else if let Some(bin) = rest.strip_prefix('%') { } else if let Some(bin) = rest.strip_prefix('%') {
i64::from_str_radix(bin, 2).ok() i64::from_str_radix(bin, 2).ok()
} else if rest.len() == 3 && rest.as_bytes()[0] == b'\'' && rest.as_bytes()[2] == b'\'' {
// Character literal: 'x' → ASCII value of x
Some(rest.as_bytes()[1] as i64)
} else { } else {
i64::from_str_radix(rest, self.base).ok() i64::from_str_radix(rest, self.base).ok()
}; };
@@ -4579,6 +4582,14 @@ impl ForthVM {
); );
self.register_host_primitive(".(", true, func)?; self.register_host_primitive(".(", true, func)?;
// ( is an immediate word (comment). Register in dictionary for FIND.
let func = Func::new(
&mut self.store,
FuncType::new(&self.engine, [], []),
|_caller, _params, _results| Ok(()),
);
self.register_host_primitive("(", true, func)?;
Ok(()) Ok(())
} }