mirror of
https://github.com/Noratrieb/m8db.git
synced 2026-01-16 00:05:03 +01:00
added comment support
This commit is contained in:
parent
a24b93fd23
commit
fc974548ab
3 changed files with 14 additions and 5 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
15
src/stmt.rs
15
src/stmt.rs
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
test.m8
2
test.m8
|
|
@ -4,5 +4,5 @@ JUMP 8
|
||||||
INC 2
|
INC 2
|
||||||
STOP
|
STOP
|
||||||
INC 3
|
INC 3
|
||||||
#another comment
|
|
||||||
JUMP 4
|
JUMP 4
|
||||||
Loading…
Add table
Add a link
Reference in a new issue