From 30238720537b5403c49de0701464631fcc7c4394 Mon Sep 17 00:00:00 2001 From: Raymon Zutekouw <40148684+Raymonzut@users.noreply.github.com> Date: Thu, 30 Dec 2021 16:43:23 +0100 Subject: [PATCH] Match all instructions with number argument --- src/grammars/mblf.pest | 14 +++++++++++++ src/main.rs | 45 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/grammars/mblf.pest b/src/grammars/mblf.pest index 3708582..5113117 100644 --- a/src/grammars/mblf.pest +++ b/src/grammars/mblf.pest @@ -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 diff --git a/src/main.rs b/src/main.rs index c2da9d7..705f7b1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,6 +36,15 @@ fn extract_operand(statement: Pair) -> &str { line } +fn parse_num(text: &str) -> Result { + 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, out: &mut Builder) { match statement.as_rule() { Rule::var => { @@ -58,11 +67,47 @@ fn instruct(statement: Pair, 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);