mirror of
https://gitlab.cs.washington.edu/fidelp/frustration.git
synced 2024-12-26 21:58:20 +01:00
error checking (it's a start anyway)
This commit is contained in:
parent
72dae5a249
commit
e204ae6da7
1 changed files with 26 additions and 11 deletions
|
@ -15,7 +15,7 @@ enum State {
|
||||||
enum Post {
|
enum Post {
|
||||||
Nothing,
|
Nothing,
|
||||||
EatWord,
|
EatWord,
|
||||||
EatLine,
|
WarmReset,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -171,13 +171,13 @@ fn tick(c: &mut Core) {
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
println!(" ' cannot find {}", name);
|
println!(" ' cannot find {}", name);
|
||||||
c.post = Post::EatLine;
|
c.post = Post::WarmReset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
println!(" ' needs an argument");
|
println!(" ' needs an argument");
|
||||||
c.post = Post::EatLine;
|
c.post = Post::WarmReset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,9 +214,15 @@ fn push(c: &mut Core, val: u16) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pop(c: &mut Core) -> u16 {
|
fn pop(c: &mut Core) -> u16 {
|
||||||
|
if c.tds == 0 {
|
||||||
|
println!(" stack underflow");
|
||||||
|
c.post = Post::WarmReset; // note: could get overwritten later :(
|
||||||
|
return 0; // half-assed, should really return straight to interpreter
|
||||||
|
} else {
|
||||||
c.tds -= 1;
|
c.tds -= 1;
|
||||||
return c.dstack[c.tds];
|
return c.dstack[c.tds];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn dup(c: &mut Core) {
|
fn dup(c: &mut Core) {
|
||||||
let val = pop(c);
|
let val = pop(c);
|
||||||
|
@ -342,25 +348,25 @@ fn lit(c: &mut Core) {
|
||||||
fn add(c: &mut Core) {
|
fn add(c: &mut Core) {
|
||||||
let v1 = pop(c);
|
let v1 = pop(c);
|
||||||
let v2 = pop(c);
|
let v2 = pop(c);
|
||||||
push(c, v1 + v2);
|
push(c, v1.wrapping_add(v2));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sub(c: &mut Core) {
|
fn sub(c: &mut Core) {
|
||||||
let v1 = pop(c);
|
let v1 = pop(c);
|
||||||
let v2 = pop(c);
|
let v2 = pop(c);
|
||||||
push(c, v2 - v1);
|
push(c, v2.wrapping_sub(v1));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mul(c: &mut Core) {
|
fn mul(c: &mut Core) {
|
||||||
let v1 = pop(c);
|
let v1 = pop(c);
|
||||||
let v2 = pop(c);
|
let v2 = pop(c);
|
||||||
push(c, v1 * v2);
|
push(c, v1.saturating_mul(v2));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn div(c: &mut Core) {
|
fn div(c: &mut Core) {
|
||||||
let v1 = pop(c);
|
let v1 = pop(c);
|
||||||
let v2 = pop(c);
|
let v2 = pop(c);
|
||||||
push(c, v2 / v1);
|
push(c, v2.saturating_div(v1));
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Outer interpreter ---
|
// --- Outer interpreter ---
|
||||||
|
@ -406,7 +412,12 @@ fn outer(c: &mut Core, s: &str) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(_) => { if t != "" { println!("{}?", t) }}
|
Err(_) => {
|
||||||
|
if t != "" {
|
||||||
|
println!("{}?", t);
|
||||||
|
c.post = Post::WarmReset;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -415,7 +426,11 @@ fn outer(c: &mut Core, s: &str) {
|
||||||
}
|
}
|
||||||
match c.post {
|
match c.post {
|
||||||
Post::EatWord => { _ = tokens.next(); }
|
Post::EatWord => { _ = tokens.next(); }
|
||||||
Post::EatLine => { break; }
|
Post::WarmReset => {
|
||||||
|
c.tds = 0;
|
||||||
|
c.trs = 0;
|
||||||
|
break; // discard rest of input line
|
||||||
|
}
|
||||||
Post::Nothing => { }
|
Post::Nothing => { }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue