Match all instructions with number argument
This commit is contained in:
@@ -5,13 +5,22 @@ variable =@{ ASCII_ALPHA
|
||||
~ (ASCII_ALPHANUMERIC | " ")*
|
||||
}
|
||||
|
||||
decNum =_{ ASCII_DIGIT+ }
|
||||
hexNum =_{ "0x" ~ ASCII_HEX_DIGIT+ }
|
||||
num = { hexNum | decNum }
|
||||
|
||||
var =@{ "var" ~ spacing+ ~ variable }
|
||||
delvar =@{ "delvar" ~ spacing+ ~ variable }
|
||||
|
||||
point =@{ "point" ~ spacing+ ~ variable }
|
||||
pointm =@{ "pointm" ~ spacing+ ~ variable }
|
||||
|
||||
add =@{ "add" ~ spacing+ ~ num }
|
||||
addb =@{ "addb" ~ spacing+ ~ num }
|
||||
addv =@{ "addv" ~ spacing+ ~ variable }
|
||||
|
||||
sub =@{ "sub" ~ spacing+ ~ num }
|
||||
subb =@{ "subb" ~ spacing+ ~ num }
|
||||
subv =@{ "subv" ~ spacing+ ~ variable }
|
||||
|
||||
copy =@{ "copy" ~ spacing+ ~ variable }
|
||||
@@ -22,7 +31,12 @@ instruction =_{ var
|
||||
| point
|
||||
| pointm
|
||||
|
||||
| add
|
||||
| addb
|
||||
| addv
|
||||
|
||||
| sub
|
||||
| subb
|
||||
| subv
|
||||
|
||||
| copy
|
||||
|
||||
+45
@@ -36,6 +36,15 @@ fn extract_operand(statement: Pair<Rule>) -> &str {
|
||||
line
|
||||
}
|
||||
|
||||
fn parse_num(text: &str) -> Result<i32, std::num::ParseIntError> {
|
||||
if text.starts_with("0x") {
|
||||
let without_prefix = text.trim_start_matches("0x");
|
||||
i32::from_str_radix(without_prefix, 16)
|
||||
} else {
|
||||
i32::from_str_radix(text, 10)
|
||||
}
|
||||
}
|
||||
|
||||
fn instruct(statement: Pair<Rule>, out: &mut Builder) {
|
||||
match statement.as_rule() {
|
||||
Rule::var => {
|
||||
@@ -58,11 +67,47 @@ fn instruct(statement: Pair<Rule>, out: &mut Builder) {
|
||||
println!("Pointing back to marker variable {}", variable_name);
|
||||
out.append("pointm\n");
|
||||
}
|
||||
Rule::add => {
|
||||
let number = extract_operand(statement);
|
||||
let number_parsed = parse_num(number).unwrap();
|
||||
println!(
|
||||
"Addition of '{}', decimal value is {}",
|
||||
number, number_parsed
|
||||
);
|
||||
out.append("add\n");
|
||||
}
|
||||
Rule::addb => {
|
||||
let number = extract_operand(statement);
|
||||
let number_parsed = parse_num(number).unwrap();
|
||||
println!(
|
||||
"Big Addition of '{}', decimal value is {}",
|
||||
number, number_parsed
|
||||
);
|
||||
out.append("addb\n");
|
||||
}
|
||||
Rule::addv => {
|
||||
let variable_name = extract_operand(statement);
|
||||
println!("Addition to variable '{}'", variable_name);
|
||||
out.append("addv\n");
|
||||
}
|
||||
Rule::sub => {
|
||||
let number = extract_operand(statement);
|
||||
let number_parsed = parse_num(number).unwrap();
|
||||
println!(
|
||||
"Subtraction of '{}', decimal value is {}",
|
||||
number, number_parsed
|
||||
);
|
||||
out.append("sub\n");
|
||||
}
|
||||
Rule::subb => {
|
||||
let number = extract_operand(statement);
|
||||
let number_parsed = parse_num(number).unwrap();
|
||||
println!(
|
||||
"Big Subtraction of '{}', decimal value is {}",
|
||||
number, number_parsed
|
||||
);
|
||||
out.append("subb\n");
|
||||
}
|
||||
Rule::subv => {
|
||||
let variable_name = extract_operand(statement);
|
||||
println!("Subtraction from variable '{}'", variable_name);
|
||||
|
||||
Reference in New Issue
Block a user