Deduplicate immediate to AstNode conversion
This commit is contained in:
parent
b2212bfa24
commit
da654a216b
52
src/main.rs
52
src/main.rs
|
@ -770,6 +770,18 @@ fn remove_underscores(input: &str) -> String {
|
||||||
String::from_iter(input.chars().filter(|c| *c != '_'))
|
String::from_iter(input.chars().filter(|c| *c != '_'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn immediate_to_astnode(immediate: u32, size: Size, is_pointer: bool) -> AstNode {
|
||||||
|
if is_pointer {
|
||||||
|
AstNode::ImmediatePointer(immediate)
|
||||||
|
} else {
|
||||||
|
match size {
|
||||||
|
Size::Byte => AstNode::Immediate8(immediate as u8),
|
||||||
|
Size::Half => AstNode::Immediate16(immediate as u16),
|
||||||
|
Size::Word => AstNode::Immediate32(immediate),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_operand(mut pair: pest::iterators::Pair<Rule>, is_pointer: bool) -> AstNode {
|
fn parse_operand(mut pair: pest::iterators::Pair<Rule>, is_pointer: bool) -> AstNode {
|
||||||
//println!("parse_operand: {:#?}", pair); // debug
|
//println!("parse_operand: {:#?}", pair); // debug
|
||||||
let size = *CURRENT_SIZE.lock().unwrap();
|
let size = *CURRENT_SIZE.lock().unwrap();
|
||||||
|
@ -785,54 +797,22 @@ fn parse_operand(mut pair: pest::iterators::Pair<Rule>, is_pointer: bool) -> Ast
|
||||||
Rule::immediate_bin => {
|
Rule::immediate_bin => {
|
||||||
let body_bin_str = operand_value_pair.into_inner().next().unwrap().as_str();
|
let body_bin_str = operand_value_pair.into_inner().next().unwrap().as_str();
|
||||||
let immediate = u32::from_str_radix(&remove_underscores(body_bin_str), 2).unwrap();
|
let immediate = u32::from_str_radix(&remove_underscores(body_bin_str), 2).unwrap();
|
||||||
if is_pointer {
|
immediate_to_astnode(immediate, size, is_pointer)
|
||||||
AstNode::ImmediatePointer(immediate)
|
|
||||||
} else {
|
|
||||||
match size {
|
|
||||||
Size::Byte => AstNode::Immediate8(immediate as u8),
|
|
||||||
Size::Half => AstNode::Immediate16(immediate as u16),
|
|
||||||
Size::Word => AstNode::Immediate32(immediate),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Rule::immediate_hex => {
|
Rule::immediate_hex => {
|
||||||
let body_hex_str = operand_value_pair.into_inner().next().unwrap().as_str();
|
let body_hex_str = operand_value_pair.into_inner().next().unwrap().as_str();
|
||||||
let immediate = u32::from_str_radix(&remove_underscores(body_hex_str), 16).unwrap();
|
let immediate = u32::from_str_radix(&remove_underscores(body_hex_str), 16).unwrap();
|
||||||
if is_pointer {
|
immediate_to_astnode(immediate, size, is_pointer)
|
||||||
AstNode::ImmediatePointer(immediate)
|
|
||||||
} else {
|
|
||||||
match size {
|
|
||||||
Size::Byte => AstNode::Immediate8(immediate as u8),
|
|
||||||
Size::Half => AstNode::Immediate16(immediate as u16),
|
|
||||||
Size::Word => AstNode::Immediate32(immediate),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Rule::immediate_dec => {
|
Rule::immediate_dec => {
|
||||||
let body_dec_str = operand_value_pair.into_inner().next().unwrap().as_str();
|
let body_dec_str = operand_value_pair.into_inner().next().unwrap().as_str();
|
||||||
let immediate = remove_underscores(body_dec_str).parse::<u32>().unwrap();
|
let immediate = remove_underscores(body_dec_str).parse::<u32>().unwrap();
|
||||||
if is_pointer {
|
immediate_to_astnode(immediate, size, is_pointer)
|
||||||
AstNode::ImmediatePointer(immediate)
|
|
||||||
} else {
|
|
||||||
match size {
|
|
||||||
Size::Byte => AstNode::Immediate8(immediate as u8),
|
|
||||||
Size::Half => AstNode::Immediate16(immediate as u16),
|
|
||||||
Size::Word => AstNode::Immediate32(immediate),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Rule::immediate_char => {
|
Rule::immediate_char => {
|
||||||
let body_char_str = operand_value_pair.into_inner().next().unwrap().as_str();
|
let body_char_str = operand_value_pair.into_inner().next().unwrap().as_str();
|
||||||
let immediate = body_char_str.chars().nth(0).unwrap() as u8 as u32;
|
let immediate = body_char_str.chars().nth(0).unwrap() as u8 as u32;
|
||||||
if is_pointer {
|
immediate_to_astnode(immediate, size, is_pointer)
|
||||||
AstNode::ImmediatePointer(immediate)
|
|
||||||
} else {
|
|
||||||
match size {
|
|
||||||
Size::Byte => AstNode::Immediate8(immediate as u8),
|
|
||||||
Size::Half => AstNode::Immediate16(immediate as u16),
|
|
||||||
Size::Word => AstNode::Immediate32(immediate),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Rule::register => {
|
Rule::register => {
|
||||||
let register_num_pair = operand_value_pair.into_inner().next().unwrap();
|
let register_num_pair = operand_value_pair.into_inner().next().unwrap();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user