diff --git a/README.md b/README.md index 6058cee..699a2a2 100644 --- a/README.md +++ b/README.md @@ -17,5 +17,7 @@ Usage: `$ ./m8db (filename)` * `IS_ZERO r line` * `.labelname` +`# anything` is a comment + Where `r` is a register number, `line` is a line number and `label` is a label name. `IS_ZERO` jumps to `label` if `r` is zero diff --git a/src/stmt.rs b/src/stmt.rs index d58a78d..a44106d 100644 --- a/src/stmt.rs +++ b/src/stmt.rs @@ -49,6 +49,7 @@ enum IrStmt<'a> { JumpLine(LineNumber), Label(&'a str), Stop, + None, } pub fn parse(text: &str, file_name: String) -> Result { @@ -60,14 +61,12 @@ pub fn parse(text: &str, file_name: String) -> Result { let code_lines = text.lines().collect::>(); for (line_index, line) in code_lines.iter().enumerate() { - if line.split_whitespace().next().is_none() { - continue; - } let result = parse_line(line); match result { Ok(IrStmt::Label(name)) => { labels.insert(name, statement_number); } + Ok(IrStmt::None) => {} Ok(stmt) => { statement_number += 1; statements.push((stmt, Span(line_index))); @@ -84,6 +83,7 @@ pub fn parse(text: &str, file_name: String) -> Result { let result: Result, String> = statements .iter() + .filter(|stmt| !matches!(stmt, (IrStmt::None, _))) .map(|(stmt, span)| match *stmt { IrStmt::Inc(r) => Ok((Stmt::Inc(r), *span)), IrStmt::Dec(r) => Ok((Stmt::Dec(r), *span)), @@ -157,6 +157,7 @@ pub fn parse(text: &str, file_name: String) -> Result { )), IrStmt::Stop => Ok((Stmt::Stop, *span)), IrStmt::Label(_) => unreachable!(), + IrStmt::None => unreachable!(), }) .collect(); @@ -177,7 +178,11 @@ fn parse_line(line: &str) -> Result { let display_err = |parse_err: ParseIntError| parse_err.to_string(); let mut iter = line.split_whitespace(); - let first = iter.next().expect("Empty lines filtered out"); + let first = iter.next(); + let first = match first { + Some(first) => first, + None => return Ok(IrStmt::None), + }; Ok(match first { "INC" => { @@ -221,6 +226,8 @@ fn parse_line(line: &str) -> Result { stmt => { if stmt.starts_with('.') { IrStmt::Label(&stmt[1..]) + } else if stmt.starts_with('#') { + IrStmt::None } else { return Err(format!("Illegal instruction: '{}'", stmt)); } diff --git a/test.m8 b/test.m8 index 1ba61ca..87a696c 100644 --- a/test.m8 +++ b/test.m8 @@ -4,5 +4,5 @@ JUMP 8 INC 2 STOP INC 3 -#another comment + JUMP 4 \ No newline at end of file