diff --git a/src/grammars/mblf.pest b/src/grammars/mblf.pest index 660522e..f259bc4 100644 --- a/src/grammars/mblf.pest +++ b/src/grammars/mblf.pest @@ -5,9 +5,11 @@ variable =@{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | " ")* } +char =_{ "\"" ~ ANY ~ "\"" } decNum =_{ ASCII_DIGIT+ } hexNum =_{ "0x" ~ ASCII_HEX_DIGIT+ } -num = { hexNum | decNum } +num =_{ hexNum | decNum } +constant = { char | num } var =@{ "var" ~ spacing+ ~ variable } delvar =@{ "delvar" ~ spacing+ ~ variable } @@ -15,12 +17,12 @@ delvar =@{ "delvar" ~ spacing+ ~ variable } point =@{ "point" ~ spacing+ ~ variable } pointm =@{ "pointm" ~ spacing+ ~ variable } -add =@{ "add" ~ spacing+ ~ num } -addb =@{ "addb" ~ spacing+ ~ num } +add =@{ "add" ~ spacing+ ~ constant } +addb =@{ "addb" ~ spacing+ ~ constant } addv =@{ "addv" ~ spacing+ ~ variable } -sub =@{ "sub" ~ spacing+ ~ num } -subb =@{ "subb" ~ spacing+ ~ num } +sub =@{ "sub" ~ spacing+ ~ constant } +subb =@{ "subb" ~ spacing+ ~ constant } subv =@{ "subv" ~ spacing+ ~ variable } copy =@{ "copy" ~ spacing+ ~ variable } diff --git a/src/main.rs b/src/main.rs index 59747ce..f3fc9be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,8 +36,11 @@ fn extract_operand(statement: Pair) -> &str { line } -fn parse_num(text: &str) -> Result { - if text.starts_with("0x") { +fn parse_constant(text: &str) -> Result { + if text.starts_with("\"") { + let c = text.chars().nth(1).unwrap(); + Ok(c as i32) + } else if text.starts_with("0x") { let without_prefix = text.trim_start_matches("0x"); i32::from_str_radix(without_prefix, 16) } else { @@ -68,20 +71,20 @@ fn instruct(statement: Pair, out: &mut Builder) { out.append("pointm\n"); } Rule::add => { - let number = extract_operand(statement); - let number_parsed = parse_num(number).unwrap(); + let constant = extract_operand(statement); + let constant_parsed = parse_constant(constant).unwrap(); println!( "Addition of '{}', decimal value is {}", - number, number_parsed + constant, constant_parsed ); out.append("add\n"); } Rule::addb => { - let number = extract_operand(statement); - let number_parsed = parse_num(number).unwrap(); + let constant = extract_operand(statement); + let constant_parsed = parse_constant(constant).unwrap(); println!( "Big Addition of '{}', decimal value is {}", - number, number_parsed + constant, constant_parsed ); out.append("addb\n"); } @@ -91,20 +94,20 @@ fn instruct(statement: Pair, out: &mut Builder) { out.append("addv\n"); } Rule::sub => { - let number = extract_operand(statement); - let number_parsed = parse_num(number).unwrap(); + let constant = extract_operand(statement); + let constant_parsed = parse_constant(constant).unwrap(); println!( "Subtraction of '{}', decimal value is {}", - number, number_parsed + constant, constant_parsed ); out.append("sub\n"); } Rule::subb => { - let number = extract_operand(statement); - let number_parsed = parse_num(number).unwrap(); + let constant = extract_operand(statement); + let constant_parsed = parse_constant(constant).unwrap(); println!( "Big Subtraction of '{}', decimal value is {}", - number, number_parsed + constant, constant_parsed ); out.append("subb\n"); }