MCPcopy Create free account
hub / github.com/agenticsorg/lean-agentic / parse_pattern

Method parse_pattern

leanr-syntax/src/parser.rs:595–648  ·  view source on GitHub ↗

Parse a pattern

(&mut self)

Source from the content-addressed store, hash-verified

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> {

Callers 1

parse_match_exprMethod · 0.80

Calls 10

currentMethod · 0.80
is_pattern_startMethod · 0.80
spanMethod · 0.80
toMethod · 0.80
advanceMethod · 0.45
cloneMethod · 0.45
is_eofMethod · 0.45
checkMethod · 0.45
pushMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected