Initial start on assembly parser
This commit is contained in:
parent
95272a3472
commit
1af8f089c3
7 changed files with 115 additions and 6 deletions
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()
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
Reference in a new issue