1
0
Fork 0

Clean up interpreter and align details with language spec

This commit is contained in:
Vili Sinervä 2025-02-04 15:37:39 +02:00
parent c92ff6140e
commit 50bc35753a
No known key found for this signature in database
GPG key ID: DF8FEAF54EFAC996

View file

@ -27,13 +27,13 @@ pub fn interpret<'source>(ast: &Expression<'source>, symbols: &mut SymTab<'sourc
BinaryOp(_, left, op, right) => match *op { BinaryOp(_, left, op, right) => match *op {
"and" => { "and" => {
let left_val = interpret(left, symbols); let left_val = interpret(left, symbols);
if let Value::Bool(val_l) = left_val { if let Value::Bool(left_val) = left_val {
if !val_l { if !left_val {
Value::Bool(false) Value::Bool(false)
} else { } else {
let right_val = interpret(right, symbols); let right_val = interpret(right, symbols);
if let Value::Bool(val_r) = right_val { if let Value::Bool(right_val) = right_val {
Value::Bool(val_r) Value::Bool(right_val)
} else { } else {
panic!("Non-bool with and operator"); panic!("Non-bool with and operator");
} }
@ -44,19 +44,19 @@ pub fn interpret<'source>(ast: &Expression<'source>, symbols: &mut SymTab<'sourc
} }
"or" => { "or" => {
let left_val = interpret(left, symbols); let left_val = interpret(left, symbols);
if let Value::Bool(val_l) = left_val { if let Value::Bool(left_val) = left_val {
if val_l { if left_val {
Value::Bool(true) Value::Bool(true)
} else { } else {
let right_val = interpret(right, symbols); let right_val = interpret(right, symbols);
if let Value::Bool(val_r) = right_val { if let Value::Bool(right_val) = right_val {
Value::Bool(val_r) Value::Bool(right_val)
} else { } else {
panic!("Non-bool with and operator"); panic!("Non-bool with or operator");
} }
} }
} else { } else {
panic!("Non-bool with and operator"); panic!("Non-bool with or operator");
} }
} }
"=" => { "=" => {
@ -99,12 +99,11 @@ pub fn interpret<'source>(ast: &Expression<'source>, symbols: &mut SymTab<'sourc
} }
} }
While(_, condition, do_expr) => { While(_, condition, do_expr) => {
let mut val = Value::None();
loop { loop {
let condition = interpret(condition, symbols); let condition = interpret(condition, symbols);
if let Value::Bool(cond) = condition { if let Value::Bool(cond) = condition {
if cond { if cond {
val = interpret(do_expr, symbols); interpret(do_expr, symbols);
} else { } else {
break; break;
} }
@ -112,7 +111,7 @@ pub fn interpret<'source>(ast: &Expression<'source>, symbols: &mut SymTab<'sourc
panic!("Non-boon as while-do condition!"); panic!("Non-boon as while-do condition!");
} }
} }
val Value::None()
} }
FunCall(_, name, args) => { FunCall(_, name, args) => {
let mut arg_values = Vec::new(); let mut arg_values = Vec::new();