diff --git a/src/lexer.rs b/src/lexer.rs index 1ab9235..4a16d1b 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -38,6 +38,7 @@ pub fn lex(input: &str) -> Result { tokens.push(Token::Operator(RightParen)); }, 'π' => tokens.push(Token::Constant(Pi)), + '\'' => tokens.push(Token::Unit(Foot)), '"' | '“' | '”' | '″' => tokens.push(Token::LexerKeyword(DoubleQuotes)), value if value.is_whitespace() => {}, value if value.is_alphabetic() => { @@ -459,7 +460,6 @@ pub fn lex(input: &str) -> Result { token_index += 1; } } - println!("TOKENS {:?}", tokens); Ok(tokens) } diff --git a/src/parser.rs b/src/parser.rs index 7381068..3cad1be 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2,6 +2,7 @@ use crate::{Token, TokenVector}; use crate::Operator::{Caret, Divide, LeftParen, Minus, Modulo, Multiply, Plus, RightParen}; use crate::UnaryOperator::{Percent, Factorial}; use crate::TextOperator::{To, Of}; +use crate::units::Unit::{Foot, Inch}; #[derive(Debug)] pub struct AstNode { @@ -67,6 +68,20 @@ fn parse_level_2(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), S node = new_node; pos = next_pos; }, + Some(&Token::Number(_)) => { + // parse 6'4" + let (right_node, next_pos) = parse_level_3(tokens, pos)?; + if let Token::Unit(Foot) = node.token { + if let Token::Unit(Inch) = right_node.token { + let mut new_node = AstNode::new(Token::Operator(Plus)); + new_node.children.push(node); + new_node.children.push(right_node); + node = new_node; + pos = next_pos; + } + } + return Ok((node, pos)); + }, _ => { return Ok((node, pos)); }, @@ -151,8 +166,6 @@ fn parse_level_3(tokens: &TokenVector, pos: usize) -> Result<(AstNode, usize), S // 2(3), pi(3), )(3) Some(&Token::Operator(LeftParen)) => { let last_token = tokens.get(pos - 1); - println!("{:?}", token); - println!("{:?}", last_token); match last_token { Some(&Token::Number(_)) | Some(&Token::Constant(_)) | Some(&Token::Operator(RightParen)) => { let (right_node, next_pos) = parse_level_4(tokens, pos)?;