Add basic tokenization
This commit is contained in:
commit
ac30bfdfa5
4 changed files with 121 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/target
|
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
@ -0,0 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "calc"
|
||||
version = "0.1.0"
|
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "calc"
|
||||
description = "A simple terminal calculator"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
104
src/main.rs
Normal file
104
src/main.rs
Normal file
|
@ -0,0 +1,104 @@
|
|||
use::std::io;
|
||||
|
||||
// Enum of different mathematical operations
|
||||
#[derive(Debug)]
|
||||
enum Operators {
|
||||
Add,
|
||||
Subtract,
|
||||
Multiply,
|
||||
Divide,
|
||||
Power,
|
||||
}
|
||||
|
||||
// Enum of different separators
|
||||
#[derive(Debug)]
|
||||
enum Separators {
|
||||
Open,
|
||||
Close,
|
||||
Decimal,
|
||||
}
|
||||
|
||||
// Enum for types of one 'block" in an eqation
|
||||
#[derive(Debug)]
|
||||
enum Blocks {
|
||||
Operator(Operators), // A mathematical operator
|
||||
Separator(Separators), // A separator, eg. '(', ')'
|
||||
Integer(i32), // An integer
|
||||
Float(f64), // A float
|
||||
Error,
|
||||
}
|
||||
|
||||
// Determine what type a 'block' is
|
||||
fn determine_type(block: &str) -> Blocks {
|
||||
let block_type = match block {
|
||||
// Check if it's an operator
|
||||
"+" => Blocks::Operator(Operators::Add),
|
||||
"-" => Blocks::Operator(Operators::Subtract),
|
||||
"*" => Blocks::Operator(Operators::Multiply),
|
||||
"/" => Blocks::Operator(Operators::Divide),
|
||||
"^" => Blocks::Operator(Operators::Power),
|
||||
// Check if it's a separator
|
||||
"(" => Blocks::Separator(Separators::Open),
|
||||
")" => Blocks::Separator(Separators::Close),
|
||||
"." => Blocks::Separator(Separators::Decimal),
|
||||
|
||||
_ => {
|
||||
match block.parse::<i32>() {
|
||||
Ok(integer) => Blocks::Integer(integer),
|
||||
Err(_e) => {
|
||||
match block.parse::<f64>() {
|
||||
Ok(float) => Blocks::Float(float),
|
||||
Err(_e) => Blocks::Error,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
return block_type;
|
||||
}
|
||||
// cut the input string into different pieces
|
||||
fn separate(input: String) {
|
||||
// Vector for the whole equation
|
||||
let mut equation: Vec<Blocks> = Vec::new();
|
||||
// Vector for collecting a single number
|
||||
let mut number: Vec<char> = Vec::new();
|
||||
|
||||
// Loop through each character in the equation
|
||||
for i in input.chars() {
|
||||
match i.to_digit(10) {
|
||||
Some(..) => {
|
||||
number.push(i);
|
||||
},
|
||||
None => {
|
||||
if i == '.' {
|
||||
number.push(i);
|
||||
} else {
|
||||
let full_number: String = number.iter().collect::<String>();
|
||||
println!("Full number found: {}", full_number);
|
||||
number = Vec::new(); // Any found number has finished, so clear the vector
|
||||
equation.push(determine_type(&full_number));
|
||||
}
|
||||
equation.push(determine_type(&i.to_string())); // Determine the type and append it to the equation vector
|
||||
}
|
||||
}
|
||||
println!("{}", i);
|
||||
}
|
||||
let full_number: String = number.iter().collect::<String>();
|
||||
equation.push(determine_type(&full_number));
|
||||
println!("{:?}", equation);
|
||||
// 5+6-2/45*(6-2)^5
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("RUNK (Rust Universal Number Calculator)");
|
||||
|
||||
let mut input = String::new();
|
||||
|
||||
io::stdin()
|
||||
.read_line(&mut input)
|
||||
.expect("Failed to read input");
|
||||
input = input.split_whitespace().collect();
|
||||
|
||||
println!("Your input was {}", input);
|
||||
separate(input);
|
||||
}
|
Loading…
Reference in a new issue