From fff93f4e5d22aa397aeafdfbb1fb9649001008c2 Mon Sep 17 00:00:00 2001 From: Russel Arbore <russel.jma@gmail.com> Date: Mon, 11 Sep 2023 10:13:45 -0500 Subject: [PATCH] Parse more characters in identifier --- hercules_ir/src/parse.rs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/hercules_ir/src/parse.rs b/hercules_ir/src/parse.rs index 4ab12ee8..e8438283 100644 --- a/hercules_ir/src/parse.rs +++ b/hercules_ir/src/parse.rs @@ -129,7 +129,7 @@ fn parse_function<'a>( let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::bytes::complete::tag("fn")(ir_text)?.0; let ir_text = nom::character::complete::multispace0(ir_text)?.0; - let (ir_text, function_name) = nom::character::complete::alphanumeric1(ir_text)?; + let (ir_text, function_name) = parse_identifier(ir_text)?; let parse_num_dynamic_constants = |ir_text: &'a str| -> nom::IResult<&'a str, u32> { let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::character::complete::char('<')(ir_text)?.0; @@ -148,7 +148,7 @@ fn parse_function<'a>( nom::character::complete::char(','), nom::sequence::tuple(( nom::character::complete::multispace0, - nom::character::complete::alphanumeric1, + parse_identifier, nom::character::complete::multispace0, nom::character::complete::char(':'), nom::character::complete::multispace0, @@ -197,11 +197,11 @@ fn parse_node<'a>( context: &RefCell<Context<'a>>, ) -> nom::IResult<&'a str, (&'a str, Node)> { let ir_text = nom::character::complete::multispace0(ir_text)?.0; - let (ir_text, node_name) = nom::character::complete::alphanumeric1(ir_text)?; + let (ir_text, node_name) = parse_identifier(ir_text)?; let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::character::complete::char('=')(ir_text)?.0; let ir_text = nom::character::complete::multispace0(ir_text)?.0; - let (ir_text, node_kind) = nom::character::complete::alphanumeric1(ir_text)?; + let (ir_text, node_kind) = parse_identifier(ir_text)?; let (ir_text, node) = match node_kind { "return" => parse_return(ir_text, context)?, "constant" => parse_constant_node(ir_text, context)?, @@ -220,11 +220,11 @@ fn parse_return<'a>( let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::character::complete::char('(')(ir_text)?.0; let ir_text = nom::character::complete::multispace0(ir_text)?.0; - let (ir_text, control) = nom::character::complete::alphanumeric1(ir_text)?; + let (ir_text, control) = parse_identifier(ir_text)?; let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::character::complete::char(',')(ir_text)?.0; let ir_text = nom::character::complete::multispace0(ir_text)?.0; - let (ir_text, value) = nom::character::complete::alphanumeric1(ir_text)?; + let (ir_text, value) = parse_identifier(ir_text)?; let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::character::complete::char(')')(ir_text)?.0; let control = context.borrow_mut().get_node_id(control); @@ -253,11 +253,11 @@ fn parse_add<'a>(ir_text: &'a str, context: &RefCell<Context<'a>>) -> nom::IResu let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::character::complete::char('(')(ir_text)?.0; let ir_text = nom::character::complete::multispace0(ir_text)?.0; - let (ir_text, left) = nom::character::complete::alphanumeric1(ir_text)?; + let (ir_text, left) = parse_identifier(ir_text)?; let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::character::complete::char(',')(ir_text)?.0; let ir_text = nom::character::complete::multispace0(ir_text)?.0; - let (ir_text, right) = nom::character::complete::alphanumeric1(ir_text)?; + let (ir_text, right) = parse_identifier(ir_text)?; let ir_text = nom::character::complete::multispace0(ir_text)?.0; let ir_text = nom::character::complete::char(')')(ir_text)?.0; let left = context.borrow_mut().get_node_id(left); @@ -293,7 +293,7 @@ fn parse_call<'a>(ir_text: &'a str, context: &RefCell<Context<'a>>) -> nom::IRes nom::character::complete::char(','), nom::character::complete::multispace0, )), - nom::character::complete::alphanumeric1, + parse_identifier, )(ir_text)?; let function = function_and_args.remove(0); let args: Vec<NodeID> = function_and_args @@ -714,6 +714,15 @@ fn parse_array_constant_helper<'a>( } } +fn parse_identifier<'a>(ir_text: &'a str) -> nom::IResult<&'a str, &'a str> { + nom::combinator::verify( + nom::bytes::complete::is_a( + "1234567890_@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", + ), + |s: &str| s.len() > 0, + )(ir_text) +} + mod tests { #[allow(unused_imports)] use super::*; -- GitLab