commit b82fbc168a1c439bf1bfd373993885afda9afde1 Author: Sweetbread Date: Sat Jun 13 01:20:34 2026 +0300 Init commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..7f24dae --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "calc" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d962735 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "calc" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..b403224 --- /dev/null +++ b/shell.nix @@ -0,0 +1,8 @@ +{ pkgs ? import {} }: with pkgs; mkShell { + buildInputs = [ + cargo + rustc + rust-analyzer + pkg-config + ]; +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..c2a0d42 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,75 @@ +use core::fmt; +use std::io; +use std::io::Write; + +fn main() { + let stdin = io::stdin(); + let mut buffer = String::new(); + + loop { + print!("> "); + io::stdout().flush().unwrap(); + + stdin.read_line(&mut buffer).unwrap(); + + let tokens = tokenisator(&buffer); + + 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; +} + +#[derive(Debug)] +enum Token { + Number(i32), + Addition, + Substruction, + Multiplication, + Division, + BracketOpen, + BracketClose, +}