use nom::{ IResult, character::complete::alphanumeric0, //character::complete::alphanumeric1, character::complete::anychar, character::complete::space1, character::complete::space0, bytes::complete::tag, multi::many1, multi::many0, //branch::alt, //combinator::opt, sequence::tuple, }; fn command(i: &str) -> IResult<&str, String> { match tuple((anychar,alphanumeric0))(i) { Ok((rest, (c, s))) => { let tmp = format!("{}{}", c, s); Ok((rest, tmp)) }, Err(e) => Err(e) } } fn parameter(i: &str) -> IResult<&str, String> { match tuple((space1, many1(anychar)))(i) { Ok((rest, (_,param))) => Ok((rest, param.iter().collect::())), Err(e) => Err(e) } } fn ligature(i: &str) -> IResult<&str, Option> { match tuple((space0, tag(";")))(i) { Ok((rest, c)) => Ok((rest, c.1.chars().next())), Err(e) => Err(e) } } pub fn command_line(i: &str) -> IResult<&str, Vec> { match tuple((command, many0(parameter)))(i) { Ok((rest, (com, params))) => { let mut cmd = vec!(com); params.iter().for_each(|p| cmd.push(p.to_string())); Ok((rest, cmd)) }, Err(e) => Err(e) } } pub fn command_lines(i: &str) -> IResult<&str, Vec<(Vec,Option)>> { many1(tuple((command_line, ligature)))(i) }