From 257942e5dca4af1a200ac1fe525ced45bbfa1ab8 Mon Sep 17 00:00:00 2001 From: Raymon Zutekouw <40148684+Raymonzut@users.noreply.github.com> Date: Mon, 27 Dec 2021 14:03:38 +0100 Subject: [PATCH] Match all instructions with variable argument --- src/grammars/mblf.pest | 29 +++++++++++++++++++++++- src/main.rs | 50 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/grammars/mblf.pest b/src/grammars/mblf.pest index 296d3f7..3708582 100644 --- a/src/grammars/mblf.pest +++ b/src/grammars/mblf.pest @@ -1,7 +1,34 @@ operator = @{ "operator" } // TODO operand = @{ "operand" } // TODO -instruction = { operator ~ (spacing+ ~ operand)? } +variable =@{ ASCII_ALPHA + ~ (ASCII_ALPHANUMERIC | " ")* + } + +var =@{ "var" ~ spacing+ ~ variable } +delvar =@{ "delvar" ~ spacing+ ~ variable } + +point =@{ "point" ~ spacing+ ~ variable } +pointm =@{ "pointm" ~ spacing+ ~ variable } + +addv =@{ "addv" ~ spacing+ ~ variable } +subv =@{ "subv" ~ spacing+ ~ variable } + +copy =@{ "copy" ~ spacing+ ~ variable } + +instruction =_{ var + | delvar + + | point + | pointm + + | addv + | subv + + | copy + + | operator ~ (spacing+ ~ operand)? + } loopBlockStart = { "[" ~ NEWLINE } loopBlockEnd = { "]" } diff --git a/src/main.rs b/src/main.rs index 5f50e98..c043a30 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,12 +24,56 @@ struct Cli { output_file: std::path::PathBuf, } +fn extract_operand(statement: Pair) -> &str { + let mut line = statement.as_str(); + + while let Some(c) = line.chars().next() { + line = &line[c.len_utf8()..]; + if c == ' ' { + break; + } + } + line +} + fn instruct(statement: Pair, out: &mut Builder) { match statement.as_rule() { + Rule::var => { + let variable_name = extract_operand(statement); + println!("Creation of variable '{}'", variable_name); + out.append("var\n"); + } + Rule::delvar => { + let variable_name = extract_operand(statement); + println!("Deletion of variable '{}'", variable_name); + out.append("delvar\n"); + } + Rule::point => { + let variable_name = extract_operand(statement); + println!("Pointing to variable '{}'", variable_name); + out.append("point\n"); + } + Rule::pointm => { + let variable_name = extract_operand(statement); + println!("Pointing back to marker variable {}", variable_name); + out.append("pointm\n"); + } + Rule::addv => { + let variable_name = extract_operand(statement); + println!("Addition to variable '{}'", variable_name); + out.append("addv\n"); + } + Rule::subv => { + let variable_name = extract_operand(statement); + println!("Subtraction from variable '{}'", variable_name); + out.append("subv\n"); + } + Rule::copy => { + let variable_name = extract_operand(statement); + println!("Copy to variable '{}'", variable_name); + out.append("copy\n"); + } Rule::instruction => { - for nested_statement in statement.into_inner() { - instruct(nested_statement, out); - } out.append("\n"); } Rule::operator => {