diff --git a/Cargo.lock b/Cargo.lock index 5307978..6f93806 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,17 +2,34 @@ # It is not intended for manual editing. [[package]] name = "corten" -version = "0.1.0" +version = "0.1.1" dependencies = [ "metacrate", + "nom", "rbtag", ] +[[package]] +name = "memchr" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" + [[package]] name = "metacrate" version = "0.1.0" 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]] name = "proc-macro2" version = "0.4.30" @@ -67,3 +84,9 @@ name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" diff --git a/Cargo.toml b/Cargo.toml index f65c093..2392be8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,10 @@ [package] name = "corten" -version = "0.1.0" -authors = ["Anthony Foxclaw <35226681+tonytins@users.noreply.github.com>"] +version = "0.1.1" +authors = ["Anthony Foxclaw"] edition = "2018" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] rbtag = "0.3" +nom = "4.2" metacrate = { git = "https://github.com/tonytins/metacrate" } \ No newline at end of file diff --git a/src/assembler.rs b/src/assembler.rs new file mode 100644 index 0000000..9934471 --- /dev/null +++ b/src/assembler.rs @@ -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 }, +} diff --git a/src/assembler/opcode_parser.rs b/src/assembler/opcode_parser.rs new file mode 100644 index 0000000..b2a85fb --- /dev/null +++ b/src/assembler/opcode_parser.rs @@ -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, + 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("")); + } +} diff --git a/src/assembler/operand_parser.rs b/src/assembler/operand_parser.rs new file mode 100644 index 0000000..0e5fc4a --- /dev/null +++ b/src/assembler/operand_parser.rs @@ -0,0 +1,30 @@ +#![allow(unused_imports)] +use nom::*; +use nom::{digit, types::CompleteStr}; + +use crate::assembler::Token; + +named!(pub integer_operand, + ws!( + do_parse!( + tag!("#") >> + reg_num: digit >> + ( + Token::IntegerOperand{value: reg_num.parse::().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 }); + } +} diff --git a/src/assembler/register_parser.rs b/src/assembler/register_parser.rs new file mode 100644 index 0000000..d4a0135 --- /dev/null +++ b/src/assembler/register_parser.rs @@ -0,0 +1,19 @@ +#![allow(unused_imports)] +use nom::*; +use nom::{digit, types::CompleteStr}; + +use crate::assembler::Token; + +named!(pub register , + ws!( + do_parse!( + tag!("$") >> + reg_num: digit >> + ( + Token::Register{ + reg_num: reg_num.parse::().unwrap() + } + ) + ) + ) +); diff --git a/src/main.rs b/src/main.rs index f330e7a..905048f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ +mod assembler; mod instruction; -mod vm; mod repl; +mod vm; use repl::REPL;