Skip to content

Commit 05e7c3c

Browse files
committed
feat: evaluator unknown operator error
1 parent 15daf2b commit 05e7c3c

14 files changed

+76
-10
lines changed

src/evaluator/boolean/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pub fn evaluate(boolean_token: Token) -> Object {
55
match boolean_token {
66
Token::TRUE => Object::TRUE,
77
Token::FALSE => Object::FALSE,
8-
_ => Object::NULL,
8+
_ => panic!("Boolean token not a boolean token."),
99
}
1010
}
1111

src/evaluator/infix/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub fn evaluate(left_hand: Expression, operator_token: Token, right_hand: Expres
3535
true => Object::TRUE,
3636
false => Object::FALSE,
3737
},
38-
_ => Object::NULL,
38+
_ => panic!("Operator token is not operator token."),
3939
},
4040
_ => Object::TYPE_MISMATCH,
4141
}
@@ -58,15 +58,15 @@ fn evaluate_same_boolean(operator_token: Token) -> Object {
5858
match operator_token {
5959
Token::EQUALS => Object::TRUE,
6060
Token::NOT_EQUALS => Object::FALSE,
61-
_ => Object::NULL,
61+
_ => Object::UNKNOWN_OPERATOR,
6262
}
6363
}
6464

6565
fn evaluate_opposite_boolean(operator_token: Token) -> Object {
6666
match operator_token {
6767
Token::EQUALS => Object::FALSE,
6868
Token::NOT_EQUALS => Object::TRUE,
69-
_ => Object::NULL,
69+
_ => Object::UNKNOWN_OPERATOR,
7070
}
7171
}
7272

src/evaluator/infix/tests/mod.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,23 @@ fn test_evaluator_infix_boolean_expressions(code: &str, snapshot_name: &str) {
6464
fn test_evaluator_infix_type_mismatch_expressions(code: &str, snapshot_name: &str) {
6565
assert_expected_returned_object!(code, snapshot_name);
6666
}
67+
68+
#[rstest(
69+
code,
70+
snapshot_name,
71+
case(
72+
"true + TRUE",
73+
"test_evaluator_infix_unknown_operator_expressions_case1"
74+
),
75+
case(
76+
"5 + 10; FALSE * FALSE; 7",
77+
"test_evaluator_infix_unknown_operator_expressions_case2"
78+
),
79+
case(
80+
"if (5 < 10) { FALSE + FALSE }",
81+
"test_evaluator_infix_unknown_operator_expressions_case3"
82+
)
83+
)]
84+
fn test_evaluator_infix_unknown_operator_expressions(code: &str, snapshot_name: &str) {
85+
assert_expected_returned_object!(code, snapshot_name);
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/evaluator/infix/tests/mod.rs
3+
expression: "crate::evaluator::evaluate(crate::syntax_analysis::get_abstract_syntax_tree(crate::lexical_analysis::get_tokens(code.to_string())))"
4+
---
5+
"UNKNOWN_OPERATOR"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/evaluator/infix/tests/mod.rs
3+
expression: "crate::evaluator::evaluate(crate::syntax_analysis::get_abstract_syntax_tree(crate::lexical_analysis::get_tokens(code.to_string())))"
4+
---
5+
"UNKNOWN_OPERATOR"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/evaluator/infix/tests/mod.rs
3+
expression: "crate::evaluator::evaluate(crate::syntax_analysis::get_abstract_syntax_tree(crate::lexical_analysis::get_tokens(code.to_string())))"
4+
---
5+
"UNKNOWN_OPERATOR"

src/evaluator/integer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ pub fn evaluate(integer_token: Token) -> Object {
66
Token::INTEGER { literal } => Object::INTEGER {
77
value: literal.parse().unwrap(),
88
},
9-
_ => Object::NULL,
9+
_ => panic!("Integer token not a integer token."),
1010
}
1111
}
1212

src/evaluator/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ mod return_statement;
1414
pub fn evaluate(abstract_syntax_tree: AbstractSyntaxTree) -> Object {
1515
let mut object = Object::NULL;
1616

17+
if !abstract_syntax_tree.syntax_parsing_errors.is_empty() {
18+
panic!("Syntax errors unable to evaluate.");
19+
}
20+
1721
for syntax_tree_node in abstract_syntax_tree.abstract_syntax_tree {
1822
object = evaluate_node(syntax_tree_node);
1923

@@ -22,7 +26,7 @@ pub fn evaluate(abstract_syntax_tree: AbstractSyntaxTree) -> Object {
2226
object = *value;
2327
break;
2428
}
25-
Object::TYPE_MISMATCH => break,
29+
Object::TYPE_MISMATCH | Object::UNKNOWN_OPERATOR => break,
2630
_ => {}
2731
}
2832
}
@@ -37,7 +41,7 @@ fn evaluate_block(block: Block) -> Object {
3741
object = evaluate_node(syntax_tree_node);
3842

3943
match object.clone() {
40-
Object::RETURN { value: _ } | Object::TYPE_MISMATCH => break,
44+
Object::RETURN { value: _ } | Object::TYPE_MISMATCH | Object::UNKNOWN_OPERATOR => break,
4145
_ => {}
4246
}
4347
}

src/evaluator/object/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ pub enum Object {
99
FALSE,
1010
NULL,
1111
TYPE_MISMATCH,
12+
UNKNOWN_OPERATOR,
1213
}

src/evaluator/prefix/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ pub fn evaluate(prefix_token: Token, right_hand_expression: Expression) -> Objec
88
Token::NOT => match object {
99
Object::TRUE => Object::FALSE,
1010
Object::FALSE => Object::TRUE,
11-
_ => Object::NULL,
11+
_ => Object::UNKNOWN_OPERATOR,
1212
},
1313
Token::MINUS => match object {
1414
Object::INTEGER { value } => Object::INTEGER { value: -value },
15-
_ => Object::NULL,
15+
_ => Object::UNKNOWN_OPERATOR,
1616
},
17-
_ => Object::NULL,
17+
_ => panic!("Prefix token not a prefix token."),
1818
}
1919
}
2020

0 commit comments

Comments
 (0)