From f7a5481268ae5869a81b0c0c1791a0497f48969e Mon Sep 17 00:00:00 2001 From: Kasper Date: Thu, 12 Dec 2019 22:25:08 +0100 Subject: [PATCH] to/of operators, auto insert parens --- README.md | 2 -- src/lexer.rs | 37 +++++++++++++++++++++++++++++++------ src/main.rs | 4 +++- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index d520e5f..9934340 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ calculation + conversion Uses Decimal Floating Point numbers instead of Binary Coded Decimals for better accuracy. - -https://adriann.github.io/rust_parser.html diff --git a/src/lexer.rs b/src/lexer.rs index 1b91ede..c3ee41d 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -1,7 +1,7 @@ use std::str::FromStr; use decimal::d128; use crate::{Token, TokenVector}; -use crate::Operator::{Caret, Divide, Factorial, LeftParen, Minus, Modulo, Multiply, PercentOrModulo, Plus, RightParen}; +use crate::Operator::{Caret, Divide, Factorial, LeftParen, Minus, Modulo, ModuloOrPercent, Multiply, Of, Plus, RightParen, To}; use crate::Identifier::{Acos, Acosh, Asin, Asinh, Atan, Atanh, Cbrt, Ceil, Cos, Cosh, Exp, Fabs, Floor, Ln, Log, Pi, Round, Sin, Sinh, Sqrt, Tan, Tanh, E}; pub fn lex(input: &str) -> Result { @@ -10,6 +10,9 @@ pub fn lex(input: &str) -> Result { let mut tokens: TokenVector = vec![]; let max_word_length = 5; + let mut left_paren_count = 0; + let mut right_paren_count = 0; + let mut byte_index = 0; while let Some((_index, current_char)) = chars.next() { match current_char { @@ -17,11 +20,17 @@ pub fn lex(input: &str) -> Result { '-' => tokens.push(Token::Operator(Minus)), '*' => tokens.push(Token::Operator(Multiply)), '/' => tokens.push(Token::Operator(Divide)), - '%' => tokens.push(Token::Operator(PercentOrModulo)), + '%' => tokens.push(Token::Operator(ModuloOrPercent)), '^' => tokens.push(Token::Operator(Caret)), '!' => tokens.push(Token::Operator(Factorial)), - '(' => tokens.push(Token::Operator(LeftParen)), - ')' => tokens.push(Token::Operator(RightParen)), + '(' => { + left_paren_count += 1; + tokens.push(Token::Operator(LeftParen)); + }, + ')' => { + right_paren_count += 1; + tokens.push(Token::Operator(RightParen)); + }, 'π' => tokens.push(Token::Identifier(Pi)), ',' => continue, value if value.is_whitespace() => continue, @@ -34,7 +43,6 @@ pub fn lex(input: &str) -> Result { if end_index >= start_index + max_word_length - 1 { break; } if current_char.is_alphabetic() { - println!("{}", current_char); byte_index += current_char.len_utf8(); chars.next(); end_index += 1; @@ -44,12 +52,14 @@ pub fn lex(input: &str) -> Result { } let string = &input[start_index..=end_index]; - println!("STR {}", string); match string { // MAKE SURE max_word_length IS EQUAL TO THE // LENGTH OF THE LONGEST STRING IN THIS MATCH STATEMENT. + "to" => tokens.push(Token::Operator(To)), + "of" => tokens.push(Token::Operator(Of)), + "pi" => tokens.push(Token::Identifier(Pi)), "e" => tokens.push(Token::Identifier(E)), @@ -124,5 +134,20 @@ pub fn lex(input: &str) -> Result { // (aka "user-perceived characters"). byte_index += current_char.len_utf8(); }; + + if left_paren_count > right_paren_count { + println!("Added right_parens"); + let missing_right_parens = left_paren_count - right_paren_count; + println!("{}", missing_right_parens); + for _ in 0..missing_right_parens { + tokens.push(Token::Operator(RightParen)); + } + } else if left_paren_count < right_paren_count { + println!("Added left_parens"); + let missing_left_parens = right_paren_count - left_paren_count; + for _ in 0..missing_left_parens { + tokens.insert(0, Token::Operator(LeftParen)); + } + } return Ok(tokens) } diff --git a/src/main.rs b/src/main.rs index 9917e00..4cbe6c0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,12 +7,14 @@ pub enum Operator { Minus, Multiply, Divide, - PercentOrModulo, + ModuloOrPercent, Modulo, Caret, Factorial, LeftParen, RightParen, + To, + Of, } #[derive(Debug)]