From f827bef00f5e39be1f7427937854a1323292aeb3 Mon Sep 17 00:00:00 2001 From: Philippus Date: Fri, 12 Apr 2019 14:28:00 +0200 Subject: [PATCH 01/12] Import undeprecated crossProject --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index cae5f23f..d7730dc5 100644 --- a/build.sbt +++ b/build.sbt @@ -1,5 +1,5 @@ import ScalaModulePlugin._ -import sbtcrossproject.crossProject +import sbtcrossproject.CrossPlugin.autoImport.crossProject crossScalaVersions in ThisBuild := List("2.12.8", "2.11.12", "2.13.0-RC1") From 243a278374bb421003a392d18ed1aa8c642ad42e Mon Sep 17 00:00:00 2001 From: Philippus Date: Fri, 12 Apr 2019 14:40:34 +0200 Subject: [PATCH 02/12] Use string interpolation instead of concatenation in toString methods --- .../scala/scala/util/parsing/combinator/Parsers.scala | 10 +++++----- .../util/parsing/combinator/token/StdTokens.scala | 6 +++--- .../main/scala/scala/util/parsing/input/Position.scala | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/shared/src/main/scala/scala/util/parsing/combinator/Parsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/Parsers.scala index 3ef7d8d2..efe12579 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/Parsers.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/Parsers.scala @@ -154,7 +154,7 @@ trait Parsers { def get: T = result /** The toString method of a Success. */ - override def toString = "["+next.pos+"] parsed: "+result + override def toString = s"[${next.pos}] parsed: $result" val successful = true } @@ -190,7 +190,7 @@ trait Parsers { */ case class Failure(override val msg: String, override val next: Input) extends NoSuccess(msg, next) { /** The toString method of a Failure yields an error message. */ - override def toString = "["+next.pos+"] failure: "+msg+"\n\n"+next.pos.longString + override def toString = s"[${next.pos}] failure: $msg\n\n${next.pos.longString}" def append[U >: Nothing](a: => ParseResult[U]): ParseResult[U] = { val alt = a; alt match { case Success(_, _) => alt @@ -207,7 +207,7 @@ trait Parsers { */ case class Error(override val msg: String, override val next: Input) extends NoSuccess(msg, next) { /** The toString method of an Error yields an error message. */ - override def toString = "["+next.pos+"] error: "+msg+"\n\n"+next.pos.longString + override def toString = s"[${next.pos}] error: $msg\n\n${next.pos.longString}" def append[U >: Nothing](a: => ParseResult[U]): ParseResult[U] = this } @@ -223,7 +223,7 @@ trait Parsers { abstract class Parser[+T] extends (Input => ParseResult[T]) { private var name: String = "" def named(n: String): this.type = {name=n; this} - override def toString() = "Parser ("+ name +")" + override def toString = s"Parser ($name)" /** An unspecified method that defines the behaviour of this parser. */ def apply(in: Input): ParseResult[T] @@ -940,7 +940,7 @@ trait Parsers { * }}} */ case class ~[+a, +b](_1: a, _2: b) { - override def toString = "("+ _1 +"~"+ _2 +")" + override def toString = s"(${_1}~${_2})" } /** A parser whose `~` combinator disallows back-tracking. diff --git a/shared/src/main/scala/scala/util/parsing/combinator/token/StdTokens.scala b/shared/src/main/scala/scala/util/parsing/combinator/token/StdTokens.scala index 49a8aee0..3fbb964e 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/token/StdTokens.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/token/StdTokens.scala @@ -23,7 +23,7 @@ package token trait StdTokens extends Tokens { /** The class of keyword tokens */ case class Keyword(chars: String) extends Token { - override def toString = "'"+chars+"'" + override def toString = s"'$chars'" } /** The class of numeric literal tokens */ @@ -33,11 +33,11 @@ trait StdTokens extends Tokens { /** The class of string literal tokens */ case class StringLit(chars: String) extends Token { - override def toString = "\""+chars+"\"" + override def toString = s""""$chars"""" } /** The class of identifier tokens */ case class Identifier(chars: String) extends Token { - override def toString = "identifier "+chars + override def toString = s"identifier $chars" } } diff --git a/shared/src/main/scala/scala/util/parsing/input/Position.scala b/shared/src/main/scala/scala/util/parsing/input/Position.scala index 9987e1f5..c0848985 100644 --- a/shared/src/main/scala/scala/util/parsing/input/Position.scala +++ b/shared/src/main/scala/scala/util/parsing/input/Position.scala @@ -37,7 +37,7 @@ trait Position { protected def lineContents: String /** Returns a string representation of the `Position`, of the form `line.column`. */ - override def toString = ""+line+"."+column + override def toString = s"$line.$column" /** Returns a more ``visual`` representation of this position. * More precisely, the resulting string consists of two lines: From 7a82a78ca0c9ed1f04276fd759db73d7e6a45365 Mon Sep 17 00:00:00 2001 From: Philippus Date: Fri, 12 Apr 2019 18:25:13 +0200 Subject: [PATCH 03/12] Remove commented out code --- .../scala/util/parsing/combinator/PackratParsers.scala | 3 --- .../parsing/combinator/syntactical/StdTokenParsers.scala | 7 ++----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala index f601f924..55e11188 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala @@ -56,9 +56,6 @@ import scala.language.implicitConversions */ trait PackratParsers extends Parsers { - - //type Input = PackratReader[Elem] - /** * A specialized `Reader` class that wraps an underlying `Reader` * and provides memoization of parse results. diff --git a/shared/src/main/scala/scala/util/parsing/combinator/syntactical/StdTokenParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/syntactical/StdTokenParsers.scala index 77249407..3e97612a 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/syntactical/StdTokenParsers.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/syntactical/StdTokenParsers.scala @@ -34,9 +34,8 @@ trait StdTokenParsers extends TokenParsers { * @param chars The character string making up the matched keyword. * @return a `Parser` that matches the given string */ -// implicit def keyword(chars: String): Parser[String] = accept(Keyword(chars)) ^^ (_.chars) - implicit def keyword(chars: String): Parser[String] = - keywordCache.getOrElseUpdate(chars, accept(Keyword(chars)) ^^ (_.chars)) + implicit def keyword(chars: String): Parser[String] = + keywordCache.getOrElseUpdate(chars, accept(Keyword(chars)) ^^ (_.chars)) /** A parser which matches a numeric literal */ def numericLit: Parser[String] = @@ -50,5 +49,3 @@ trait StdTokenParsers extends TokenParsers { def ident: Parser[String] = elem("identifier", _.isInstanceOf[Identifier]) ^^ (_.chars) } - - From cb23e5ecc954da1ab8967750796c01612da4a74e Mon Sep 17 00:00:00 2001 From: Philippus Date: Fri, 12 Apr 2019 18:27:17 +0200 Subject: [PATCH 04/12] Add whitespace for readability --- .../scala/scala/util/parsing/combinator/JavaTokenParsers.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala index ef28944f..29efed2d 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala @@ -37,6 +37,7 @@ trait JavaTokenParsers extends RegexParsers { /** An integer, without sign or with a negative sign. */ def wholeNumber: Parser[String] = """-?\d+""".r + /** Number following one of these rules: * * - An integer. For example: `13` @@ -46,6 +47,7 @@ trait JavaTokenParsers extends RegexParsers { */ def decimalNumber: Parser[String] = """(\d+(\.\d*)?|\d*\.\d+)""".r + /** Double quotes (`"`) enclosing a sequence of: * * - Any character except double quotes, control characters or backslash (`\`) @@ -56,6 +58,7 @@ trait JavaTokenParsers extends RegexParsers { @migration("`stringLiteral` allows escaping single and double quotes, but not forward slashes any longer.", "2.10.0") def stringLiteral: Parser[String] = ("\""+"""([^"\x00-\x1F\x7F\\]|\\[\\'"bfnrt]|\\u[a-fA-F0-9]{4})*"""+"\"").r + /** A number following the rules of `decimalNumber`, with the following * optional additions: * From a896f01f954b6cbd972e7062348df314bf77825a Mon Sep 17 00:00:00 2001 From: Philippus Date: Fri, 12 Apr 2019 18:29:52 +0200 Subject: [PATCH 05/12] Use isEmpty --- .../scala/scala/util/parsing/combinator/PackratParsers.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala b/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala index 55e11188..17e5f893 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/PackratParsers.scala @@ -162,7 +162,7 @@ trait PackratParsers extends Parsers { case None => /*no heads*/ cached case Some(h@Head(hp, involved, evalSet)) => { //heads found - if(cached == None && !(hp::involved contains p)) { + if(cached.isEmpty && !(hp::involved contains p)) { //Nothing in the cache, and p is not involved return Some(MemoEntry(Right(Failure("dummy ",in)))) } @@ -187,7 +187,7 @@ trait PackratParsers extends Parsers { * the current parser again */ private def setupLR(p: Parser[_], in: PackratReader[_], recDetect: LR): Unit = { - if(recDetect.head == None) recDetect.head = Some(Head(p, Nil, Nil)) + if(recDetect.head.isEmpty) recDetect.head = Some(Head(p, Nil, Nil)) in.lrStack.takeWhile(_.rule != p).foreach {x => x.head = recDetect.head From 5b02764a9068df518eaf4a4b35b03fc48e43e96b Mon Sep 17 00:00:00 2001 From: Philippus Date: Sat, 13 Apr 2019 09:11:00 +0200 Subject: [PATCH 06/12] Rewrite to !contains-construct --- .../scala/scala/util/parsing/combinator/lexical/Lexical.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/main/scala/scala/util/parsing/combinator/lexical/Lexical.scala b/shared/src/main/scala/scala/util/parsing/combinator/lexical/Lexical.scala index fdee2b3b..8290295b 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/lexical/Lexical.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/lexical/Lexical.scala @@ -35,7 +35,7 @@ abstract class Lexical extends Scanners with Tokens { def digit = elem("digit", _.isDigit) /** A character-parser that matches any character except the ones given in `cs` (and returns it).*/ - def chrExcept(cs: Char*) = elem("", ch => (cs forall (ch != _))) + def chrExcept(cs: Char*) = elem("", ch => !cs.contains(ch)) /** A character-parser that matches a white-space character (and returns it).*/ def whitespaceChar = elem("space char", ch => ch <= ' ' && ch != EofCh) From 162c86d90062ba5bd6d56d9795fdbbd50cffb6d8 Mon Sep 17 00:00:00 2001 From: Philippus Date: Sat, 13 Apr 2019 09:11:36 +0200 Subject: [PATCH 07/12] Remove parens --- .../scala/scala/util/parsing/combinator/lexical/Scanners.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared/src/main/scala/scala/util/parsing/combinator/lexical/Scanners.scala b/shared/src/main/scala/scala/util/parsing/combinator/lexical/Scanners.scala index 8b75f9fa..5e37e778 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/lexical/Scanners.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/lexical/Scanners.scala @@ -45,7 +45,7 @@ trait Scanners extends Parsers { */ class Scanner(in: Reader[Char]) extends Reader[Token] { /** Convenience constructor (makes a character reader out of the given string) */ - def this(in: String) = this(new CharArrayReader(in.toCharArray())) + def this(in: String) = this(new CharArrayReader(in.toCharArray)) private val (tok, rest1, rest2) = whitespace(in) match { case Success(_, in1) => token(in1) match { @@ -64,4 +64,3 @@ trait Scanners extends Parsers { def atEnd = in.atEnd || (whitespace(in) match { case Success(_, in1) => in1.atEnd case _ => false }) } } - From 6ba2e4f693953c8eab8240c76757e3cac44990b5 Mon Sep 17 00:00:00 2001 From: Philippus Date: Sat, 13 Apr 2019 09:11:54 +0200 Subject: [PATCH 08/12] Use string interpolation --- .../main/scala/scala/util/parsing/combinator/token/Tokens.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/main/scala/scala/util/parsing/combinator/token/Tokens.scala b/shared/src/main/scala/scala/util/parsing/combinator/token/Tokens.scala index 252a6496..4d89a867 100644 --- a/shared/src/main/scala/scala/util/parsing/combinator/token/Tokens.scala +++ b/shared/src/main/scala/scala/util/parsing/combinator/token/Tokens.scala @@ -34,7 +34,7 @@ trait Tokens { * errors detected during lexical analysis */ case class ErrorToken(msg: String) extends Token { - def chars = "*** error: "+msg + def chars = s"*** error: $msg" } /** A class for end-of-file tokens */ From a4704e7f7000aa8d31c63f7b0a3fe02f72ef1def Mon Sep 17 00:00:00 2001 From: Philippus Date: Sat, 13 Apr 2019 09:15:07 +0200 Subject: [PATCH 09/12] Prefix java.util.AbstractMap --- .../scala/util/parsing/input/PositionCache.scala | 14 +++++++------- .../scala/util/parsing/input/PositionCache.scala | 4 +--- .../scala/util/parsing/input/PositionCache.scala | 14 +++++++------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/js/src/main/scala/scala/util/parsing/input/PositionCache.scala b/js/src/main/scala/scala/util/parsing/input/PositionCache.scala index 912f10bf..35aedb66 100644 --- a/js/src/main/scala/scala/util/parsing/input/PositionCache.scala +++ b/js/src/main/scala/scala/util/parsing/input/PositionCache.scala @@ -12,14 +12,14 @@ package scala.util.parsing.input -import java.util.{AbstractMap, Collections} +import java.util.Collections private[input] trait PositionCache { - private[input] lazy val indexCache: java.util.Map[CharSequence,Array[Int]] = new AbstractMap[CharSequence, Array[Int]] { + private[input] lazy val indexCache: java.util.Map[CharSequence,Array[Int]] = + new java.util.AbstractMap[CharSequence, Array[Int]] { + override def entrySet() = Collections.emptySet() - override def entrySet() = Collections.emptySet() - - // the /dev/null of Maps - override def put(ch: CharSequence, a: Array[Int]) = null - } + // the /dev/null of Maps + override def put(ch: CharSequence, a: Array[Int]) = null + } } diff --git a/jvm/src/main/scala/scala/util/parsing/input/PositionCache.scala b/jvm/src/main/scala/scala/util/parsing/input/PositionCache.scala index 80d6e700..eef4b8ac 100644 --- a/jvm/src/main/scala/scala/util/parsing/input/PositionCache.scala +++ b/jvm/src/main/scala/scala/util/parsing/input/PositionCache.scala @@ -12,8 +12,6 @@ package scala.util.parsing.input -import java.util.WeakHashMap - /** * @author Tomáš Janoušek */ @@ -21,7 +19,7 @@ private[input] trait PositionCache { private lazy val indexCacheTL = // not DynamicVariable as that would share the map from parent to child :-( new ThreadLocal[java.util.Map[CharSequence, Array[Int]]] { - override def initialValue = new WeakHashMap[CharSequence, Array[Int]] + override def initialValue = new java.util.WeakHashMap[CharSequence, Array[Int]] } private[input] def indexCache = indexCacheTL.get diff --git a/native/src/main/scala/scala/util/parsing/input/PositionCache.scala b/native/src/main/scala/scala/util/parsing/input/PositionCache.scala index 102f87ff..818ab84f 100644 --- a/native/src/main/scala/scala/util/parsing/input/PositionCache.scala +++ b/native/src/main/scala/scala/util/parsing/input/PositionCache.scala @@ -13,14 +13,14 @@ package scala.util.parsing.input import java.lang.CharSequence -import java.util.{AbstractMap, Collections} +import java.util.Collections private[input] trait PositionCache { - private[input] lazy val indexCache: java.util.Map[CharSequence,Array[Int]] = new AbstractMap[CharSequence, Array[Int]] { + private[input] lazy val indexCache: java.util.Map[CharSequence,Array[Int]] = + new java.util.AbstractMap[CharSequence, Array[Int]] { + override def entrySet() = Collections.emptySet() - override def entrySet() = Collections.emptySet() - - // the /dev/null of Maps - override def put(ch: CharSequence, a: Array[Int]) = null - } + // the /dev/null of Maps + override def put(ch: CharSequence, a: Array[Int]) = null + } } From 165ca500d36b63e55426b3f04f2eb170075d2f55 Mon Sep 17 00:00:00 2001 From: Philippus Date: Sat, 13 Apr 2019 09:43:51 +0200 Subject: [PATCH 10/12] Use type-safe scope configuration --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index d7730dc5..32365556 100644 --- a/build.sbt +++ b/build.sbt @@ -41,8 +41,8 @@ lazy val `scala-parser-combinators` = crossProject(JSPlatform, JVMPlatform, Nati ). jvmSettings( OsgiKeys.exportPackage := Seq(s"scala.util.parsing.*;version=${version.value}"), - libraryDependencies += "junit" % "junit" % "4.12" % "test", - libraryDependencies += "com.novocode" % "junit-interface" % "0.11" % "test" + libraryDependencies += "junit" % "junit" % "4.12" % Test, + libraryDependencies += "com.novocode" % "junit-interface" % "0.11" % Test ). jsSettings( // Scala.js cannot run forked tests From ad679d860cdf004bb5412db1c153b76b1e7db197 Mon Sep 17 00:00:00 2001 From: Philippus Date: Sun, 14 Apr 2019 11:18:38 +0200 Subject: [PATCH 11/12] Move `.`s to the next lines --- build.sbt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/build.sbt b/build.sbt index 32365556..543a6173 100644 --- a/build.sbt +++ b/build.sbt @@ -7,11 +7,11 @@ lazy val root = project.in(file(".")) .aggregate(`scala-parser-combinatorsJS`, `scala-parser-combinatorsJVM`, `scala-parser-combinatorsNative`) .settings(disablePublishing) -lazy val `scala-parser-combinators` = crossProject(JSPlatform, JVMPlatform, NativePlatform). - withoutSuffixFor(JVMPlatform).in(file(".")). - settings(scalaModuleSettings: _*). - jvmSettings(scalaModuleSettingsJVM). - settings( +lazy val `scala-parser-combinators` = crossProject(JSPlatform, JVMPlatform, NativePlatform) + .withoutSuffixFor(JVMPlatform).in(file(".")) + .settings(scalaModuleSettings: _*) + .jvmSettings(scalaModuleSettingsJVM) + .settings( name := "scala-parser-combinators", version := "1.2.0-SNAPSHOT", mimaPreviousVersion := None, @@ -38,18 +38,18 @@ lazy val `scala-parser-combinators` = crossProject(JSPlatform, JVMPlatform, Nati } } } - ). - jvmSettings( + ) + .jvmSettings( OsgiKeys.exportPackage := Seq(s"scala.util.parsing.*;version=${version.value}"), libraryDependencies += "junit" % "junit" % "4.12" % Test, libraryDependencies += "com.novocode" % "junit-interface" % "0.11" % Test - ). - jsSettings( + ) + .jsSettings( // Scala.js cannot run forked tests fork in Test := false - ). - jsConfigure(_.enablePlugins(ScalaJSJUnitPlugin)). - nativeSettings( + ) + .jsConfigure(_.enablePlugins(ScalaJSJUnitPlugin)) + .nativeSettings( skip in compile := System.getProperty("java.version").startsWith("1.6") || !scalaVersion.value.startsWith("2.11"), test := {}, libraryDependencies := { From 4cbf03932000632df719e2c5eae7039fd1aa0bf9 Mon Sep 17 00:00:00 2001 From: Philippus Date: Sun, 14 Apr 2019 11:32:16 +0200 Subject: [PATCH 12/12] Update readme --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0e559f01..4e7145ea 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,13 @@ -# scala-parser-combinators [](https://travis-ci.org/scala/scala-parser-combinators) [](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-parser-combinators_2.11) [](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-parser-combinators_2.12) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/scala/scala-parser-combinators) +# scala-parser-combinators + +[](https://travis-ci.org/scala/scala-parser-combinators) +[](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-parser-combinators_2.11) +[](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-parser-combinators_2.12) +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/scala/scala-parser-combinators) ### Scala Standard Parser Combinator Library -This library is now community-maintained. If you are interested in helping please contact @gourlaysama or mention it [on Gitter](https://gitter.im/scala/scala-parser-combinators). +This library is now community-maintained. If you are interested in helping please contact [@gourlaysama](https://github.com/gourlaysama) or [@Philippus](https://github.com/philippus) or mention it on [Gitter](https://gitter.im/scala/scala-parser-combinators). As of Scala 2.11, this library is a separate jar that can be omitted from Scala projects that do not use Parser Combinators.