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));