From 1e1a6582ff03d1b362fd72167ed43c3008a6b5dc Mon Sep 17 00:00:00 2001 From: Sweetbread Date: Sat, 13 Jun 2026 02:26:01 +0300 Subject: [PATCH] Split main by files --- src/main.rs | 108 ++++------------------------------------------- src/rpn.rs | 45 ++++++++++++++++++++ src/tokenizer.rs | 57 +++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 100 deletions(-) create mode 100644 src/rpn.rs create mode 100644 src/tokenizer.rs diff --git a/src/main.rs b/src/main.rs index f82fec2..3491922 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,13 @@ -use std::collections::HashMap; use std::io; use std::io::Write; +mod tokenizer; +use tokenizer::tokenizer; + +mod rpn; +use rpn::to_rpn; + + fn main() { let stdin = io::stdin(); let mut buffer = String::new(); @@ -12,107 +18,9 @@ fn main() { stdin.read_line(&mut buffer).unwrap(); - let tokens = tokenisator(&buffer); + let tokens = tokenizer(&buffer); let rpn = to_rpn(tokens); buffer.clear(); } } - -fn tokenisator(task: &str) -> Vec { - let mut tokens = Vec::::new(); - let chars: Vec = task.chars().collect(); - let mut pointer = 0; - - while pointer < task.len() { - dbg!(pointer, task.len()); - - let c = chars[pointer]; - match c { - '0' .. '9' => { - let mut end = pointer; - while end < task.len() { - let cur_c = chars[end]; - if !cur_c.is_ascii_digit() { - break; - } - end += 1; - } - tokens.push(Token::Number( - task.get(pointer..end).unwrap().parse::().unwrap() - )); - pointer = end-1; - } - '+' => tokens.push(Token::Addition), - '-' => tokens.push(Token::Substruction), - '*' => tokens.push(Token::Multiplication), - '/' => tokens.push(Token::Division), - '(' => tokens.push(Token::BracketOpen), - ')' => tokens.push(Token::BracketClose), - _ => {} - } - - pointer += 1; - } - - println!("{}", task); - - for t in &tokens { - println!("{:?}", t); - } - - return tokens; -} - -fn to_rpn(tokens: Vec) -> Vec { - let mut out_buf = Vec::::new(); - let mut act_buf = Vec::::new(); - - let priority = HashMap::from([ - (Token::BracketOpen, 0), - (Token::Addition, 1), - (Token::Substruction, 1), - (Token::Multiplication, 2), - (Token::Division, 2), - ]); - - for t in tokens { - match t { - Token::Number(_) => out_buf.push(t), - Token::BracketOpen => act_buf.push(t), - Token::BracketClose => { - while matches!(act_buf.last().unwrap(), Token::BracketOpen) { - out_buf.push(act_buf.pop().unwrap()); - } - act_buf.pop(); - } - _ => { - if !act_buf.is_empty() { - while priority.get(&t).unwrap() < priority.get(act_buf.last().unwrap()).unwrap() { - out_buf.push(act_buf.pop().unwrap()); - if act_buf.is_empty() { break; } - } - } - - act_buf.push(t); - } - } - } - - act_buf.reverse(); - out_buf.append(&mut act_buf); - - return out_buf; -} - -#[derive(Debug)] -#[derive(Eq, Hash, PartialEq)] -enum Token { - Number(i32), - Addition, - Substruction, - Multiplication, - Division, - BracketOpen, - BracketClose, -} diff --git a/src/rpn.rs b/src/rpn.rs new file mode 100644 index 0000000..f9fe92a --- /dev/null +++ b/src/rpn.rs @@ -0,0 +1,45 @@ +use std::collections::HashMap; + +use crate::tokenizer::Token; + + +pub fn to_rpn(tokens: Vec) -> Vec { + let mut out_buf = Vec::::new(); + let mut act_buf = Vec::::new(); + + let priority = HashMap::from([ + (Token::BracketOpen, 0), + (Token::Addition, 1), + (Token::Substruction, 1), + (Token::Multiplication, 2), + (Token::Division, 2), + ]); + + for t in tokens { + match t { + Token::Number(_) => out_buf.push(t), + Token::BracketOpen => act_buf.push(t), + Token::BracketClose => { + while matches!(act_buf.last().unwrap(), Token::BracketOpen) { + out_buf.push(act_buf.pop().unwrap()); + } + act_buf.pop(); + } + _ => { + if !act_buf.is_empty() { + while priority.get(&t).unwrap() < priority.get(act_buf.last().unwrap()).unwrap() { + out_buf.push(act_buf.pop().unwrap()); + if act_buf.is_empty() { break; } + } + } + + act_buf.push(t); + } + } + } + + act_buf.reverse(); + out_buf.append(&mut act_buf); + + return out_buf; +} diff --git a/src/tokenizer.rs b/src/tokenizer.rs new file mode 100644 index 0000000..0e6f372 --- /dev/null +++ b/src/tokenizer.rs @@ -0,0 +1,57 @@ +#[derive(Debug)] +#[derive(Eq, Hash, PartialEq)] +pub enum Token { + Number(i32), + Addition, + Substruction, + Multiplication, + Division, + BracketOpen, + BracketClose, +} + + +pub fn tokenizer(task: &str) -> Vec { + let mut tokens = Vec::::new(); + let chars: Vec = task.chars().collect(); + let mut pointer = 0; + + while pointer < task.len() { + dbg!(pointer, task.len()); + + let c = chars[pointer]; + match c { + '0' .. '9' => { + let mut end = pointer; + while end < task.len() { + let cur_c = chars[end]; + if !cur_c.is_ascii_digit() { + break; + } + end += 1; + } + tokens.push(Token::Number( + task.get(pointer..end).unwrap().parse::().unwrap() + )); + pointer = end-1; + } + '+' => tokens.push(Token::Addition), + '-' => tokens.push(Token::Substruction), + '*' => tokens.push(Token::Multiplication), + '/' => tokens.push(Token::Division), + '(' => tokens.push(Token::BracketOpen), + ')' => tokens.push(Token::BracketClose), + _ => {} + } + + pointer += 1; + } + + println!("{}", task); + + for t in &tokens { + println!("{:?}", t); + } + + return tokens; +}