Initial start on assembly parser
This commit is contained in:
parent
95272a3472
commit
1af8f089c3
7 changed files with 115 additions and 6 deletions
25
Cargo.lock
generated
25
Cargo.lock
generated
|
@ -2,17 +2,34 @@
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "corten"
|
name = "corten"
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"metacrate",
|
"metacrate",
|
||||||
|
"nom",
|
||||||
"rbtag",
|
"rbtag",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "metacrate"
|
name = "metacrate"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/tonytins/metacrate#efab304454bd48946d52efa0912b65898f37b1c9"
|
source = "git+https://github.com/tonytins/metacrate#efab304454bd48946d52efa0912b65898f37b1c9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nom"
|
||||||
|
version = "4.2.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
"version_check",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "0.4.30"
|
version = "0.4.30"
|
||||||
|
@ -67,3 +84,9 @@ name = "unicode-xid"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "version_check"
|
||||||
|
version = "0.1.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
[package]
|
[package]
|
||||||
name = "corten"
|
name = "corten"
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
authors = ["Anthony Foxclaw <35226681+tonytins@users.noreply.github.com>"]
|
authors = ["Anthony Foxclaw"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rbtag = "0.3"
|
rbtag = "0.3"
|
||||||
|
nom = "4.2"
|
||||||
metacrate = { git = "https://github.com/tonytins/metacrate" }
|
metacrate = { git = "https://github.com/tonytins/metacrate" }
|
13
src/assembler.rs
Normal file
13
src/assembler.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#![allow(dead_code)]
|
||||||
|
pub mod opcode_parser;
|
||||||
|
pub mod operand_parser;
|
||||||
|
pub mod register_parser;
|
||||||
|
|
||||||
|
use crate::instruction::Opcode;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub enum Token {
|
||||||
|
Op { code: Opcode },
|
||||||
|
Register { reg_num: u8 },
|
||||||
|
IntegerOperand { value: i32 },
|
||||||
|
}
|
24
src/assembler/opcode_parser.rs
Normal file
24
src/assembler/opcode_parser.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#![allow(unused_imports)]
|
||||||
|
use nom::*;
|
||||||
|
use nom::{digit, types::CompleteStr};
|
||||||
|
|
||||||
|
use crate::assembler::Token;
|
||||||
|
use crate::instruction::Opcode;
|
||||||
|
|
||||||
|
named!(opcode_load<CompleteStr, Token>,
|
||||||
|
do_parse!(tag!("load") >> (Token::Op{code: Opcode::LOAD}))
|
||||||
|
);
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod opcode_parser_test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parser_op_load() {
|
||||||
|
// Test that opcode is dected and parsed correctly
|
||||||
|
let result = opcode_load(CompleteStr("load"));
|
||||||
|
let (rest, token) = result.unwrap();
|
||||||
|
assert_eq!(token, Token::Op { code: Opcode::LOAD });
|
||||||
|
assert_eq!(rest, CompleteStr(""));
|
||||||
|
}
|
||||||
|
}
|
30
src/assembler/operand_parser.rs
Normal file
30
src/assembler/operand_parser.rs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#![allow(unused_imports)]
|
||||||
|
use nom::*;
|
||||||
|
use nom::{digit, types::CompleteStr};
|
||||||
|
|
||||||
|
use crate::assembler::Token;
|
||||||
|
|
||||||
|
named!(pub integer_operand<CompleteStr, Token>,
|
||||||
|
ws!(
|
||||||
|
do_parse!(
|
||||||
|
tag!("#") >>
|
||||||
|
reg_num: digit >>
|
||||||
|
(
|
||||||
|
Token::IntegerOperand{value: reg_num.parse::<i32>().unwrap()}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod reg_parser_test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_opcode_load() {
|
||||||
|
let result = integer_operand(CompleteStr("#10"));
|
||||||
|
let (rest, value) = result.unwrap();
|
||||||
|
assert_eq!(rest, CompleteStr(""));
|
||||||
|
assert_eq!(value, Token::IntegerOperand { value: 10 });
|
||||||
|
}
|
||||||
|
}
|
19
src/assembler/register_parser.rs
Normal file
19
src/assembler/register_parser.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#![allow(unused_imports)]
|
||||||
|
use nom::*;
|
||||||
|
use nom::{digit, types::CompleteStr};
|
||||||
|
|
||||||
|
use crate::assembler::Token;
|
||||||
|
|
||||||
|
named!(pub register <CompleteStr, Token>,
|
||||||
|
ws!(
|
||||||
|
do_parse!(
|
||||||
|
tag!("$") >>
|
||||||
|
reg_num: digit >>
|
||||||
|
(
|
||||||
|
Token::Register{
|
||||||
|
reg_num: reg_num.parse::<u8>().unwrap()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
|
@ -1,6 +1,7 @@
|
||||||
|
mod assembler;
|
||||||
mod instruction;
|
mod instruction;
|
||||||
mod vm;
|
|
||||||
mod repl;
|
mod repl;
|
||||||
|
mod vm;
|
||||||
|
|
||||||
use repl::REPL;
|
use repl::REPL;
|
||||||
|
|
||||||
|
|
Reference in a new issue