summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.rs5
-rw-r--r--src/parser/mod.rs63
2 files changed, 66 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index a68851f..551710a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,7 @@
pub mod parser;
-pub mod processor;
fn main() {
- println!("Hello, world!");
+ let _ = parser::parse_line("loop ".to_string());
+ let _ = parser::parse_line(" mov r0, r1".to_string());
+ let _ = parser::parse_line(" beq suca".to_string());
}
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 4cf7e00..69fa6ca 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -20,6 +20,20 @@ pub struct Row {
pub args: CommandArgs,
}
+impl Row {
+ pub fn new() -> Self {
+ let command = CommandArgs {
+ arg_type: CommandArgsType::Nil,
+ args_vec: Vec::<String>::new(),
+ };
+
+ Row {
+ command: CommandType::Label,
+ args: command,
+ }
+ }
+}
+
#[test]
fn check_row() {
let r: Row = Row {
@@ -31,3 +45,52 @@ fn check_row() {
};
assert_eq!(r.args.args_vec[0], "r0");
}
+
+fn remove_spaces(line: String) -> String {
+ let mut it = line.chars().peekable();
+ let mut splitted_string = "".to_string();
+ while let Some(&c) = it.peek() {
+ match c {
+ ' ' | '\t' => {
+ it.next();
+ }
+ ch => {
+ splitted_string.push(ch);
+ it.next();
+ if let Some(&t) = it.peek() {
+ match t {
+ ' ' | '\t' => {
+ splitted_string.push(' ');
+ }
+ ch => {
+ splitted_string.push(ch);
+ }
+ }
+ }
+ it.next();
+ }
+ }
+ }
+
+ splitted_string
+
+}
+
+pub fn parse_line(line: String) -> Result<Row, String> {
+ let mut row = Row::new();
+
+ let mut splitted_string = remove_spaces(line);
+
+ splitted_string = splitted_string.to_lowercase();
+ let mut words : Vec<&str> = splitted_string.split(" ").collect();
+
+ if words.len() > 1 {
+ if words[1].ends_with(",") {
+ words[1] = words[1].trim_end_matches(',');
+ }
+ }
+
+ println!("{}, {:?}", words.len(), words);
+
+ Ok(row)
+}