use nom::{ IResult, character::complete::alphanumeric0, character::complete::alphanumeric1, character::complete::anychar, 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, &str> { alphanumeric1(i) } fn ligature(i: &str) -> IResult<&str, char> { match tag(";")(i) { Ok((rest, c)) => Ok((rest, c.chars().nth(0).unwrap())), Err(e) => Err(e) } } 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(String::from(*p))); Ok((rest, cmd)) }, Err(e) => Err(e) } } fn command_string(i: &str) -> IResult<&str, Vec<(Vec,char)>> { many1(tuple((command_line, ligature)))(i) }