G66Q553SEOS33IMFNC35Q6AGKFWXAJBP2TFPN2LRLAURFCGSOCZQC fn parse_expr_inner(tokens: &mut Peekable<IntoIter<Token>>, left: Expr) -> Result {
fn parse_expr_inner(tokens: &mut Peekable<IntoIter<(Token, usize)>>, left: Expr) -> Result {if matches!(tokens.peek(), Some((Token::Alt, _))) {let _ = tokens.next().unwrap();let right = parse_term(tokens)?;let expr = Expr::Alt(Box::new(left), Box::new(right));
fn parse_term_inner(tokens: &mut Peekable<IntoIter<Token>>, left: Expr) -> Result {
fn parse_term_inner(tokens: &mut Peekable<IntoIter<(Token, usize)>>, left: Expr) -> Result {if matches!(tokens.peek(), Some((Token::Char(_), _)) | Some((Token::Dot, _))) {let right = parse_factor(tokens)?;let expr = Expr::Conc(Box::new(left), Box::new(right));