diff --git a/5.0/api-guide/combinator.html b/5.0/api-guide/combinator.html index 3f546bfc1..e5de056d8 100644 --- a/5.0/api-guide/combinator.html +++ b/5.0/api-guide/combinator.html @@ -177,7 +177,7 @@

import parsley.combinator.{manyTill} val comment = string("//") ~> manyTill(item, endOfLine) -// comment: parsley.Parsley[List[Char]] = parsley.Parsley@62cd4c9 +// comment: parsley.Parsley[List[Char]] = parsley.Parsley@7e221678 comment.parse("// this is a comment\n") // res0: parsley.Result[String, List[Char]] = Success(List( , t, h, i, s, , i, s, , a, , c, o, m, m, e, n, t)) diff --git a/5.0/api-guide/debug.html b/5.0/api-guide/debug.html index 096b0b873..1d6c7e045 100644 --- a/5.0/api-guide/debug.html +++ b/5.0/api-guide/debug.html @@ -171,7 +171,7 @@

string("hey").debug("hey") | string("hi").debug("hi") ) -// hello: parsley.Parsley[String] = parsley.Parsley@26344217 +// hello: parsley.Parsley[String] = parsley.Parsley@7b8c56f2 debug.disableColorRendering() @@ -243,7 +243,7 @@

debug("rollback", r1 -> "r1") } } -// p: parsley.Parsley[String] = parsley.Parsley@51478654 +// p: parsley.Parsley[String] = parsley.Parsley@5c7d1943 p.parse("hello world") // >rollback> (1, 1): hello· @@ -297,7 +297,7 @@

debugError("many letterOrDigit") ~> many(char('@').debugError("@")).debugError("many @") ~> char('#').debugError("#")) | char('!').debugError("!") -// q: parsley.Parsley[Char] = parsley.Parsley@3a93f256 +// q: parsley.Parsley[Char] = parsley.Parsley@160469a6 q.parse("$") // >many letterOrDigit> (offset 0, line 1, col 1): current hints are Set() (valid at offset 0) @@ -395,10 +395,10 @@

profiler.summary() // name self time num calls average self time // ----------------------------------------------------------------- -// classic string 3412549.2μs 10001 341.220μs -// voided optimised string 1018.3μs 10000 0.101μs -// optimised string 9999.2μs 10000 0.999μs -// voided classic string 3478.9μs 10001 0.347μs +// classic string 3344730.2μs 10001 334.439μs +// voided optimised string 927.8μs 10000 0.092μs +// optimised string 9617.1μs 10000 0.961μs +// voided classic string 3386.0μs 10001 0.338μs // -----------------------------------------------------------------

The above example shows that the string combinator is much faster than the "classic" definition in terms of traverse and char (not even accounting for its improved error messages!). However, diff --git a/5.0/api-guide/errors/combinator.html b/5.0/api-guide/errors/combinator.html index 3707543dc..319098109 100644 --- a/5.0/api-guide/errors/combinator.html +++ b/5.0/api-guide/errors/combinator.html @@ -310,7 +310,7 @@

import parsley.errors.combinator.ErrorMethods val digit = satisfy(_.isDigit).label("digit") -// digit: parsley.Parsley[Char] = parsley.Parsley@3731a3c8 +// digit: parsley.Parsley[Char] = parsley.Parsley@3dc5367 digit.parse("a") // res9: parsley.Result[String, Char] = Failure((line 1, column 1): // unexpected "a" @@ -328,7 +328,7 @@

val twoDigits = (digit *> digit).label("two digits") -// twoDigits: parsley.Parsley[Char] = parsley.Parsley@61980c0c +// twoDigits: parsley.Parsley[Char] = parsley.Parsley@56910917 twoDigits.parse("a") // res10: parsley.Result[String, Char] = Failure((line 1, column 1): // unexpected "a" diff --git a/5.0/api-guide/errors/patterns.html b/5.0/api-guide/errors/patterns.html index fe6bb2415..8b60a600e 100644 --- a/5.0/api-guide/errors/patterns.html +++ b/5.0/api-guide/errors/patterns.html @@ -184,10 +184,10 @@

