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
    @[reducible, inline]
    abbrev Text (n : ) :

    Input text of statically known length n.

    Equations
    Instances For
      structure Grade :

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

      Instances For
        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
                          Equations
                          • One or more equations did not get rendered due to their size.
                          @[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 := Necessity.never, consumes := Necessity.never }
                          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
                              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
                                @[reducible, inline]
                                abbrev Parser.Outcome (ε : Type) (n : ) (g : Grade) (α : Type) :

                                The result type of running a parser

                                Equations
                                Instances For
                                  structure Parser (ε : 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
                                    def Parser.Outcome.handle {α β ε : Type} {n : } {ge gc : Necessity} (p : Outcome ε n { errors := ge, consumes := gc } α) (e : Necessity.possibly geεβ) (s : ge Necessity.possiblySuccess n gc αβ) :
                                    β
                                    Equations
                                    Instances For
                                      instance Parser.instFunctorSuccess {n : } {gc : Necessity} :
                                      Equations
                                      instance Parser.instFunctorOutcome {ε : Type} {n : } {g : Grade} :
                                      Functor (Outcome ε n g)
                                      Equations
                                      • One or more equations did not get rendered due to their size.
                                      Equations
                                      Instances For
                                        Equations
                                        Instances For
                                          def Parser.Success.ap {α β : Type} {n : } {gc gc' : Necessity} (r1 : Success n gc (αβ)) (r2 : Success r1.restSize gc' α) :
                                          Success n (max gc gc') β
                                          Equations
                                          Instances For
                                            def Parser.Success.ap' {α β : Type} {n : } {gc gc' : Necessity} (r1 : Success n gc α) (r2 : Success r1.restSize gc' (αβ)) :
                                            Success n (max gc gc') β
                                            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
                                                def Parser.Success.bindParser {α β ε : Type} {n : } {xc fe fc : Necessity} (x : Success n xc α) (f : αParser ε { errors := fe, consumes := fc } β) :
                                                Outcome ε n { errors := fe, consumes := max xc fc } β
                                                Equations
                                                Instances For
                                                  Equations
                                                  def Parser.Outcome.throw {α ε : Type} {n : } {g : Grade} (e : ε) (h : Necessity.possibly g.errors := by simp) :
                                                  Outcome ε n g α
                                                  Equations
                                                  • One or more equations did not get rendered due to their size.
                                                  Instances For
                                                    def Parser.Outcome.ofSuccess {α ε : Type} {n : } {ge gc : Necessity} (r : Success n gc α) (c : ge Necessity.possibly := by decide) :
                                                    Outcome ε n { errors := ge, consumes := gc } α
                                                    Equations
                                                    Instances For
                                                      def Parser.bind {α β ε : 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
                                                        @[reducible, inline]
                                                        abbrev Parser.pure {α ε : Type} (a : α) :
                                                        Parser ε 1 α

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

                                                        Equations
                                                        • Parser.pure a = { run := fun {n : } (t : Text n) => { result := a, restSize := n, restText := t, witness := } }
                                                        Instances For
                                                          Equations
                                                          • One or more equations did not get rendered due to their size.
                                                          Equations
                                                          def Parser.fix {α ε : Type} {ge : Necessity} [Inhabited ε] (f : Parser ε { errors := ge, consumes := Necessity.always } αParser ε { errors := ge, consumes := Necessity.always } α) (h : Necessity.possibly ge := by simp) :
                                                          Parser ε { errors := ge, consumes := Necessity.always } α

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

                                                          Equations
                                                          Instances For
                                                            @[irreducible]
                                                            def Parser.fix.go {α ε : Type} {ge : Necessity} [Inhabited ε] (f : Parser ε { errors := ge, consumes := Necessity.always } αParser ε { errors := ge, consumes := Necessity.always } α) (h : Necessity.possibly ge) {n : } (t : Text n) :
                                                            Outcome ε n { errors := ge, consumes := Necessity.always } α
                                                            Equations
                                                            Instances For
                                                              def Parser.choice {α ε : 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, try p2. The error grade is the infimum and the consumption grade is computed via Necessity.ite.

                                                              Equations
                                                              • One or more equations did not get rendered due to their size.
                                                              Instances For
                                                                def Parser.oneOf {α ε : Type} {g : Grade} (l : List (Parser ε g α)) (p : l.length 0 := by simp) :
                                                                Parser ε g α

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

                                                                Equations
                                                                Instances For
                                                                  def Parser.throw {α ε : Type} {ge gc : Necessity} (e : ε) (c : Necessity.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 α) :
                                                                    Equations
                                                                    Instances For
                                                                      def Parser.relaxConsumes {α ε : Type} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) :
                                                                      Parser ε { errors := ge, consumes := min gc Necessity.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} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) :
                                                                        Parser ε { errors := min ge Necessity.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} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) :
                                                                          Parser ε { errors := min ge Necessity.possibly, consumes := min gc Necessity.possibly } α

                                                                          Cap both error and consumption grades at possibly.

                                                                          Equations
                                                                          Instances For
                                                                            Equations
                                                                            Instances For
                                                                              def Parser.weakenConsumes {α ε : Type} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) :
                                                                              Parser ε { errors := ge, consumes := Necessity.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} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) :
                                                                                Parser ε { errors := Necessity.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} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) :

                                                                                  Weaken both grades to possibly, yielding a fallible parser.

                                                                                  Equations
                                                                                  Instances For
                                                                                    def Parser.runOption {α ε : Type} {n : } {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) (t : Text n) :
                                                                                    Option (Success n gc α)

                                                                                    Run a parser, discarding the error and returning the Success as an Option.

                                                                                    Equations
                                                                                    Instances For
                                                                                      def Parser.runResult? {α ε : Type} {n : } {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) (t : Text n) :

                                                                                      Run a parser, returning only the parsed value as an Option.

                                                                                      Equations
                                                                                      Instances For

                                                                                        Consume and return a single character, or fail on empty input.

                                                                                        Equations
                                                                                        • One or more equations did not get rendered due to their size.
                                                                                        Instances For
                                                                                          def Parser.ok {α ε : Type} {ge gc : Necessity} (a : α) (he : ge Necessity.possibly := by simp) (hc : gc Necessity.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

                                                                                            Consume a character 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

                                                                                              Consume a character that satisfies predicate f, or fail.

                                                                                              Equations
                                                                                              Instances For

                                                                                                Match a specific character.

                                                                                                Equations
                                                                                                Instances For

                                                                                                  Match an exact string.

                                                                                                  Equations
                                                                                                  Instances For
                                                                                                    def Parser.optional {α ε : Type} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) :
                                                                                                    Parser ε { errors := Necessity.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} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) (d : α) :
                                                                                                      Parser ε { errors := Necessity.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.optionalBind {α β ε : Type} {ge ge' gc gc' : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) (cont : αParser ε { errors := ge', consumes := gc' } β) :
                                                                                                        Parser ε { errors := Necessity.never, consumes := min (max ge ge').complement (max gc gc') } (Option β)

                                                                                                        Try p then apply cont to its result; wrap the final result in Option.

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

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

                                                                                                          Equations
                                                                                                          Instances For
                                                                                                            def Parser.many {α ε : Type} {ge : Necessity} (p : Parser ε { errors := ge, consumes := Necessity.always } α) :

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

                                                                                                            Equations
                                                                                                            Instances For
                                                                                                              @[irreducible]
                                                                                                              def Parser.many.go {α ε : Type} {ge : Necessity} {n : } (p : Parser ε { errors := ge, consumes := Necessity.always } α) (t : Text n) :
                                                                                                              Equations
                                                                                                              • One or more equations did not get rendered due to their size.
                                                                                                              Instances For
                                                                                                                @[reducible, inline]
                                                                                                                abbrev Parser.NonEmptyList (α : Type u_1) :
                                                                                                                Type u_1
                                                                                                                Equations
                                                                                                                Instances For
                                                                                                                  @[reducible, inline]
                                                                                                                  abbrev Parser.NonEmptyList.mk {α : Type} (x : α) (xs : List α) :
                                                                                                                  Equations
                                                                                                                  Instances For
                                                                                                                    @[reducible, inline]
                                                                                                                    Equations
                                                                                                                    Instances For
                                                                                                                      def Parser.many1 {α ε : Type} {ge : Necessity} (p : Parser ε { errors := ge, consumes := Necessity.always } α) :
                                                                                                                      Parser ε { errors := ge, consumes := Necessity.always } (NonEmptyList α)

                                                                                                                      Apply p one or more times, collecting results.

                                                                                                                      Equations
                                                                                                                      Instances For

                                                                                                                        Consume characters while f holds, returning the collected string.

                                                                                                                        Equations
                                                                                                                        Instances For

                                                                                                                          Consume one or more characters while f holds.

                                                                                                                          Equations
                                                                                                                          Instances For

                                                                                                                            Skip characters while f holds.

                                                                                                                            Equations
                                                                                                                            Instances For

                                                                                                                              Skip one or more characters while f holds.

                                                                                                                              Equations
                                                                                                                              Instances For

                                                                                                                                Skip zero or more whitespace characters.

                                                                                                                                Equations
                                                                                                                                Instances For
                                                                                                                                  def Parser.lexeme {α : Type} {ge gc : Necessity} (p : Parser Error { errors := ge, consumes := gc } α) :
                                                                                                                                  Parser Error { errors := ge, consumes := max gc Necessity.possibly } α

                                                                                                                                  Run p then skip trailing whitespace.

                                                                                                                                  Equations
                                                                                                                                  Instances For
                                                                                                                                    def Parser.parens {α : Type} {ge gc : Necessity} (p : Parser Error { errors := ge, consumes := gc } α) :
                                                                                                                                    Parser Error { errors := max ge Necessity.possibly, consumes := Necessity.always } α

                                                                                                                                    Parse p surrounded by parentheses.

                                                                                                                                    Equations
                                                                                                                                    Instances For
                                                                                                                                      def Parser.brackets {α : Type} {ge gc : Necessity} (p : Parser Error { errors := ge, consumes := gc } α) :
                                                                                                                                      Parser Error { errors := max ge Necessity.possibly, consumes := Necessity.always } α

                                                                                                                                      Parse p surrounded by square brackets.

                                                                                                                                      Equations
                                                                                                                                      Instances For
                                                                                                                                        def Parser.braces {α : Type} {ge gc : Necessity} (p : Parser Error { errors := ge, consumes := gc } α) :
                                                                                                                                        Parser Error { errors := max ge Necessity.possibly, consumes := Necessity.always } α

                                                                                                                                        Parse p surrounded by curly braces.

                                                                                                                                        Equations
                                                                                                                                        Instances For

                                                                                                                                          Parse a single decimal digit, returning its numeric value.

                                                                                                                                          Equations
                                                                                                                                          Instances For

                                                                                                                                            Parse a natural number (one or more digits).

                                                                                                                                            Equations
                                                                                                                                            Instances For

                                                                                                                                              Parse an integer (optional leading - followed by digits).

                                                                                                                                              Equations
                                                                                                                                              Instances For
                                                                                                                                                def Parser.sepBy {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser ε { errors := ge', consumes := gc' } β) (p : Parser ε { errors := ge, consumes := gc } α) (h : max gc' gc = Necessity.always := by simp) :

                                                                                                                                                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.countSucc {α ε : Type} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) (n : ) :
                                                                                                                                                  Parser ε { errors := ge, consumes := gc } (List.Vector α (n + 1))

                                                                                                                                                  Parse exactly n + 1 occurrences of p.

                                                                                                                                                  Equations
                                                                                                                                                  Instances For
                                                                                                                                                    def Parser.count {α ε : Type} {ge gc : Necessity} (p : Parser ε { errors := ge, consumes := gc } α) (n : ) :
                                                                                                                                                    Parser ε { errors := min ge Necessity.possibly, consumes := min gc Necessity.possibly } (List.Vector α n)

                                                                                                                                                    Parse exactly n occurrences of p.

                                                                                                                                                    Equations
                                                                                                                                                    Instances For
                                                                                                                                                      def Parser.sepByN {α β ε : Type} {ge ge' gc gc' : Necessity} (sep : Parser ε { errors := ge', consumes := gc' } β) (p : Parser ε { errors := ge, consumes := gc } α) (n : ) :

                                                                                                                                                      Parse exactly n occurrences of p separated by sep.

                                                                                                                                                      Equations
                                                                                                                                                      Instances For
                                                                                                                                                        def Parser.chainl1 {α ε : Type} {ge ge' : Necessity} (op : Parser ε { errors := ge', consumes := Necessity.always } (ααα)) (p : Parser ε { errors := ge, consumes := Necessity.always } α) :
                                                                                                                                                        Parser ε { errors := ge, consumes := Necessity.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

                                                                                                                                                          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} {ge gc : Necessity} (p : Parser Error { errors := ge, consumes := gc } α) :
                                                                                                                                                            Parser Error { errors := ge, consumes := Necessity.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.notFollowedBy {α : Type} {ge gc : Necessity} (p : Parser Error { errors := ge, consumes := gc } α) :
                                                                                                                                                              Parser Error { errors := ge.complement, consumes := Necessity.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} {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