mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'lemu/src/parser/mod.rs')
-rw-r--r--lemu/src/parser/mod.rs24
1 files changed, 16 insertions, 8 deletions
diff --git a/lemu/src/parser/mod.rs b/lemu/src/parser/mod.rs
index 5a90334..5b667cb 100644
--- a/lemu/src/parser/mod.rs
+++ b/lemu/src/parser/mod.rs
@@ -97,15 +97,22 @@ pub fn parse<'source, W: Wr>(
let mut used = 0u8;
let mut mem: [Option<&str>; 255] = [None; 255]; // maps &str to usize
macro_rules! push {
+ // push a ident
($var:expr) => {{
- mem[used as usize] = Some($var);
+ let v = $var;
+ executor.debug_info.set_var(used, v, tokens.span());
+ mem[used as usize] = Some(v);
used = used
.checked_add(1)
.ok_or(Error::TooManyVariables(tokens.span()))?;
Ok(LAddress::addr(used - 1))
}};
(const $var:expr) => {{
- executor.mem[LAddress::addr(used)] = LVar::from($var);
+ let v = $var;
+ executor
+ .debug_info
+ .set_const(used, v.clone(), tokens.span());
+ executor.mem[LAddress::addr(used)] = LVar::from(v);
used = used
.checked_add(1)
.ok_or(Error::TooManyVariables(tokens.span()))?;
@@ -127,8 +134,6 @@ pub fn parse<'source, W: Wr>(
}};
}
- // maps "start" to 0
- let mut labels = Vec::new();
let mut unfinished_jumps = Vec::new();
macro_rules! tok {
() => {
@@ -242,9 +247,10 @@ pub fn parse<'source, W: Wr>(
// # omg
Token::Comment(c) => executor.program.push(UPInstr::Comment(c)),
// label:
- Token::Ident(v) if v.ends_with(':') => {
- labels.push((&v[..v.len() - 1], executor.next()))
- }
+ Token::Ident(v) if v.ends_with(':') => executor
+ .debug_info
+ .labels
+ .push((&v[..v.len() - 1], executor.next())),
// print "5"
Token::Print => {
let val = take_var!(tok!()?)?;
@@ -784,7 +790,9 @@ pub fn parse<'source, W: Wr>(
}
for (j, (label, s), i) in unfinished_jumps {
- let to = labels
+ let to = executor
+ .debug_info
+ .labels
.iter()
.find(|(v, _)| v == &label)
.ok_or_else(|| Error::LabelNotFound(label, s))?