// assume that a `lexer` is available val float = lexer.nonlexeme.floating.decimal -// float: parsley.Parsley[BigDecimal] = parsley.Parsley@588bbf81 +// float: parsley.Parsley[BigDecimal] = parsley.Parsley@d67ff3b val _noFloat = float.verifiedExplain("floating-point values may not be used as array indices") -// _noFloat: parsley.Parsley[Nothing] = parsley.Parsley@634cb576 +// _noFloat: parsley.Parsley[Nothing] = parsley.Parsley@66bdd22a _noFloat.parse("hello") // res0: parsley.Result[String, Nothing] = Failure((line 1, column 1): @@ -202,11 +202,11 @@

val int = lexer.nonlexeme.unsigned.decimal -// int: parsley.Parsley[BigInt] = parsley.Parsley@40e096b2 +// int: parsley.Parsley[BigInt] = parsley.Parsley@378ccfaf val _noPlus = (char('+') ~> int).verifiedFail { n => Seq(s"the number $n may not be preceeded by \"+\"") } -// _noPlus: parsley.Parsley[Nothing] = parsley.Parsley@6c386845 +// _noPlus: parsley.Parsley[Nothing] = parsley.Parsley@23382e54 _noPlus.parse("+10") // res2: parsley.Result[String, Nothing] = Failure((line 1, column 1): // the number 10 may not be preceeded by "+" @@ -225,7 +225,7 @@

override def adjustWidth(x: BigInt, width: Int) = 1 } } -// _noPlus: parsley.Parsley[Nothing] = parsley.Parsley@15f1d552 +// _noPlus: parsley.Parsley[Nothing] = parsley.Parsley@4bbd5747 _noPlus.parse("+10") // res3: parsley.Result[String, Nothing] = Failure((line 1, column 1): // a number may not be preceeded by "+" @@ -244,7 +244,7 @@

// _noFloat: parsley.Parsley[Nothing] = parsley.Parsley@65ae37c5 +// _noFloat: parsley.Parsley[Nothing] = parsley.Parsley@69ab65e7 _noFloat.parse("3.142") // res4: parsley.Result[String, Nothing] = Failure((line 1, column 1): @@ -276,11 +276,11 @@

import parsley.errors.patterns.PreventativeErrors val ident = lexer.nonlexeme.names.identifier -// ident: parsley.Parsley[String] = parsley.Parsley@396586fe +// ident: parsley.Parsley[String] = parsley.Parsley@78e7084e val _noDot = (char('.') ~> ident).preventativeFail { v => Seq(s"accessing field $v is not permitted here") } -// _noDot: parsley.Parsley[Unit] = parsley.Parsley@27047811 +// _noDot: parsley.Parsley[Unit] = parsley.Parsley@2d808dde _noDot.parse("hi") // res5: parsley.Result[String, Unit] = Success(()) _noDot.parse(".foo") diff --git a/5.0/api-guide/expr/precedence.html b/5.0/api-guide/expr/precedence.html index f1048e899..06467b0f4 100644 --- a/5.0/api-guide/expr/precedence.html +++ b/5.0/api-guide/expr/precedence.html @@ -214,7 +214,7 @@

Ops(InfixL)("*" as Mul), Ops(InfixL)("+" as Add, "-" as Sub) ) -// expr: Parsley[Expr] = parsley.Parsley@195d14f4 +// expr: Parsley[Expr] = parsley.Parsley@1c24b545 expr.parse("x+5*y") // res0: parsley.Result[String, Expr] = Success(Add(Var(x),Mul(Num(5),Var(y)))) @@ -294,7 +294,7 @@

SOps(InfixL)("*" as Mul) :+ SOps(InfixL)("+"as Add, "-" as Sub) } -// expr: Parsley[Expr] = parsley.Parsley@6aa33150 +// expr: Parsley[Expr] = parsley.Parsley@504d6585 expr.parse("x+5*y") // res1: parsley.Result[String, Expr] = Success(Add(Var(x),Mul(Num(5),Var(y)))) diff --git a/5.0/api-guide/generic.html b/5.0/api-guide/generic.html index cc85a740e..25694766c 100644 --- a/5.0/api-guide/generic.html +++ b/5.0/api-guide/generic.html @@ -171,7 +171,7 @@

