Initial start on assembly parser

This commit is contained in:
Anthony Foxclaw 2020-02-07 21:10:16 -05:00
parent 95272a3472
commit 1af8f089c3
7 changed files with 115 additions and 6 deletions

View 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(""));
}
}

View 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 });
}
}

View 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()
}
)
)
)
);