···11use std::str::FromStr;
22use decimal::d128;
33-use crate::{Token, TokenVector};
33+use crate::Token;
44use crate::Operator::{Caret, Divide, LeftParen, Minus, Modulo, Multiply, Plus, RightParen};
55use crate::UnaryOperator::{Percent, Factorial};
66use crate::TextOperator::{Of, To};
···1818 }
1919}
20202121-/// Lex an input string and return a [`TokenVector`]
2222-pub fn lex(input: &str, allow_trailing_operators: bool, default_degree: Unit) -> Result<TokenVector, String> {
2121+/// Lex an input string and returns [`Token`]s
2222+pub fn lex(input: &str, allow_trailing_operators: bool, default_degree: Unit) -> Result<Vec<Token>, String> {
23232424 let mut input = input.replace(",", ""); // ignore commas
2525+2526 input = input.to_lowercase();
26272728 if allow_trailing_operators {
···3435 }
35363637 let mut chars = input.chars().peekable();
3737- let mut tokens: TokenVector = vec![];
3838+ let mut tokens: Vec<Token> = vec![];
3839 let max_word_length = 30;
39404041 let mut left_paren_count = 0;
+3-6
src/lib.rs
···28282929/// Units, and functions you can use with them
3030pub mod units;
3131-/// Turns a string into a [`TokenVector`]
3131+/// Turns a string into [`Token`]s
3232pub mod lexer;
3333-/// Turns a [`TokenVector`] into an [`AstNode`](parser::AstNode)
3333+/// Turns [`Token`]s into an [`AstNode`](parser::AstNode)
3434pub mod parser;
3535/// Turns an [`AstNode`](parser::AstNode) into a [`Number`]
3636pub mod evaluator;
···123123}
124124125125#[derive(Clone, Debug)]
126126-/// A constants like [`Pi`](Constant::Pi) or [`E`](Constant::E).
126126+/// A constant like [`Pi`](Constant::Pi) or [`E`](Constant::E).
127127pub enum Constant {
128128 Pi,
129129 E,
···190190 Negative,
191191 Unit(units::Unit),
192192}
193193-194194-/// A vector of [`Token`]
195195-pub type TokenVector = Vec<Token>;
196193197194/// Evaluates a string into a resulting [`Number`].
198195///
+11-11
src/parser.rs
···11-use crate::{Token, TokenVector};
11+use crate::Token;
22use crate::Operator::{Caret, Divide, LeftParen, Minus, Modulo, Multiply, Plus, RightParen};
33use crate::UnaryOperator::{Percent, Factorial};
44use crate::TextOperator::{To, Of};
···2222 }
2323}
24242525-/// Parse [`TokenVector`] into an Abstract Syntax Tree ([`AstNode`])
2626-pub fn parse(tokens: &TokenVector) -> Result<AstNode, String> {
2525+/// Parse [`Token`]s into an Abstract Syntax Tree ([`AstNode`])
2626+pub fn parse(tokens: &Vec<Token>) -> Result<AstNode, String> {
2727 parse_level_1(tokens, 0).and_then(|(ast, next_pos)| if next_pos == tokens.len() {
2828 Ok(ast)
2929 } else {
···33333434// level 1 precedence (lowest): to, of
3535/// Parse [`To`](crate::TextOperator::To) and [`Of`](crate::TextOperator::Of)
3636-pub fn parse_level_1(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), String> {
3636+pub fn parse_level_1(tokens: &Vec<Token>, pos: usize) -> Result<(AstNode, usize), String> {
3737 // do higher precedences first, then come back down
3838 let (mut node, mut pos) = parse_level_2(tokens, pos)?;
3939 // now we loop through the next tokens
···61616262// level 2 precedence: +, -
6363/// Parse [`Plus`](crate::Operator::Plus) and [`Minus`](crate::Operator::Minus)
6464-pub fn parse_level_2(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), String> {
6464+pub fn parse_level_2(tokens: &Vec<Token>, pos: usize) -> Result<(AstNode, usize), String> {
6565 let (mut node, mut pos) = parse_level_3(tokens, pos)?;
6666 loop {
6767 let token = tokens.get(pos);
···83838484// level 3 precedence: *, /, modulo, implicative multiplication, foot-inch 6'4"
8585/// Parse [`Multiply`](crate::Operator::Multiply), [`Divide`](crate::Operator::Divide), [`Modulo`](crate::Operator::Modulo) and implicative multiplication (for example`2pi`)
8686-pub fn parse_level_3(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), String> {
8686+pub fn parse_level_3(tokens: &Vec<Token>, pos: usize) -> Result<(AstNode, usize), String> {
87878888 // parse foot-inch syntax 6'4"
8989 let token0 = tokens.get(pos);
···135135 // such will only end up here if they were unable to be parsed as part of
136136 // other operators.
137137 // Note that this match statement matches an AstNode token, but the
138138- // matches nested inside check the TokenVector. That's why we for example
138138+ // matches nested inside check the [`Token`]s. That's why we for example
139139 // match a FunctionIdentifier, and inside that, a RightParen.
140140141141 // pi2, )2
···215215216216// level 4 precedence: ^
217217/// Parse [`Caret`](crate::Operator::Caret)
218218-pub fn parse_level_4(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), String> {
218218+pub fn parse_level_4(tokens: &Vec<Token>, pos: usize) -> Result<(AstNode, usize), String> {
219219 let (mut node, mut pos) = parse_level_5(tokens, pos)?;
220220 loop {
221221 let token = tokens.get(pos);
···237237238238// level 5 precedence: - (as in -5, but not 4-5)
239239/// Parse [`Negative`](Token::Negative)
240240-pub fn parse_level_5(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), String> {
240240+pub fn parse_level_5(tokens: &Vec<Token>, pos: usize) -> Result<(AstNode, usize), String> {
241241 // Here we parse the negative unary operator. If the current token
242242 // is a minus, we wrap the right_node inside a Negative AstNode.
243243 //
···264264265265// level 6 precedence: !, percent, units attached to values
266266/// Parse [`Factorial`](crate::UnaryOperator::Factorial) and [`Percent`](crate::UnaryOperator::Percent)
267267-pub fn parse_level_6(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), String> {
267267+pub fn parse_level_6(tokens: &Vec<Token>, pos: usize) -> Result<(AstNode, usize), String> {
268268 let (mut node, mut pos) = parse_level_7(tokens, pos)?;
269269 loop {
270270 let token = tokens.get(pos);
···300300/// [`Constant`](Token::Constant),
301301/// [`FunctionIdentifier`](Token::FunctionIdentifier),
302302/// [`Paren`](Token::Paren)
303303-pub fn parse_level_7(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), String> {
303303+pub fn parse_level_7(tokens: &Vec<Token>, pos: usize) -> Result<(AstNode, usize), String> {
304304 let token: &Token = tokens.get(pos).ok_or(format!("Unexpected end of input at {}", pos))?;
305305 match token {
306306 &Token::Number(_number) => {