case class Foo(x: Int, y: Int) // with px, py of type Parsley[Int] val p = (px, py).zipped(Foo(_, _)) -// p: Parsley[Foo] = parsley.Parsley@6924c11f +// p: Parsley[Foo] = parsley.Parsley@2ebddd08

These work fine for the most part, however, there are couple of problems with this:

  1. In Scala 3, Foo(_, _) actually needs to be written as Foo.apply, which introduces some (minor) noise; @@ -198,7 +198,7 @@

    Parsley values. If we assume that the companion object of Foo has been turned into such a bridge (definition below), the above example can be written as:

    val q = Foo(px, py)
    -// q: Parsley[Foo] = parsley.Parsley@47d358ca
    +// q: Parsley[Foo] = parsley.Parsley@4547e0e2

    In this version, the act of constructing the Foo value has been abstracted behind the bridge, Foo: this means that the underlying implementation can vary without changing the parser.

    What are Generic Bridges? @@ -270,7 +270,7 @@

    val nullLit = NullLit <# "null" -// nullLit: Parsley[Expr] = parsley.Parsley@347b555d +// nullLit: Parsley[Expr] = parsley.Parsley@344ee1b5 nullLit.parse("null") // res2: parsley.Result[String, Expr] = Success(NullLit)

    Without any further configuration, notice that the result of parsing "null" is indeed NullLit, @@ -351,7 +351,7 @@

    // from `parsley-cats`, produces `NonEmptyList` instead of `List` import parsley.cats.combinator.sepBy1 val tupleOrParens = TupleOrParens("(" ~> sepBy1(nullLit, ",") <~ ")") -// tupleOrParens: Parsley[Expr] = parsley.Parsley@370251ec +// tupleOrParens: Parsley[Expr] = parsley.Parsley@6afd0aef tupleOrParens.parse("(null)") // res4: parsley.Result[String, Expr] = Success(NullLit) tupleOrParens.parse("(null,null)") diff --git a/5.0/api-guide/state.html b/5.0/api-guide/state.html index 3dd280f63..bed2b091d 100644 --- a/5.0/api-guide/state.html +++ b/5.0/api-guide/state.html @@ -243,9 +243,9 @@

    import parsley.syntax.character.{charLift, stringLift} val openTag = atomic('<' <~ notFollowedBy('/')) -// openTag: Parsley[Char] = parsley.Parsley@39d32546 +// openTag: Parsley[Char] = parsley.Parsley@754c45c3 val tagName = stringOfSome(letter) -// tagName: Parsley[String] = parsley.Parsley@4a1da27 +// tagName: Parsley[String] = parsley.Parsley@2d79cb3b lazy val content: Parsley[Unit] = optional(tag) lazy val tag: Parsley[Unit] = (openTag ~> tagName <~ '>').fillRef { name => @@ -328,7 +328,7 @@

    Verified Error to report a message based on the last opened bracket. The results are below:

    val p = brackets
    -// p: Parsley[Unit] = parsley.Parsley@5bbd7498
    +// p: Parsley[Unit] = parsley.Parsley@4c1e3570
     
     p.parse("()()()")
     // res5: parsley.Result[String, Unit] = Success(())
    @@ -407,7 +407,7 @@ 

    i.get <~ eof } -// abcs: Parsley[Int] = parsley.Parsley@325edf80 +// abcs: Parsley[Int] = parsley.Parsley@39ddd9b0 abcs.parse("aabbcc") // res12: parsley.Result[String, Int] = Success(2) diff --git a/5.0/api-guide/syntax.html b/5.0/api-guide/syntax.html index f9c28addd..fdf905870 100644 --- a/5.0/api-guide/syntax.html +++ b/5.0/api-guide/syntax.html @@ -166,7 +166,7 @@

    import parsley.syntax.character._ val p = 'a' ~> "bc" -// p: parsley.Parsley[String] = parsley.Parsley@1443b889 +// p: parsley.Parsley[String] = parsley.Parsley@7a0a990 p.parse("abc") // res0: parsley.Result[String, String] = Success(bc) p.parse("axy") diff --git a/5.0/api-guide/token/Lexer.html b/5.0/api-guide/token/Lexer.html index 32512d81d..9c58d62c6 100644 --- a/5.0/api-guide/token/Lexer.html +++ b/5.0/api-guide/token/Lexer.html @@ -316,7 +316,7 @@

    345. For signed, each of these may be preceded by a + sign, but this is not required; if positiveSign is set to PlusSignPresence.Compulsory, positive literals would always require a +; and if it is set to PlusSignPrecense.Illegal, the + prefix can never be used (but - is fine regardless). By default, 023 is legal, but this can be disabled by setting leadingZerosAllowed to false.

    val num = lexer.lexeme.signed.number
    -// num: parsley.Parsley[BigInt] = parsley.Parsley@1f929147
    +// num: parsley.Parsley[BigInt] = parsley.Parsley@3e2db3de
     num.parse("0")
     // res0: parsley.Result[String, BigInt] = Success(x = 0)
     num.parse("0xff")
    @@ -333,9 +333,9 @@ 

    numericDesc = NumericDesc.plain.copy( literalBreakChar = BreakCharDesc.Supported('_', allowedAfterNonDecimalPrefix = true)) )) -// lexerWithBreak: Lexer = parsley.token.Lexer@6469f96d +// lexerWithBreak: Lexer = parsley.token.Lexer@1dfa7379 val withBreak = lexerWithBreak.lexeme.signed.number -// withBreak: parsley.Parsley[BigInt] = parsley.Parsley@61ea4822 +// withBreak: parsley.Parsley[BigInt] = parsley.Parsley@6ea5427a withBreak.parse("1_000") // res4: parsley.Result[String, BigInt] = Success(x = 1000) withBreak.parse("1_") @@ -357,7 +357,7 @@

    2000. Notice that literals do not require a point, so long as they do have an exponent.

    val real = lexer.lexeme.real
    -// real: parsley.token.numeric.RealParsers = parsley.token.numeric.LexemeReal@63d65793
    +// real: parsley.token.numeric.RealParsers = parsley.token.numeric.LexemeReal@6ed8dfea
     real.hexadecimalDouble.parse("0x3.142")
     // res7: parsley.Result[String, Double] = Failure(
     // ...
    @@ -448,9 +448,9 @@ 

    nonlexeme.string val fullUnicode = stringParsers(aboveSpace) -// fullUnicode: parsley.token.text.StringParsers = parsley.token.text.ConcreteString@7fe6c98c +// fullUnicode: parsley.token.text.StringParsers = parsley.token.text.ConcreteString@7a2f3825 val latin1Limited = stringParsers(predicate.Basic(c => c >= 0x20 && c <= 0xcf)) -// latin1Limited: parsley.token.text.StringParsers = parsley.token.text.ConcreteString@4ce1afc9 +// latin1Limited: parsley.token.text.StringParsers = parsley.token.text.ConcreteString@62c9e867 fullUnicode.latin1.parse("\"hello α\"") // res13: parsley.Result[String, String] = Failure((line 1, column 2): @@ -518,7 +518,7 @@

    val withGaps = stringParsers(escapeDesc = EscapeDesc.plain.copy(gapsSupported = true))
    -// withGaps: parsley.token.text.StringParsers = parsley.token.text.ConcreteString@1dda0309
    +// withGaps: parsley.token.text.StringParsers = parsley.token.text.ConcreteString@4a464c5b
     withGaps.ascii.parse(""""Hello \
     
           \World!" """)
    diff --git a/5.0/tutorial/basics-of-combinators.html b/5.0/tutorial/basics-of-combinators.html
    index e98996436..27c32a3d4 100644
    --- a/5.0/tutorial/basics-of-combinators.html
    +++ b/5.0/tutorial/basics-of-combinators.html
    @@ -536,10 +536,10 @@ 

    import parsley.debug._ val p = "abc" | atomic("def") | "dead" -// p: Parsley[String] = parsley.Parsley@4d0fe454 +// p: Parsley[String] = parsley.Parsley@2e54a9b5 val q = "abc" | (atomic("def".debug("reading def")).debug("backtrack!") | "dead".debug("reading dead")).debug("branch") -// q: Parsley[String] = parsley.Parsley@cc372e0 +// q: Parsley[String] = parsley.Parsley@4332ab89 p.parse("dead") // res37: parsley.Result[String, String] = Success(dead) @@ -587,9 +587,9 @@

    val eof = notFollowedBy(item) -// eof: Parsley[Unit] = parsley.Parsley@68937bfe +// eof: Parsley[Unit] = parsley.Parsley@77498b21 val abcOnly = "abc" <~ eof -// abcOnly: Parsley[String] = parsley.Parsley@29b29246 +// abcOnly: Parsley[String] = parsley.Parsley@15eafa5 abcOnly.parse("abc") // res39: parsley.Result[String, String] = Success(abc) @@ -600,7 +600,7 @@

    val p = "abc".debug("abc") <~ lookAhead("!!".debug("!!")).debug("lookahead") -// p: Parsley[String] = parsley.Parsley@2f44dcf9 +// p: Parsley[String] = parsley.Parsley@92a96e1 p.parse("abc!!") // >abc> (1, 1): abc!!• diff --git a/5.0/tutorial/effective-whitespace-parsing.html b/5.0/tutorial/effective-whitespace-parsing.html index cfe670cf8..5859da915 100644 --- a/5.0/tutorial/effective-whitespace-parsing.html +++ b/5.0/tutorial/effective-whitespace-parsing.html @@ -206,7 +206,7 @@

    import parsley.expr.{precedence, Ops, InfixL} val number = token(digit.foldLeft1[BigInt](0)((n, d) => n * 10 + d.asDigit)) -// number: Parsley[BigInt] = parsley.Parsley@38e4077 +// number: Parsley[BigInt] = parsley.Parsley@560b024e lazy val atom: Parsley[BigInt] = "(" ~> expr <~ ")" | number lazy val expr = precedence[BigInt](atom)( diff --git a/downloads.html b/downloads.html index 4bc1b7e11..7eb264e16 100644 --- a/downloads.html +++ b/downloads.html @@ -150,7 +150,7 @@

    Documentation Downloads

    diff --git a/downloads/docs-5.0-768c7e4-SNAPSHOT.pdf b/downloads/docs-5.0-768c7e4-SNAPSHOT.pdf new file mode 100644 index 000000000..96d913c72 Binary files /dev/null and b/downloads/docs-5.0-768c7e4-SNAPSHOT.pdf differ diff --git a/index.html b/index.html index f42b918cb..d47174c5e 100644 --- a/index.html +++ b/index.html @@ -133,7 +133,7 @@

    Getting Started

    // mill ivy"com.github.j-mie6::parsley:4.5.1"

    Alternatively, the most up-to-date development pre-release is 5.0.0-M6 and the - most bleeding-edge snapshot is 5.0-9e0d86e-SNAPSHOT.

    + most bleeding-edge snapshot is 5.0-768c7e4-SNAPSHOT.

    Examples

    Parsley can leverage string and character literals in Scala by implicit conversions, keeping the @@ -142,7 +142,7 @@

    < import parsley.syntax.character.{charLift, stringLift} val hello: Parsley[Unit] = ('h' ~> ("ello" | "i") ~> " world!").void -// hello: Parsley[Unit] = parsley.Parsley@f5eb9aa +// hello: Parsley[Unit] = parsley.Parsley@1a12f85a hello.parse("hello world!") // res0: parsley.Result[String, Unit] = Success(()) hello.parse("hi world!") @@ -157,7 +157,7 @@

    < definitions of simple numbers:

    import parsley.character.digit
     val natural: Parsley[Int] = digit.foldLeft1(0)((n, d) => n * 10 + d.asDigit)
    -// natural: Parsley[Int] = parsley.Parsley@15c978f2
    +// natural: Parsley[Int] = parsley.Parsley@46e9db58
     natural.parse("0")
     // res3: parsley.Result[String, Int] = Success(0)
     natural.parse("123")