added comment support

This commit is contained in:
nora 2021-09-19 14:23:28 +02:00
parent a24b93fd23
commit fc974548ab
3 changed files with 14 additions and 5 deletions

View file

@ -17,5 +17,7 @@ Usage: `$ ./m8db (filename)`
* `IS_ZERO r line` * `IS_ZERO r line`
* `.labelname` * `.labelname`
`# anything` is a comment
Where `r` is a register number, `line` is a line number and `label` is a label name. 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 `IS_ZERO` jumps to `label` if `r` is zero

View file

@ -49,6 +49,7 @@ enum IrStmt<'a> {
JumpLine(LineNumber), JumpLine(LineNumber),
Label(&'a str), Label(&'a str),
Stop, Stop,
None,
} }
pub fn parse(text: &str, file_name: String) -> Result<Code, String> { pub fn parse(text: &str, file_name: String) -> Result<Code, String> {
@ -60,14 +61,12 @@ pub fn parse(text: &str, file_name: String) -> Result<Code, String> {
let code_lines = text.lines().collect::<Vec<_>>(); let code_lines = text.lines().collect::<Vec<_>>();
for (line_index, line) in code_lines.iter().enumerate() { for (line_index, line) in code_lines.iter().enumerate() {
if line.split_whitespace().next().is_none() {
continue;
}
let result = parse_line(line); let result = parse_line(line);
match result { match result {
Ok(IrStmt::Label(name)) => { Ok(IrStmt::Label(name)) => {
labels.insert(name, statement_number); labels.insert(name, statement_number);
} }
Ok(IrStmt::None) => {}
Ok(stmt) => { Ok(stmt) => {
statement_number += 1; statement_number += 1;
statements.push((stmt, Span(line_index))); statements.push((stmt, Span(line_index)));
@ -84,6 +83,7 @@ pub fn parse(text: &str, file_name: String) -> Result<Code, String> {
let result: Result<Vec<(Stmt, Span)>, String> = statements let result: Result<Vec<(Stmt, Span)>, String> = statements
.iter() .iter()
.filter(|stmt| !matches!(stmt, (IrStmt::None, _)))
.map(|(stmt, span)| match *stmt { .map(|(stmt, span)| match *stmt {
IrStmt::Inc(r) => Ok((Stmt::Inc(r), *span)), IrStmt::Inc(r) => Ok((Stmt::Inc(r), *span)),
IrStmt::Dec(r) => Ok((Stmt::Dec(r), *span)), IrStmt::Dec(r) => Ok((Stmt::Dec(r), *span)),
@ -157,6 +157,7 @@ pub fn parse(text: &str, file_name: String) -> Result<Code, String> {
)), )),
IrStmt::Stop => Ok((Stmt::Stop, *span)), IrStmt::Stop => Ok((Stmt::Stop, *span)),
IrStmt::Label(_) => unreachable!(), IrStmt::Label(_) => unreachable!(),
IrStmt::None => unreachable!(),
}) })
.collect(); .collect();
@ -177,7 +178,11 @@ fn parse_line(line: &str) -> Result<IrStmt, String> {
let display_err = |parse_err: ParseIntError| parse_err.to_string(); let display_err = |parse_err: ParseIntError| parse_err.to_string();
let mut iter = line.split_whitespace(); 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 { Ok(match first {
"INC" => { "INC" => {
@ -221,6 +226,8 @@ fn parse_line(line: &str) -> Result<IrStmt, String> {
stmt => { stmt => {
if stmt.starts_with('.') { if stmt.starts_with('.') {
IrStmt::Label(&stmt[1..]) IrStmt::Label(&stmt[1..])
} else if stmt.starts_with('#') {
IrStmt::None
} else { } else {
return Err(format!("Illegal instruction: '{}'", stmt)); return Err(format!("Illegal instruction: '{}'", stmt));
} }

View file

@ -4,5 +4,5 @@ JUMP 8
INC 2 INC 2
STOP STOP
INC 3 INC 3
#another comment
JUMP 4 JUMP 4