Parse a pattern
(&mut self)
| 593 | |
| 594 | /// Parse a pattern |
| 595 | fn parse_pattern(&mut self) -> crate::Result<Pattern> { |
| 596 | let token = self.current(); |
| 597 | |
| 598 | match &token.kind { |
| 599 | TokenKind::Underscore => { |
| 600 | let span = token.span; |
| 601 | self.advance(); |
| 602 | Ok(Pattern::Wildcard { span }) |
| 603 | } |
| 604 | |
| 605 | TokenKind::Number(n) => { |
| 606 | let n = n.clone(); |
| 607 | let span = token.span; |
| 608 | self.advance(); |
| 609 | let num = n.parse::<u64>().map_err(|_| { |
| 610 | ParseError::new(span, "Invalid number in pattern".to_string()) |
| 611 | })?; |
| 612 | Ok(Pattern::Lit { |
| 613 | span, |
| 614 | lit: LitKind::Nat(num), |
| 615 | }) |
| 616 | } |
| 617 | |
| 618 | TokenKind::Ident(name) => { |
| 619 | let span = token.span; |
| 620 | let ident = Ident::new(name.clone(), span); |
| 621 | self.advance(); |
| 622 | |
| 623 | // Check if this is a constructor with args |
| 624 | let mut args = Vec::new(); |
| 625 | while !self.is_eof() && self.is_pattern_start() && !self.check(&TokenKind::FatArrow) { |
| 626 | args.push(self.parse_pattern()?); |
| 627 | } |
| 628 | |
| 629 | if args.is_empty() { |
| 630 | // Simple variable |
| 631 | Ok(Pattern::Var { span, name: ident }) |
| 632 | } else { |
| 633 | // Constructor pattern |
| 634 | let end = args.last().unwrap().span(); |
| 635 | Ok(Pattern::Constructor { |
| 636 | span: span.to(end), |
| 637 | name: ident, |
| 638 | args, |
| 639 | }) |
| 640 | } |
| 641 | } |
| 642 | |
| 643 | _ => Err(ParseError::new( |
| 644 | token.span, |
| 645 | format!("Expected pattern, found {:?}", token.kind), |
| 646 | )), |
| 647 | } |
| 648 | } |
| 649 | |
| 650 | /// Parse an identifier |
| 651 | fn parse_ident(&mut self) -> crate::Result<Ident> { |