Documentation

PrimParser.Basic

PrimParser #

A parser combinator library with precise grades tracking error and consumption behavior at the type level via Necessity.

@[reducible, inline]
abbrev Error :
Equations
Instances For
    class ParserError (ε : Type) :
    • endOfInput : ε

      Unexpected end of input.

    Instances
      structure Grade :

      A parser's static grade: whether it may/must produce errors and whether it may/must consume input.

      Instances For
        @[instance_reducible]
        Equations
        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          @[reducible, inline]
          Equations
          Instances For
            @[reducible, inline]
            Equations
            Instances For
              @[reducible, inline]
              Equations
              Instances For
                @[reducible, inline]
                Equations
                Instances For
                  @[reducible, inline]
                  Equations
                  Instances For
                    @[reducible, inline]
                    Equations
                    Instances For
                      @[reducible, inline]
                      Equations
                      Instances For
                        def Grade.max (a b : Grade) :
                        Equations
                        Instances For
                          @[instance_reducible]
                          Equations
                          @[instance_reducible]
                          Equations
                          • One or more equations did not get rendered due to their size.
                          @[instance_reducible]
                          Equations
                          @[simp]
                          theorem Grade.mul_mk (e1 e2 c1 c2 : Necessity) :
                          { errors := e1, consumes := c1 } * { errors := e2, consumes := c2 } = { errors := Max.max e1 e2, consumes := Max.max c1 c2 }
                          @[simp]
                          theorem Grade.one_mk :
                          1 = { errors := never, consumes := never }
                          @[simp]
                          theorem Grade.mul_idem (g : Grade) :
                          g * g = g
                          def Grade.choice (a b : Grade) :
                          Equations
                          Instances For
                            @[reducible, inline]

                            Relates input size n and remaining size m according to a consumption grade: always requires strict decrease, possibly allows ≤, never requires equality.

                            Equations
                            Instances For
                              @[simp]
                              theorem Parser.consumptionWitness.trans {gc gc' : Necessity} {n1 n2 n3 : ℕ} (w1 : consumptionWitness n2 n1 gc) (w2 : consumptionWitness n3 n2 gc') :
                              consumptionWitness n3 n1 (max gc gc')
                              structure Parser.Success (n : ℕ) (consumes : Necessity) (α : Type) :

                              A successful parse result.

                              Instances For
                                structure Parser.Failure (n : ℕ) (ε : Type) :

                                A failed parse result

                                Instances For
                                  def Parser.Failure.trans {n m : ℕ} {ε : Type} (f : Failure m ε) (h : m ≤ n) :
                                  Failure n ε
                                  Equations
                                  Instances For
                                    @[simp]
                                    theorem Parser.Failure.trans_rfl {n : ℕ} {ε : Type} (f : Failure n ε) :
                                    f.trans ⋯ = f
                                    inductive Parser.Outcome (ε : Type) (n : ℕ) (consumes : Necessity) (α : Type) :

                                    The result type of running a parser.

                                    Instances For
                                      @[reducible, inline]
                                      abbrev Parser.Outcome.Sound {n : ℕ} {ε : Type} (errors : Necessity) {c : Necessity} {α : Type} (o : Outcome ε n c α) :
                                      Equations
                                      Instances For
                                        @[simp]
                                        theorem Parser.Outcome.sound_possibly {n : ℕ} {gc : Necessity} {ε α : Type} {o : Outcome ε n gc α} :
                                        structure Parser (σ τ : Type) [Buffer σ] [Reader σ τ] (ε : Type) (g : Grade) (α : Type) :

                                        A parser with error type ε, static grade g, and result type α. The grade tracks error and consumption behavior at the type level.

                                        Instances For
                                          @[reducible, inline]
                                          abbrev Parser.TokenParser (τ ε : Type) (g : Grade) (α : Type) :
                                          Equations
                                          Instances For
                                            theorem Parser.ext {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {g : Grade} {p q : Parser σ τ ε g α} (h : ∀ {m : ℕ} (t : Input σ m), p.run t = q.run t) :
                                            p = q
                                            theorem Parser.ext_iff {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {g : Grade} {p q : Parser σ τ ε g α} :
                                            p = q ↔ ∀ {m : ℕ} (t : Input σ m), p.run t = q.run t
                                            @[inline]
                                            def Parser.Outcome.handle {α β ε : Type} {n : ℕ} {ge gc : Necessity} (o : Outcome ε n gc α) (sound : Sound ge o) (onSuccess : ge ≤ possibly → Success n gc α → β) (onError : possibly ≤ ge → Failure n ε → β) :
                                            β
                                            Equations
                                            Instances For
                                              theorem Parser.Outcome.handle_prop {α β ε : Type} {n : ℕ} {ge gc : Necessity} {P : β → Prop} {o : Outcome ε n gc α} (sound : Sound ge o) {onSuccess : ge ≤ possibly → Success n gc α → β} {onError : possibly ≤ ge → Failure n ε → β} (hSuccess : ∀ (h : ge ≤ possibly) (r : Success n gc α), P (onSuccess h r)) (hError : ∀ (h : possibly ≤ ge) (f : Failure n ε), P (onError h f)) :
                                              P (o.handle sound onSuccess onError)
                                              theorem Parser.Outcome.handle_sound {α β ε ε' : Type} {n m : ℕ} {ge ge' gc gc' : Necessity} {o : Outcome ε n gc α} (sound : Sound ge o) {onSuccess : ge ≤ possibly → Success n gc α → Outcome ε' m gc' β} {onError : possibly ≤ ge → Failure n ε → Outcome ε' m gc' β} (soundSuccess : ∀ (h : ge ≤ possibly) (r : Success n gc α), Sound ge' (onSuccess h r)) (soundError : ∀ (h : possibly ≤ ge) (f : Failure n ε), Sound ge' (onError h f)) :
                                              Sound ge' (o.handle sound onSuccess onError)
                                              theorem Parser.Outcome.handle_success {α β ε : Type} {n : ℕ} {ge gc : Necessity} {o : Outcome ε n gc α} {sound : Sound ge o} {onSuccess : ge ≤ possibly → Success n gc α → β} {onError : possibly ≤ ge → Failure n ε → β} {r : Success n gc α} (h : o = success r) (hge : ge ≤ possibly := by simp) :
                                              o.handle sound onSuccess onError = onSuccess hge r

                                              Reduce handle when the outcome is known to succeed.

                                              theorem Parser.Outcome.handle_failure {α β ε : Type} {n : ℕ} {ge gc : Necessity} {o : Outcome ε n gc α} {sound : Sound ge o} {onSuccess : ge ≤ possibly → Success n gc α → β} {onError : possibly ≤ ge → Failure n ε → β} {f : Failure n ε} (h : o = failure f) (hge : possibly ≤ ge := by simp) :
                                              o.handle sound onSuccess onError = onError hge f

                                              Reduce handle when the outcome is known to fail.

                                              @[instance_reducible]
                                              instance Parser.instFunctorSuccess {n : ℕ} {gc : Necessity} :
                                              Equations
                                              @[instance_reducible]
                                              Equations
                                              @[instance_reducible]
                                              instance Parser.instFunctorOutcome {ε : Type} {n : ℕ} {gc : Necessity} :
                                              Functor (Outcome ε n gc)
                                              Equations
                                              • One or more equations did not get rendered due to their size.
                                              theorem Parser.Outcome.map_sound {α β ε : Type} {n : ℕ} {ge gc : Necessity} (f : α → β) (o : Outcome ε n gc α) (ho : Sound ge o) :
                                              Sound ge (f <$> o)
                                              Equations
                                              Instances For
                                                Equations
                                                Instances For
                                                  theorem Parser.Success.le {α : Type} {n : ℕ} {gc : Necessity} (p : Success n gc α) :
                                                  def Parser.Success.weakenConsumes {α : Type} {n : ℕ} {gc : Necessity} (p : Success n gc α) :
                                                  Equations
                                                  Instances For
                                                    def Parser.Success.trans {α : Type} {n m : ℕ} {gc : Necessity} (s : Success m gc α) (h : m ≤ n) :
                                                    Success n (max gc possibly) α
                                                    Equations
                                                    Instances For
                                                      def Parser.Success.seq {α β : Type} {n : ℕ} {gc gc' : Necessity} (r1 : Success n gc α) (r2 : Success r1.restSize gc' β) :
                                                      Success n (max gc gc') β
                                                      Equations
                                                      Instances For
                                                        @[inline]
                                                        def Parser.Success.bindParser {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {n : ℕ} {xc fe fc : Necessity} (t : Input σ n) (x : Success n xc α) (f : α → Parser σ τ ε { errors := fe, consumes := fc } β) :
                                                        Outcome ε n (max xc fc) β
                                                        Equations
                                                        Instances For
                                                          @[instance_reducible]
                                                          instance Parser.instGradedFunctorGrade {σ τ : Type} [Buffer σ] [Reader σ τ] {ε : Type} :
                                                          Equations
                                                          def Parser.Outcome.throw {α ε : Type} {n : ℕ} {gc : Necessity} (e : ε) :
                                                          Outcome ε n gc α
                                                          Equations
                                                          Instances For
                                                            theorem Parser.Outcome.throw_sound {α ε : Type} {n : ℕ} {ge gc : Necessity} {e : ε} (h : possibly ≤ ge) :
                                                            Sound ge (throw e)
                                                            @[inline]
                                                            def Parser.handle {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε ε' : Type} {g g' : Grade} (p : Parser σ τ ε g α) (onSuccess : {n : ℕ} → Input σ n → g.errors ≤ possibly → Success n g.consumes α → Outcome ε' n g'.consumes β) (soundSuccess : ∀ {n : ℕ} {t : Input σ n} (h : g.errors ≤ possibly) (r : Success n g.consumes α), Outcome.Sound g'.errors (onSuccess t h r)) (onError : {n : ℕ} → Input σ n → possibly ≤ g.errors → Failure n ε → Outcome ε' n g'.consumes β) (soundError : ∀ {n : ℕ} {t : Input σ n} (h : possibly ≤ g.errors) (f : Failure n ε), Outcome.Sound g'.errors (onError t h f)) :
                                                            Parser σ τ ε' g' β
                                                            Equations
                                                            • p.handle onSuccess soundSuccess onError soundError = { run := fun {n : ℕ} (t : Input σ n) => (p.run t).handle ⋯ (onSuccess t) (onError t), sound := ⋯ }
                                                            Instances For
                                                              def Parser.bind {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {g g' : Grade} (m : Parser σ τ ε g α) (f : α → Parser σ τ ε g' β) :
                                                              Parser σ τ ε (g * g') β

                                                              Monadic bind for parsers. The resulting grade is the product (max) of the two grades.

                                                              Equations
                                                              • One or more equations did not get rendered due to their size.
                                                              Instances For
                                                                instance Parser.instIsEmptyImpossibleOfNonempty {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} [i : Nonempty σ] :
                                                                IsEmpty (Parser σ τ ε impossible α)
                                                                @[reducible, inline]
                                                                abbrev Parser.pure {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} (a : α) :
                                                                Parser σ τ ε 1 α

                                                                Lift a value into a parser that consumes nothing and never fails.

                                                                Equations
                                                                Instances For
                                                                  @[instance_reducible]
                                                                  instance Parser.instGradedApplicativeGrade {σ τ : Type} [Buffer σ] [Reader σ τ] {ε : Type} :
                                                                  Equations
                                                                  • One or more equations did not get rendered due to their size.
                                                                  @[instance_reducible]
                                                                  instance Parser.instGradedMonadGrade {σ τ : Type} [Buffer σ] [Reader σ τ] {ε : Type} :
                                                                  GradedMonad (Parser σ τ ε)
                                                                  Equations
                                                                  theorem Parser.gmap_run {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {n : ℕ} {g : Grade} (f : α → β) (p : Parser σ τ ε g α) (t : Input σ n) :
                                                                  (f <$>ᵍ p).run t = f <$> p.run t
                                                                  theorem Parser.gbind_run {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {n : ℕ} {g g' : Grade} (m : Parser σ τ ε g α) (k : α → Parser σ τ ε g' β) (t : Input σ n) :
                                                                  (m >>=ᵍ k).run t = (m.run t).handle ⋯ (fun (x : g.errors ≤ possibly) (x_1 : Success n g.consumes α) => Success.bindParser t x_1 k) fun (x : possibly ≤ g.errors) (e : Failure n ε) => failure e
                                                                  def Parser.fix {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge : Necessity} [ParserError ε] (f : Parser σ τ ε { errors := ge, consumes := always } α → Parser σ τ ε { errors := ge, consumes := always } α) (h : possibly ≤ ge := by simp) :
                                                                  Parser σ τ ε { errors := ge, consumes := always } α

                                                                  Build a recursive parser via a fixpoint. Termination is guaranteed by requiring the body to always consume input.

                                                                  Equations
                                                                  Instances For
                                                                    def Parser.withBacktracking {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {g : Grade} (p : Parser σ τ ε g α) :
                                                                    Parser σ τ ε g α

                                                                    Run p. If it fails, restores the original input.

                                                                    Equations
                                                                    • One or more equations did not get rendered due to their size.
                                                                    Instances For
                                                                      def Parser.choice {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge ge' gc gc' : Necessity} (p1 : Parser σ τ ε { errors := ge, consumes := gc } α) (p2 : Parser σ τ ε { errors := ge', consumes := gc' } α) :
                                                                      Parser σ τ ε { errors := min ge ge', consumes := ge.ite gc' gc } α

                                                                      Try p1; if it fails, run p2.

                                                                      Equations
                                                                      • One or more equations did not get rendered due to their size.
                                                                      Instances For
                                                                        def Parser.committedChoice {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge ge' gc gc' : Necessity} (p1 : Parser σ τ ε { errors := ge, consumes := gc } α) (p2 : Parser σ τ ε { errors := ge', consumes := gc' } α) :
                                                                        Parser σ τ ε { errors := min ge (max ge' possibly), consumes := ge.ite gc' gc } α

                                                                        try p1; if it fails without consuming, then try p2

                                                                        Equations
                                                                        • One or more equations did not get rendered due to their size.
                                                                        Instances For
                                                                          def Parser.tryResume {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge ge' gc gc' : Necessity} (p1 : Parser σ τ ε { errors := ge, consumes := gc } α) (p2 : Parser σ τ ε { errors := ge', consumes := gc' } α) :
                                                                          Parser σ τ ε { errors := min ge ge', consumes := ge.ite (max gc' possibly) gc } α

                                                                          Try p1 first, if it fails with Failure f, run p2 on the input left at f.restSize

                                                                          Equations
                                                                          • One or more equations did not get rendered due to their size.
                                                                          Instances For
                                                                            def Parser.oneOf {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {g : Grade} (l : NonEmptyList (Parser σ τ ε g α)) :
                                                                            Parser σ τ ε g α

                                                                            Try each parser in the list in order, returning the first success.

                                                                            Equations
                                                                            Instances For
                                                                              def Parser.oneOf.go {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {g : Grade} (l : List (Parser σ τ ε g α)) (p : l.length ≠ 0 := by simp) :
                                                                              Parser σ τ ε g α
                                                                              Equations
                                                                              Instances For
                                                                                def Parser.throw {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (e : ε) (c : possibly ≤ ge := by simp) :
                                                                                Parser σ τ ε { errors := ge, consumes := gc } α

                                                                                A parser that always fails with error e.

                                                                                Equations
                                                                                Instances For
                                                                                  def Parser.Success.relaxConsumes {α : Type} {n : ℕ} {gc : Necessity} (p : Success n gc α) :
                                                                                  Success n (min gc possibly) α
                                                                                  Equations
                                                                                  Instances For
                                                                                    def Parser.relaxConsumes {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                    Parser σ τ ε { errors := ge, consumes := min gc possibly } α

                                                                                    Weaken the consumption grade by capping at possibly.

                                                                                    Equations
                                                                                    • One or more equations did not get rendered due to their size.
                                                                                    Instances For
                                                                                      def Parser.relaxErrors {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                      Parser σ τ ε { errors := min ge possibly, consumes := gc } α

                                                                                      Weaken the error grade by capping at possibly.

                                                                                      Equations
                                                                                      • One or more equations did not get rendered due to their size.
                                                                                      Instances For
                                                                                        def Parser.relax {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                        Parser σ τ ε { errors := min ge possibly, consumes := min gc possibly } α

                                                                                        Cap both error and consumption grades at possibly.

                                                                                        Equations
                                                                                        Instances For
                                                                                          def Parser.weakenConsumes {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                          Parser σ τ ε { errors := ge, consumes := possibly } α

                                                                                          Forget consumption precision, setting it to possibly.

                                                                                          Equations
                                                                                          • One or more equations did not get rendered due to their size.
                                                                                          Instances For
                                                                                            def Parser.weakenErrors {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                            Parser σ τ ε { errors := possibly, consumes := gc } α

                                                                                            Forget error precision, setting it to possibly.

                                                                                            Equations
                                                                                            • One or more equations did not get rendered due to their size.
                                                                                            Instances For
                                                                                              def Parser.weaken {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                              Parser σ τ ε fallible α

                                                                                              Weaken both grades to possibly, yielding a fallible parser.

                                                                                              Equations
                                                                                              Instances For
                                                                                                def Parser.runOn {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {n : ℕ} {g : Grade} (p : Parser σ τ ε g α) (t : Input σ n) :
                                                                                                Except ε α

                                                                                                Run a parser on a Input.

                                                                                                Equations
                                                                                                • One or more equations did not get rendered due to their size.
                                                                                                Instances For
                                                                                                  @[reducible, inline]
                                                                                                  abbrev Parser.Except.Sound {ε : Type} (errors : Necessity) {α : Type} (r : Except ε α) :
                                                                                                  Equations
                                                                                                  Instances For
                                                                                                    theorem Parser.runOn_sound {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {n : ℕ} {g : Grade} (p : Parser σ τ ε g α) (t : Input σ n) :
                                                                                                    def Parser.anyTok {σ τ : Type} [Buffer σ] [Reader σ τ] :

                                                                                                    Consume a single token.

                                                                                                    Equations
                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                    Instances For
                                                                                                      theorem Parser.anyTok_run_some {σ τ : Type} [Buffer σ] [Reader σ τ] {n : ℕ} {t : τ} {inp : Input σ n} (h : inp.nextTok = some t := by assumption) :
                                                                                                      anyTok.run inp = success { result := t, restSize := n - Reader.width σ t, witness := ⋯ }
                                                                                                      theorem Parser.anyTok_run_eof {σ τ : Type} [Buffer σ] [Reader σ τ] {n : ℕ} {inp : Input σ n} (h : inp.nextTok = none := by first | assumption | exact Input.nextTok_eq_none) :
                                                                                                      anyTok.run inp = failure { error := Error.eof, restSize := n, witness := ⋯ }
                                                                                                      def Parser.ok {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (a : α) (he : ge ≤ possibly := by simp) (hc : gc ≤ possibly := by simp) :
                                                                                                      Parser σ τ ε { errors := ge, consumes := gc } α

                                                                                                      Like gpure but with a flexible grade: both ge and gc can be never or possibly. Useful in match branches where all cases must share the same grade.

                                                                                                      Equations
                                                                                                      Instances For
                                                                                                        def Parser.token {σ τ : Type} [Buffer σ] [Reader σ τ] {α : Type} (f : τ → Option α) :

                                                                                                        Consume a token and apply f; succeed with the result or fail if f returns none.

                                                                                                        Equations
                                                                                                        • One or more equations did not get rendered due to their size.
                                                                                                        Instances For
                                                                                                          def Parser.satisfy {σ τ : Type} [Buffer σ] [Reader σ τ] (f : τ → Bool) :

                                                                                                          Consume a token that satisfies predicate f, or fail.

                                                                                                          Equations
                                                                                                          Instances For
                                                                                                            theorem Parser.satisfy_run_accept {σ τ : Type} [Buffer σ] [Reader σ τ] {n : ℕ} {f : τ → Bool} {t : τ} {inp : Input σ n} (h : inp.nextTok = some t := by assumption) (cond : f t = true := by assumption) :
                                                                                                            (satisfy f).run inp = success { result := t, restSize := n - Reader.width σ t, witness := ⋯ }
                                                                                                            theorem Parser.satisfy_run_reject {σ τ : Type} [Buffer σ] [Reader σ τ] {n : ℕ} {f : τ → Bool} {t : τ} {inp : Input σ n} (h : inp.nextTok = some t := by assumption) (hf : ¬f t = true := by assumption) :
                                                                                                            (satisfy f).run inp = failure { error := Error.fail, restSize := n - Reader.width σ t, witness := ⋯ }
                                                                                                            theorem Parser.satisfy_run_eof {σ τ : Type} [Buffer σ] [Reader σ τ] {n : ℕ} {f : τ → Bool} {inp : Input σ n} (h : inp.nextTok = none := by first | assumption | exact Input.nextTok_eq_none) :
                                                                                                            (satisfy f).run inp = failure { error := Error.eof, restSize := n, witness := ⋯ }
                                                                                                            def Parser.skipSatisfy {σ τ : Type} [Buffer σ] [Reader σ τ] (f : τ → Bool) :

                                                                                                            Like satisfy but returns PUnit.

                                                                                                            Equations
                                                                                                            Instances For
                                                                                                              def Parser.optional {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                                              Parser σ τ ε { errors := never, consumes := min ge.complement gc } (Option α)

                                                                                                              Try p; return some result on success or none on failure, never failing itself.

                                                                                                              Equations
                                                                                                              • One or more equations did not get rendered due to their size.
                                                                                                              Instances For
                                                                                                                def Parser.optionalD {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) (d : α) :
                                                                                                                Parser σ τ ε { errors := never, consumes := min ge.complement gc } α

                                                                                                                Try p; return the result on success or the default value d on failure.

                                                                                                                Equations
                                                                                                                Instances For
                                                                                                                  def Parser.skipOptional {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                                                  Parser σ τ ε { errors := never, consumes := min ge.complement gc } PUnit.{1}

                                                                                                                  Try p, discarding the result; never fails.

                                                                                                                  Equations
                                                                                                                  Instances For
                                                                                                                    def Parser.test {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                                                    Parser σ τ ε { errors := never, consumes := min ge.complement gc } Bool

                                                                                                                    Try p; report whether it succeeded, never failing itself.

                                                                                                                    Equations
                                                                                                                    Instances For
                                                                                                                      def Parser.manyTill {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' : Necessity} [ParserError ε] (p : Parser σ τ ε { errors := ge, consumes := always } α) (e : Parser σ τ ε { errors := ge', consumes := always } β) :
                                                                                                                      Parser σ τ ε { errors := ge, consumes := always } (List α)

                                                                                                                      Repeatedly apply p until e succeeds, collecting the results of p.

                                                                                                                      Equations
                                                                                                                      Instances For
                                                                                                                        def Parser.many {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge : Necessity} (p : Parser σ τ ε { errors := ge, consumes := always } α) :
                                                                                                                        Parser σ τ ε flexible (List α)

                                                                                                                        Apply p zero or more times, collecting results. Requires p to always consume.

                                                                                                                        Equations
                                                                                                                        Instances For
                                                                                                                          @[irreducible]
                                                                                                                          def Parser.many.go {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge : Necessity} (p : Parser σ τ ε { errors := ge, consumes := always } α) {n : ℕ} (t : Input σ n) :
                                                                                                                          Equations
                                                                                                                          • One or more equations did not get rendered due to their size.
                                                                                                                          Instances For
                                                                                                                            def Parser.many1 {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge : Necessity} (p : Parser σ τ ε { errors := ge, consumes := always } α) :
                                                                                                                            Parser σ τ ε { errors := ge, consumes := always } (NonEmptyList α)

                                                                                                                            Apply p one or more times, collecting results.

                                                                                                                            Equations
                                                                                                                            Instances For
                                                                                                                              def Parser.skipMany {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge : Necessity} (p : Parser σ τ ε { errors := ge, consumes := always } α) :

                                                                                                                              Apply p zero or more times, discarding results.

                                                                                                                              Equations
                                                                                                                              Instances For
                                                                                                                                def Parser.skipMany1 {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge : Necessity} (p : Parser σ τ ε { errors := ge, consumes := always } α) :
                                                                                                                                Parser σ τ ε { errors := ge, consumes := always } PUnit.{1}

                                                                                                                                Apply p one or more times, discarding results.

                                                                                                                                Equations
                                                                                                                                Instances For
                                                                                                                                  def Parser.rawBracket {σ τ : Type} [Buffer σ] [Reader σ τ] {α : Type} {ge gc : Necessity} (l r : Parser σ τ Error conditional PUnit.{1}) (p : Parser σ τ Error { errors := ge, consumes := gc } α) :
                                                                                                                                  Parser σ τ Error { errors := max ge possibly, consumes := always } α

                                                                                                                                  Parse p surrounded by the delimiters l and r.

                                                                                                                                  Equations
                                                                                                                                  Instances For
                                                                                                                                    def Parser.sepBy {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser σ τ ε { errors := ge', consumes := gc' } β) (p : Parser σ τ ε { errors := ge, consumes := gc } α) (h : max gc' gc = always := by simp) :
                                                                                                                                    Parser σ τ ε flexible (List α)

                                                                                                                                    Parse zero or more occurrences of p separated by sep.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                                                    Instances For
                                                                                                                                      def Parser.sepBy1 {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser σ τ ε { errors := ge', consumes := gc' } β) (p : Parser σ τ ε { errors := ge, consumes := gc } α) (h : max gc' gc = always := by simp) :
                                                                                                                                      Parser σ τ ε { errors := ge, consumes := max gc possibly } (NonEmptyList α)

                                                                                                                                      Parse one or more occurrences of p separated by sep.

                                                                                                                                      Equations
                                                                                                                                      Instances For
                                                                                                                                        def Parser.endBy {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser σ τ ε { errors := ge', consumes := gc' } β) (p : Parser σ τ ε { errors := ge, consumes := gc } α) (h : max gc gc' = always := by simp) :
                                                                                                                                        Parser σ τ ε flexible (List α)

                                                                                                                                        Parse zero or more occurrences of p, each followed by sep.

                                                                                                                                        Equations
                                                                                                                                        Instances For
                                                                                                                                          def Parser.endBy1 {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser σ τ ε { errors := ge', consumes := gc' } β) (p : Parser σ τ ε { errors := ge, consumes := gc } α) (h : max gc gc' = always := by simp) :
                                                                                                                                          Parser σ τ ε { errors := max ge ge', consumes := always } (NonEmptyList α)

                                                                                                                                          Parse one or more occurrences of p, each followed by sep.

                                                                                                                                          Equations
                                                                                                                                          Instances For
                                                                                                                                            def Parser.sepEndBy1 {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser σ τ ε { errors := ge', consumes := gc' } β) (p : Parser σ τ ε { errors := ge, consumes := gc } α) (h : max gc' gc = always := by simp) :
                                                                                                                                            Parser σ τ ε { errors := ge, consumes := max gc possibly } (NonEmptyList α)

                                                                                                                                            Parse one or more occurrences of p separated by sep, with an optional trailing sep.

                                                                                                                                            Equations
                                                                                                                                            Instances For
                                                                                                                                              def Parser.sepEndBy {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser σ τ ε { errors := ge', consumes := gc' } β) (p : Parser σ τ ε { errors := ge, consumes := gc } α) (h : max gc' gc = always := by simp) :
                                                                                                                                              Parser σ τ ε flexible (List α)

                                                                                                                                              Parse zero or more occurrences of p separated by sep, with an optional trailing sep.

                                                                                                                                              Equations
                                                                                                                                              Instances For
                                                                                                                                                def Parser.count1 {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (n : ℕ) (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                                                                                Parser σ τ ε { errors := ge, consumes := gc } (List.Vector α (n + 1))

                                                                                                                                                Parse exactly n + 1 occurrences of p.

                                                                                                                                                Equations
                                                                                                                                                Instances For
                                                                                                                                                  theorem Parser.count1_succ {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} (n : ℕ) (p : Parser σ τ ε conditional α) :
                                                                                                                                                  count1 (n + 1) p = p >>=ᵍ fun (x : α) => count1 n p >>=ᵍ fun (rest : List.Vector α (n + 1)) => gpure (x ::ᵥ rest)
                                                                                                                                                  def Parser.count {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (n : ℕ) (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                                                                                  Parser σ τ ε { errors := min ge possibly, consumes := min gc possibly } (List.Vector α n)

                                                                                                                                                  Parse exactly n occurrences of p.

                                                                                                                                                  Equations
                                                                                                                                                  Instances For
                                                                                                                                                    def Parser.skip {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge gc : Necessity} (n : ℕ) (p : Parser σ τ ε { errors := ge, consumes := gc } α) :
                                                                                                                                                    Parser σ τ ε { errors := min ge possibly, consumes := min gc possibly } PUnit.{1}

                                                                                                                                                    Skip exactly n occurrences of p.

                                                                                                                                                    Equations
                                                                                                                                                    Instances For
                                                                                                                                                      def Parser.skipUpTo {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge : Necessity} (n : ℕ) :
                                                                                                                                                      Parser σ τ ε { errors := ge, consumes := always } α → Parser σ τ ε flexible PUnit.{1}

                                                                                                                                                      Skip up to n occurrences of p.

                                                                                                                                                      Equations
                                                                                                                                                      Instances For
                                                                                                                                                        def Parser.skipManyN {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge : Necessity} (n : ℕ) (p : Parser σ τ ε { errors := ge, consumes := always } α) :
                                                                                                                                                        Parser σ τ ε { errors := min ge possibly, consumes := possibly } PUnit.{1}

                                                                                                                                                        Skip n or more occurrences of p.

                                                                                                                                                        Equations
                                                                                                                                                        Instances For
                                                                                                                                                          def Parser.skipUntil {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' : Necessity} [ParserError ε] (stop : Parser σ τ ε { errors := ge', consumes := always } β) (p : Parser σ τ ε { errors := ge, consumes := always } α) :
                                                                                                                                                          Parser σ τ ε { errors := ge, consumes := always } PUnit.{1}

                                                                                                                                                          Run p until stop succeeds; discard p's results.

                                                                                                                                                          Equations
                                                                                                                                                          Instances For
                                                                                                                                                            def Parser.sepByN {σ τ : Type} [Buffer σ] [Reader σ τ] {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser σ τ ε { errors := ge', consumes := gc' } β) (p : Parser σ τ ε { errors := ge, consumes := gc } α) (n : ℕ) :
                                                                                                                                                            Parser σ τ ε fallible (List.Vector α n)

                                                                                                                                                            Parse exactly n occurrences of p separated by sep.

                                                                                                                                                            Equations
                                                                                                                                                            Instances For
                                                                                                                                                              def Parser.chainl1 {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε : Type} {ge ge' : Necessity} (op : Parser σ τ ε { errors := ge', consumes := always } (α → α → α)) (p : Parser σ τ ε { errors := ge, consumes := always } α) :
                                                                                                                                                              Parser σ τ ε { errors := ge, consumes := always } α

                                                                                                                                                              Parse one or more occurrences of p separated by left-associative operator op.

                                                                                                                                                              Equations
                                                                                                                                                              • One or more equations did not get rendered due to their size.
                                                                                                                                                              Instances For
                                                                                                                                                                def Parser.eof {σ τ : Type} [Buffer σ] [Reader σ τ] :

                                                                                                                                                                Succeed only at end of input, consuming nothing.

                                                                                                                                                                Equations
                                                                                                                                                                • One or more equations did not get rendered due to their size.
                                                                                                                                                                Instances For
                                                                                                                                                                  def Parser.lookahead {σ τ : Type} [Buffer σ] [Reader σ τ] {α : Type} {ge gc : Necessity} (p : Parser σ τ Error { errors := ge, consumes := gc } α) :
                                                                                                                                                                  Parser σ τ Error { errors := ge, consumes := never } α

                                                                                                                                                                  Run p without consuming input, keeping only the result.

                                                                                                                                                                  Equations
                                                                                                                                                                  • One or more equations did not get rendered due to their size.
                                                                                                                                                                  Instances For
                                                                                                                                                                    def Parser.peek {σ τ : Type} [Buffer σ] [Reader σ τ] :
                                                                                                                                                                    Equations
                                                                                                                                                                    Instances For
                                                                                                                                                                      def Parser.notFollowedBy {σ τ : Type} [Buffer σ] [Reader σ τ] {α : Type} {ge gc : Necessity} (p : Parser σ τ Error { errors := ge, consumes := gc } α) :
                                                                                                                                                                      Parser σ τ Error { errors := ge.complement, consumes := never } PUnit.{1}

                                                                                                                                                                      Succeed (without consuming) only when p fails.

                                                                                                                                                                      Equations
                                                                                                                                                                      • One or more equations did not get rendered due to their size.
                                                                                                                                                                      Instances For
                                                                                                                                                                        def Parser.withRecovery {σ τ : Type} [Buffer σ] [Reader σ τ] {α ε ε' : Type} {ge ge' gc gc' : Necessity} (recover : ε' → Parser σ τ ε { errors := ge, consumes := gc } α) (p : Parser σ τ ε' { errors := ge', consumes := gc' } α) :
                                                                                                                                                                        Parser σ τ ε' { errors := min ge ge', consumes := ge'.ite gc gc' } α

                                                                                                                                                                        Run p; if it fails with error e, run recover e. If recovery also fails, report p's original error.

                                                                                                                                                                        Equations
                                                                                                                                                                        • One or more equations did not get rendered due to their size.
                                                                                                                                                                        Instances For