add test for eval
This commit is contained in:
parent
2601dcd274
commit
ba6f572d6b
1 changed files with 16 additions and 6 deletions
22
src/main.rs
22
src/main.rs
|
@ -1,4 +1,4 @@
|
||||||
use std::{error::Error, io};
|
use std::io;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
enum Symbol {
|
enum Symbol {
|
||||||
|
@ -20,6 +20,21 @@ enum Node {
|
||||||
Number { value: u64 },
|
Number { value: u64 },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_eval() {
|
||||||
|
let node_to_eval = Node::Add {
|
||||||
|
left: Box::new(Node::Add {
|
||||||
|
left: Box::new(Node::Number { value: 1 }),
|
||||||
|
right: Box::new(Node::Number { value: 1 }),
|
||||||
|
}),
|
||||||
|
right: Box::new(Node::Number { value: 3 }),
|
||||||
|
};
|
||||||
|
|
||||||
|
let result = eval(&node_to_eval);
|
||||||
|
|
||||||
|
assert!(result == 5_i64);
|
||||||
|
}
|
||||||
|
|
||||||
fn eval(expr: &Node) -> i64 {
|
fn eval(expr: &Node) -> i64 {
|
||||||
match expr {
|
match expr {
|
||||||
Node::Add { left, right } => eval(left) + eval(right),
|
Node::Add { left, right } => eval(left) + eval(right),
|
||||||
|
@ -158,13 +173,10 @@ fn ast(input: Vec<Symbol>) -> Result<Node, ParseError> {
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
|
|
||||||
while i < length {
|
while i < length {
|
||||||
// println!("Count: {}", i);
|
|
||||||
let s = &input[i];
|
let s = &input[i];
|
||||||
// println!("Symbol: {:?}", s);
|
|
||||||
match s {
|
match s {
|
||||||
Symbol::Number { value } => {
|
Symbol::Number { value } => {
|
||||||
stack.push(Node::Number { value: *value });
|
stack.push(Node::Number { value: *value });
|
||||||
// println!("pushed {value}")
|
|
||||||
}
|
}
|
||||||
Symbol::Add => {
|
Symbol::Add => {
|
||||||
let left = stack.pop();
|
let left = stack.pop();
|
||||||
|
@ -199,8 +211,6 @@ fn ast(input: Vec<Symbol>) -> Result<Node, ParseError> {
|
||||||
}
|
}
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
// println!("Stack length: {}", stack.len());
|
|
||||||
// println!("Stack: {:?}", stack);
|
|
||||||
if stack.len() != 1 {
|
if stack.len() != 1 {
|
||||||
return Err(ParseError::WrongTokenError { pos: 1 });
|
return Err(ParseError::WrongTokenError { pos: 1 });
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue