mirror of
https://github.com/artegoser/ONLang
synced 2025-02-23 12:43:13 +03:00
feat: comparisons
This commit is contained in:
parent
757d668f46
commit
4cf0471d66
2 changed files with 247 additions and 21 deletions
|
@ -23,9 +23,8 @@ impl Interpreter {
|
|||
|
||||
for command in arr {
|
||||
self.eval_node(command);
|
||||
self.pos += 1;
|
||||
}
|
||||
|
||||
self.pos += 1;
|
||||
}
|
||||
|
||||
fn eval_node(&self, command: &mut Value) -> Value {
|
||||
|
@ -76,6 +75,21 @@ impl Interpreter {
|
|||
}
|
||||
return Value::Null;
|
||||
}
|
||||
"comp" => {
|
||||
match value {
|
||||
Value::Array(value) => {
|
||||
if value.len() == 3 {
|
||||
return self.comp(value);
|
||||
} else {
|
||||
return Value::Null;
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
self.error("Unsupported data type for the println argument");
|
||||
}
|
||||
}
|
||||
return Value::Null;
|
||||
}
|
||||
name => {
|
||||
self.unk_token(&name);
|
||||
return Value::Null;
|
||||
|
@ -138,17 +152,14 @@ impl Interpreter {
|
|||
panic!();
|
||||
}
|
||||
},
|
||||
name => {
|
||||
self.error(&format!(
|
||||
"Unsupported operation type for calculation: {}",
|
||||
name
|
||||
));
|
||||
_ => {
|
||||
self.error("Unexpected operator token");
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
}
|
||||
Value::Object(_) => self.calc(&mut vec![
|
||||
serde_json::Value::Number(op1.clone()),
|
||||
Value::Number(op1.clone()),
|
||||
operation.clone(),
|
||||
self.eval_node(&mut op2.clone()),
|
||||
]),
|
||||
|
@ -165,7 +176,7 @@ impl Interpreter {
|
|||
]),
|
||||
Value::Object(_) => self.calc(&mut vec![
|
||||
self.eval_node(&mut op1.clone()),
|
||||
Value::String(operation.to_string()),
|
||||
operation.clone(),
|
||||
self.eval_node(&mut op2.clone()),
|
||||
]),
|
||||
_ => {
|
||||
|
@ -180,6 +191,121 @@ impl Interpreter {
|
|||
}
|
||||
}
|
||||
|
||||
fn comp(&self, value: &mut Vec<Value>) -> Value {
|
||||
let op1 = &value[0];
|
||||
let operation = &value[1];
|
||||
let op2 = &value[2];
|
||||
match op1 {
|
||||
Value::Object(_) => match op2 {
|
||||
Value::Object(_) => self.comp(&mut vec![
|
||||
self.eval_node(&mut op1.clone()),
|
||||
operation.clone(),
|
||||
self.eval_node(&mut op2.clone()),
|
||||
]),
|
||||
_ => self.comp(&mut vec![
|
||||
self.eval_node(&mut op1.clone()),
|
||||
operation.clone(),
|
||||
op2.clone(),
|
||||
]),
|
||||
},
|
||||
Value::Number(op1) => match op2 {
|
||||
Value::Object(_) => self.comp(&mut vec![
|
||||
Value::Number(op1.clone()),
|
||||
operation.clone(),
|
||||
self.eval_node(&mut op2.clone()),
|
||||
]),
|
||||
Value::Number(op2) => {
|
||||
let op1 = op1.as_f64().unwrap();
|
||||
let op2 = op2.as_f64().unwrap();
|
||||
match operation {
|
||||
Value::String(operation) => match operation.as_str() {
|
||||
"==" => json!(op1 == op2),
|
||||
"!=" => json!(op1 != op2),
|
||||
">" => json!(op1 > op2),
|
||||
"<" => json!(op1 < op2),
|
||||
">=" => json!(op1 >= op2),
|
||||
"<=" => json!(op1 <= op2),
|
||||
name => {
|
||||
self.error(&format!(
|
||||
"Unsupported operation type for comparison: {}",
|
||||
name
|
||||
));
|
||||
panic!();
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
self.error("Unexpected operator token");
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
self.error("Unsupported operands types for comparison");
|
||||
panic!();
|
||||
}
|
||||
},
|
||||
Value::Bool(op1) => match op2 {
|
||||
Value::Object(_) => self.comp(&mut vec![
|
||||
Value::Bool(op1.clone()),
|
||||
operation.clone(),
|
||||
self.eval_node(&mut op2.clone()),
|
||||
]),
|
||||
Value::Bool(op2) => match operation {
|
||||
Value::String(operation) => match operation.as_str() {
|
||||
"==" => json!(op1 == op2),
|
||||
"!=" => json!(op1 != op2),
|
||||
">" => json!(op1 > op2),
|
||||
"<" => json!(op1 < op2),
|
||||
">=" => json!(op1 >= op2),
|
||||
"<=" => json!(op1 <= op2),
|
||||
"&&" => json!(*op1 && *op2),
|
||||
"||" => json!(*op1 || *op2),
|
||||
name => {
|
||||
self.error(&format!(
|
||||
"Unsupported operation type for comparison: {}",
|
||||
name
|
||||
));
|
||||
panic!();
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
self.error("Unexpected operator token");
|
||||
panic!();
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
self.error("Unsupported operands types for comparison");
|
||||
panic!();
|
||||
}
|
||||
},
|
||||
_ => match op2 {
|
||||
Value::Object(_) => self.comp(&mut vec![
|
||||
op1.clone(),
|
||||
operation.clone(),
|
||||
self.eval_node(&mut op2.clone()),
|
||||
]),
|
||||
|
||||
_ => match operation {
|
||||
Value::String(operation) => match operation.as_str() {
|
||||
"==" => json!(op1 == op2),
|
||||
"!=" => json!(op1 != op2),
|
||||
name => {
|
||||
self.error(&format!(
|
||||
"Unsupported operation type for comparison: {}",
|
||||
name
|
||||
));
|
||||
panic!();
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
self.error("Unexpected operator token");
|
||||
panic!();
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn print(&self, args: &mut Vec<Value>, ln: bool) {
|
||||
for arg in args {
|
||||
self.print_one(arg);
|
||||
|
|
Loading…
Add table
Reference in a new issue