From febd5366e855ccb8dd06998737615e4f4e7d0717 Mon Sep 17 00:00:00 2001 From: Kasper Date: Wed, 15 Jan 2020 17:45:53 +0100 Subject: [PATCH] Turned panics into errors --- src/evaluator.rs | 18 +++++++++--------- src/lexer.rs | 11 ++--------- src/parser.rs | 2 +- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/evaluator.rs b/src/evaluator.rs index 60d4f31..d14e919 100644 --- a/src/evaluator.rs +++ b/src/evaluator.rs @@ -94,7 +94,7 @@ fn evaluate_node(ast_node: &AstNode) -> Result { } }, Token::FunctionIdentifier(function) => { - let child_node = children.get(0).expect("Paren has no child[0]"); + let child_node = children.get(0).ok_or("Paren has no child[0]")?; let child_answer = evaluate_node(child_node)?; match function { Cbrt => { @@ -178,21 +178,21 @@ fn evaluate_node(ast_node: &AstNode) -> Result { } } Token::Unit(unit) => { - let child_node = children.get(0).expect("Unit has no child[0]"); + let child_node = children.get(0).ok_or("Unit has no child[0]")?; let child_answer = evaluate_node(child_node)?; Ok(Number::new(child_answer.value, unit.clone())) }, Token::Negative => { - let child_node = children.get(0).expect("Negative has no child[0]"); + let child_node = children.get(0).ok_or("Negative has no child[0]")?; let child_answer = evaluate_node(child_node)?; Ok(Number::new(-child_answer.value, child_answer.unit)) }, Token::Paren => { - let child_node = children.get(0).expect("Paren has no child[0]"); + let child_node = children.get(0).ok_or("Paren has no child[0]")?; return evaluate_node(child_node) }, Token::UnaryOperator(operator) => { - let child_node = children.get(0).expect(format!("Token {:?} has no child[0]", token).as_str()); + let child_node = children.get(0).ok_or(format!("Token {:?} has no child[0]", token))?; let child_answer = evaluate_node(child_node)?; match operator { Percent => { @@ -208,8 +208,8 @@ fn evaluate_node(ast_node: &AstNode) -> Result { } }, Token::TextOperator(operator) => { - let left_child = children.get(0).expect(format!("Token {:?} has no child[0]", token).as_str()); - let right_child = children.get(1).expect(format!("Token {:?} has no child[1]", token).as_str()); + let left_child = children.get(0).ok_or(format!("Token {:?} has no child[0]", token))?; + let right_child = children.get(1).ok_or(format!("Token {:?} has no child[1]", token))?; match operator { To => { @@ -233,8 +233,8 @@ fn evaluate_node(ast_node: &AstNode) -> Result { } }, Token::Operator(operator) => { - let left_child = children.get(0).expect(format!("Token {:?} has no child[0]", token).as_str()); - let right_child = children.get(1).expect(format!("Token {:?} has no child[1]", token).as_str()); + let left_child = children.get(0).ok_or(format!("Token {:?} has no child[0]", token))?; + let right_child = children.get(1).ok_or(format!("Token {:?} has no child[1]", token))?; let left = evaluate_node(left_child)?; let right = evaluate_node(right_child)?; match operator { diff --git a/src/lexer.rs b/src/lexer.rs index 1288d4b..8fca2ef 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -90,15 +90,8 @@ pub fn lex(input: &str, allow_trailing_operators: bool, default_degree: Unit) -> Some('2') | Some('3') => { byte_index += '2'.len_utf8(); chars.next(); - // match chars.peek().unwrap_or(&'-') { - // ...and if the 2 or 3 isn't part of a different number - // '.' | '0'..='9' => { - // is_multidimensional = false; - // }, - // we allow everything else and let the parser throw errors - // for things like km2pi - // _ => {} - // } + // we dont validate what comes after because it will be caught + // by the parser anyway (for example 3m35) }, _ => is_multidimensional = false, } diff --git a/src/parser.rs b/src/parser.rs index 3cad1be..79114ab 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -267,7 +267,7 @@ fn parse_level_6(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), S // level 7 precedence: numbers, parens fn parse_level_7(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), String> { - let token: &Token = tokens.get(pos).expect(&format!("Unexpected end of input at {}", pos)); + let token: &Token = tokens.get(pos).ok_or(format!("Unexpected end of input at {}", pos))?; match token { &Token::Number(_number) => { let node = AstNode::new(token.clone());