Match all instructions with number argument

rewrite/grammar-implicit-whitespace
Raymon Zutekouw 2 years ago
parent c1adc81ab8
commit 3023872053
No known key found for this signature in database
GPG Key ID: 1E9BCC39EDD1DD53
  1. 14
      src/grammars/mblf.pest
  2. 45
      src/main.rs

@ -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

@ -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);

Loading…
Cancel
Save