From b19c9b70f03c3da708daaf99f20b7b91e5bd8ad9 Mon Sep 17 00:00:00 2001 From: Kirill Leonov Date: Fri, 19 Jan 2024 18:34:08 +0300 Subject: [PATCH] carried out parsing operations --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/parser/appropriation.rs | 12 ++++++ src/parser/calculation.rs | 22 +++++++++++ src/parser/condition.rs | 23 +++++++++++ src/parser/file.rs | 10 +++++ src/parser/mod.rs | 6 ++- src/parser/opcode_operations.rs | 69 --------------------------------- src/parser/opcode_parser.rs | 16 +++++--- src/parser/user_var.rs | 16 ++++++++ 10 files changed, 100 insertions(+), 78 deletions(-) create mode 100644 src/parser/appropriation.rs create mode 100644 src/parser/calculation.rs create mode 100644 src/parser/condition.rs create mode 100644 src/parser/file.rs delete mode 100644 src/parser/opcode_operations.rs create mode 100644 src/parser/user_var.rs diff --git a/Cargo.lock b/Cargo.lock index e847246..05438b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -752,7 +752,7 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minicode" -version = "0.1.3" +version = "1.0.1" dependencies = [ "clap", "self_update", diff --git a/Cargo.toml b/Cargo.toml index 9b3586d..e1cb654 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "minicode" -version = "0.1.3" +version = "1.0.1" edition = "2021" [dependencies] diff --git a/src/parser/appropriation.rs b/src/parser/appropriation.rs new file mode 100644 index 0000000..dfe0ca6 --- /dev/null +++ b/src/parser/appropriation.rs @@ -0,0 +1,12 @@ +use crate::opcode::OpCode; +use crate::opcode::OpCode::*; +use crate::opcode::ValueType::*; + +pub fn appropriation(data: Vec<&str>) -> OpCode { + let value_name = data[1].to_string(); + let value: String = data.into_iter().skip(2).collect::>().join(" "); + match value.parse::() { + Ok(parsed) => Create(value_name, Int(parsed)), + Err(_e) => Create(value_name, Line(value)), + } +} diff --git a/src/parser/calculation.rs b/src/parser/calculation.rs new file mode 100644 index 0000000..10edd4f --- /dev/null +++ b/src/parser/calculation.rs @@ -0,0 +1,22 @@ +use crate::opcode::OpCode; +use crate::opcode::OpCode::*; +use crate::opcode::OperationType::*; + +pub fn calculation(data: Vec<&str>) -> OpCode { + if data.len() != 4 { + return ErrorCode("the operation is not specified correctly".to_string()); + } + + let value_name = data[1].to_string(); + + let op = match data[2] { + "+" => Increment, + "-" => Decrement, + _ => return ErrorCode("wrong operation".to_string()), + }; + + match data[3].to_string().parse::() { + Ok(parsed) => Operation(value_name, op, parsed), + Err(_e) => ErrorCode("wrong type for operation".to_string()), + } +} diff --git a/src/parser/condition.rs b/src/parser/condition.rs new file mode 100644 index 0000000..82243d6 --- /dev/null +++ b/src/parser/condition.rs @@ -0,0 +1,23 @@ +use crate::opcode::OpCode; +use crate::opcode::OpCode::*; + +pub fn condition(data: Vec<&str>) -> OpCode { + let value_name = data[1].to_string(); + let true_or_false = match data[2] { + "=" => true, + "!" => false, + _ => return ErrorCode("wrong condition".to_string()), + }; + + let target_value = match data[3].parse::() { + Ok(parsed) => parsed, + Err(_) => return ErrorCode("wrong target value for operation".to_string()), + }; + + let target_pointer = match data[4].parse::() { + Ok(parsed) => parsed, + Err(_) => return ErrorCode("wrong target pointer".to_string()), + }; + + Condition(value_name, target_value, true_or_false, target_pointer) +} diff --git a/src/parser/file.rs b/src/parser/file.rs new file mode 100644 index 0000000..7db2ec0 --- /dev/null +++ b/src/parser/file.rs @@ -0,0 +1,10 @@ +use crate::files::get_content; +pub use crate::opcode::OpCode; +pub use crate::opcode::OpCode::*; +pub use crate::opcode::ValueType::*; + +pub fn file(data: Vec<&str>) -> OpCode { + let value_name = data[1].to_string(); + let content = get_content(&data[2].to_string()); + Create(value_name, Line(content)) +} diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 8f57e46..6020d91 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1,5 +1,9 @@ -mod opcode_operations; +mod appropriation; +mod calculation; +mod condition; +mod file; mod opcode_parser; +mod user_var; use crate::opcode::*; pub fn parse(lines: &Vec) -> Vec { diff --git a/src/parser/opcode_operations.rs b/src/parser/opcode_operations.rs deleted file mode 100644 index c846ab6..0000000 --- a/src/parser/opcode_operations.rs +++ /dev/null @@ -1,69 +0,0 @@ -use crate::files::get_content; -pub use crate::opcode::OpCode; -pub use crate::opcode::OpCode::*; -pub use crate::opcode::OperationType::*; -pub use crate::opcode::ValueType::*; -use std::io; - -pub fn calculation(data: Vec<&str>) -> OpCode { - let value_name = data[1].to_string(); - - let op = match data[2] { - "+" => Increment, - "-" => Decrement, - _ => return ErrorCode("wrong operation".to_string()), - }; - - match data[3].to_string().parse::() { - Ok(parsed) => Operation(value_name, op, parsed), - Err(_e) => ErrorCode("wrong type for operation".to_string()), - } -} - -pub fn condition(data: Vec<&str>) -> OpCode { - let value_name = data[1].to_string(); - let true_or_false = match data[2] { - "=" => true, - "!" => false, - _ => return ErrorCode("wrong condition".to_string()), - }; - - let target_value = match data[3].parse::() { - Ok(parsed) => parsed, - Err(_) => return ErrorCode("wrong target value for operation".to_string()), - }; - - let target_pointer = match data[4].parse::() { - Ok(parsed) => parsed, - Err(_) => return ErrorCode("wrong target pointer".to_string()), - }; - - Condition(value_name, target_value, true_or_false, target_pointer) -} - -pub fn user_var(data: Vec<&str>) -> OpCode { - let mut input = String::new(); - let value_name = data[1].to_string(); - let output = data.into_iter().skip(2).collect::>().join(" "); - println!("{}", output); - io::stdin().read_line(&mut input).expect("cant read"); - match input.trim().parse::() { - Ok(parsed) => Create(value_name, Int(parsed)), - Err(_e) => Create(value_name, Line(input)), - } -} - -pub fn file(data: Vec<&str>) -> OpCode { - let value_name = data[1].to_string(); - let content = get_content(&data[2].to_string()); - Create(value_name, Line(content)) -} - -pub fn appropriation(data: Vec<&str>) -> OpCode { - let value_name = data[1].to_string(); - let value: String = data.into_iter().skip(2).collect::>().join(" "); - match value.parse::() { - Ok(parsed) => Create(value_name, Int(parsed)), - Err(_e) => Create(value_name, Line(value)), - } -} diff --git a/src/parser/opcode_parser.rs b/src/parser/opcode_parser.rs index 7aeb186..78fd91b 100644 --- a/src/parser/opcode_parser.rs +++ b/src/parser/opcode_parser.rs @@ -1,23 +1,27 @@ pub use crate::opcode::OpCode; pub use crate::opcode::OpCode::*; -use super::opcode_operations; +use super::appropriation::appropriation; +use super::calculation::calculation; +use super::condition::condition; +use super::file::file; +use super::user_var::user_var; pub fn get_opcode(line: &String) -> OpCode { let parts: Vec<&str> = line.split_whitespace().collect(); if parts[0] == ">" { - opcode_operations::appropriation(parts) + appropriation(parts) } else if parts[0] == "p" { Print(parts[1].to_string()) } else if parts[0] == "f" { - opcode_operations::file(parts) + file(parts) } else if parts[0] == "$>" { - opcode_operations::user_var(parts) + user_var(parts) } else if parts[0] == "=" { - opcode_operations::calculation(parts) + calculation(parts) } else if parts[0] == "?" { - opcode_operations::condition(parts) + condition(parts) } else { ErrorCode("Could not recognize the command".to_string()) } diff --git a/src/parser/user_var.rs b/src/parser/user_var.rs new file mode 100644 index 0000000..7766e54 --- /dev/null +++ b/src/parser/user_var.rs @@ -0,0 +1,16 @@ +use crate::opcode::OpCode; +use crate::opcode::OpCode::*; +use crate::opcode::ValueType::*; +use std::io; + +pub fn user_var(data: Vec<&str>) -> OpCode { + let mut input = String::new(); + let value_name = data[1].to_string(); + let output = data.into_iter().skip(2).collect::>().join(" "); + println!("{}", output); + io::stdin().read_line(&mut input).expect("cant read"); + match input.trim().parse::() { + Ok(parsed) => Create(value_name, Int(parsed)), + Err(_e) => Create(value_name, Line(input)), + } +}