From 5aeeb6cfe911507324fcb70484d9194a7307b19a Mon Sep 17 00:00:00 2001 From: Hanif Bin Ariffin Date: Wed, 21 Jul 2021 19:13:07 +0800 Subject: [PATCH] Use delimited whenever possible and removed a duplicate parse Signed-off-by: Hanif Bin Ariffin --- src/uu/tr/src/operation.rs | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/uu/tr/src/operation.rs b/src/uu/tr/src/operation.rs index 9e0cb4c63..2b27204fa 100644 --- a/src/uu/tr/src/operation.rs +++ b/src/uu/tr/src/operation.rs @@ -1,12 +1,12 @@ use crate::unicode_table; use nom::{ branch::alt, - bytes::complete::{tag, take_while1}, - character::complete::{anychar, one_of}, - combinator::{map_opt, recognize}, + bytes::complete::{tag, take_until}, + character::complete::{anychar, digit1, one_of}, + combinator::{map_opt, opt, recognize}, multi::{many0, many_m_n}, - sequence::{preceded, separated_pair, tuple}, - IResult, + sequence::{delimited, preceded, separated_pair, tuple}, + take_until1, IResult, }; use std::{ collections::HashMap, @@ -33,7 +33,6 @@ pub enum Sequence { impl Sequence { pub fn parse_set_string(input: &str) -> Vec { many0(alt(( - alt((Sequence::parse_octal, Sequence::parse_backslash)), alt(( Sequence::parse_char_range, Sequence::parse_char_star, @@ -50,11 +49,14 @@ impl Sequence { Sequence::parse_print, Sequence::parse_punct, Sequence::parse_space, - Sequence::parse_space, Sequence::parse_upper, Sequence::parse_xdigit, Sequence::parse_char_equal, // NOTE: This must be the last one + )), + alt(( + Sequence::parse_octal, + Sequence::parse_backslash, Sequence::parse_char, )), )))(input) @@ -113,20 +115,16 @@ impl Sequence { } fn parse_char_star(input: &str) -> IResult<&str, Sequence> { - tuple((tag("["), anychar, tag("*]")))(input) - .map(|(l, (_, c, _))| (l, Sequence::CharStar(c))) + delimited(tag("["), anychar, tag("*]"))(input).map(|(l, c)| (l, Sequence::CharStar(c))) } fn parse_char_repeat(input: &str) -> IResult<&str, Sequence> { - tuple(( + delimited( tag("["), - anychar, - tag("*"), - // TODO: Extend this to support octal as well. Octal starts with 0. - take_while1(|c: char| c.is_digit(10)), + separated_pair(anychar, tag("*"), digit1), tag("]"), - ))(input) - .map(|(l, (_, c, _, n, _))| { + )(input) + .map(|(l, (c, n))| { ( l, Sequence::CharRange(Box::new(std::iter::repeat(c).take(n.parse().unwrap()))), @@ -255,7 +253,7 @@ impl Sequence { } fn parse_char_equal(input: &str) -> IResult<&str, Sequence> { - tuple((tag("[="), anychar, tag("=]")))(input).map(|(_, (_, _, _))| todo!()) + delimited(tag("[="), anychar, tag("=]"))(input).map(|(_, _)| todo!()) } }