summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2008-08-12 11:00:53 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2008-08-12 11:00:53 +0000
commit13fddf993cb528a32a29e28986630462f5a5fcd5 (patch)
tree9b004f47bd3c50cf6859017ee81deec9cc0dc5a2 /src
parent4f81ca5702998dd1e2a5bf8adce9df655b43fab9 (diff)
downloadscala-13fddf993cb528a32a29e28986630462f5a5fcd5.tar.gz
scala-13fddf993cb528a32a29e28986630462f5a5fcd5.tar.bz2
scala-13fddf993cb528a32a29e28986630462f5a5fcd5.zip
json parser builds on jvm14.
Diffstat (limited to 'src')
-rw-r--r--src/build/pack.xml30
-rw-r--r--src/jvm14-library/scala/util/parsing/json/JSON.scala95
-rw-r--r--src/jvm14-library/scala/util/parsing/json/Parser.scala50
3 files changed, 160 insertions, 15 deletions
diff --git a/src/build/pack.xml b/src/build/pack.xml
index 4cf560e978..aeb1b2c971 100644
--- a/src/build/pack.xml
+++ b/src/build/pack.xml
@@ -122,7 +122,7 @@ MAIN DISTRIBUTION SBAZ
version="${version.number}"
desc="The Scala developer documentation. This contains all developer documentation."
link="${sbaz.universe}/scala-devel-docs-${version.number}.sbp">
- <docset dir="${dist.dir}/doc"/>
+ <docset dir="${dist.dir}/doc/scala"/>
</sbaz>
</target>
@@ -149,20 +149,20 @@ JAVA FOUR DISTRIBUTION PACKAGING
</target>
<target name="fourpack-archives.tar" depends="fourpack-archives.start">
- <tar destfile="${dists.dir}/archives/scala-jvm4-${version.number}.tgz" compression="gzip">
- <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-jvm4-${version.number}"
+ <tar destfile="${dists.dir}/archives/scala-${version.number}-jvm4.tgz" compression="gzip">
+ <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4"
includes="bin/**" mode="755"/>
- <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-jvm4-${version.number}"
+ <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4"
excludes="bin/**"/>
</tar>
- <checksum file="${dists.dir}/archives/scala-jvm4-${version.number}.tgz" fileext=".md5"/>
+ <checksum file="${dists.dir}/archives/scala-${version.number}-jvm4.tgz" fileext=".md5"/>
</target>
<target name="fourpack-archives.zip" depends="fourpack-archives.tar">
- <zip destfile="${dists.dir}/archives/scala-jvm4-${version.number}.zip">
- <zipfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-jvm4-${version.number}"/>
+ <zip destfile="${dists.dir}/archives/scala-${version.number}-jvm4.zip">
+ <zipfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4"/>
</zip>
- <checksum file="${dists.dir}/archives/scala-jvm4-${version.number}.zip" fileext=".md5"/>
+ <checksum file="${dists.dir}/archives/scala-${version.number}-jvm4.zip" fileext=".md5"/>
</target>
<target name="fourpack-archives.done" depends="fourpack-archives.zip"/>
@@ -178,22 +178,22 @@ MSIL DISTRIBUTION PACKAGING
</target>
<target name="msilpack-archives.tar" depends="msilpack-archives.start">
- <tar destfile="${dists.dir}/archives/scala-msil-${version.number}.tgz" compression="gzip">
- <tarfileset dir="${dists.dir}/scala-msil-${version.number}" prefix="scala-msil-${version.number}"
+ <tar destfile="${dists.dir}/archives/scala-${version.number}-msil.tgz" compression="gzip">
+ <tarfileset dir="${dists.dir}/scala-msil-${version.number}" prefix="scala-${version.number}-msil"
includes="bin/**" mode="755"/>
<!-- Inlcude only dll's. Using scala-msil depends on having a scala distribution -->
- <tarfileset dir="${dists.dir}/scala-msil-${version.number}" prefix="scala-msil-${version.number}"
+ <tarfileset dir="${dists.dir}/scala-msil-${version.number}" prefix="scala-${version.number}-msil"
includes="lib/*.dll"/>
</tar>
- <checksum file="${dists.dir}/archives/scala-msil-${version.number}.tgz" fileext=".md5"/>
+ <checksum file="${dists.dir}/archives/scala-${version.number}-msil.tgz" fileext=".md5"/>
</target>
<target name="msilpack-archives.zip" depends="msilpack-archives.tar">
- <zip destfile="${dists.dir}/archives/scala-msil-${version.number}.zip">
- <zipfileset dir="${dists.dir}/scala-msil-${version.number}" prefix="scala-msil-${version.number}"
+ <zip destfile="${dists.dir}/archives/scala-${version.number}-msil.zip">
+ <zipfileset dir="${dists.dir}/scala-msil-${version.number}" prefix="scala-${version.number}-msil"
includes="bin/**,lib/*.dll"/>
</zip>
- <checksum file="${dists.dir}/archives/scala-msil-${version.number}.zip" fileext=".md5"/>
+ <checksum file="${dists.dir}/archives/scala-${version.number}-msil.zip" fileext=".md5"/>
</target>
<target name="msilpack-archives.done" depends="msilpack-archives.zip"/>
diff --git a/src/jvm14-library/scala/util/parsing/json/JSON.scala b/src/jvm14-library/scala/util/parsing/json/JSON.scala
new file mode 100644
index 0000000000..7779832861
--- /dev/null
+++ b/src/jvm14-library/scala/util/parsing/json/JSON.scala
@@ -0,0 +1,95 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2006-2008, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+// $Id: JSON.scala 15746 2008-08-11 17:33:54Z dchenbecker $
+
+
+package scala.util.parsing.json
+
+/**
+ * This object provides a simple interface to the JSON parser class. The default conversion
+ * for numerics is into a double. If you wish to override this behavior at the global level,
+ * you can set the globalNumberParser property to your own (String => Any) function. If you only
+ * want to override at the per-thread level then you can set the perThreadNumberParser property to your
+ * function. For example:
+ *
+ * <pre>
+ * val myConversionFunc = {input : String => BigDecimal(input)}
+ *
+ * // Global override
+ * JSON.globalNumberParser = myConversionFunc
+ *
+ * // Per-thread override
+ * JSON.perThreadNumberParser = myConversionFunc
+ * </pre>
+ *
+ * @author Derek Chen-Becker <"java"+@+"chen-becker"+"."+"org">
+ */
+object JSON extends Parser {
+
+ /**
+ * Parse the given JSON string and return a list of elements. If the
+ * string is a JSON object it will be a list of pairs. If it's a JSON
+ * array it will be be a list of individual elements.
+ *
+ * @param input the given JSON string.
+ * @return an optional list of of elements.
+ */
+ def parse(input: String): Option[List[Any]] =
+ phrase(root)(new lexical.Scanner(input)) match {
+ case Success(result, _) => Some(result)
+ case _ => None
+ }
+
+ /**
+ * Parse the given JSON string and return either a <code>List[Any]</code>
+ * if the JSON string specifies an <code>Array</code>, or a
+ * <code>Map[String,Any]</code> if the JSON string specifies an object.
+ *
+ * @param input the given JSON string.
+ * @return an optional list or map.
+ */
+ def parseFull(input: String): Option[Any] =
+ parse(input) match {
+ case Some(data) => Some(resolveType(data))
+ case None => None
+ }
+
+ /**
+ * A utility method to resolve a parsed JSON list into objects or
+ * arrays. See the parse method for details.
+ */
+ def resolveType(input: List[_]): Any = {
+ var objMap = Map[String, Any]()
+
+ if (input.forall {
+ case (key: String, value: List[_]) =>
+ objMap += (key -> resolveType(value))
+ true
+ case (key : String, value : Any) =>
+ objMap += (key -> value)
+ true
+ case _ => false
+ }) objMap
+ else
+ input
+ }
+
+ /**
+ * The global (VM) default function for converting a string to a numeric value.
+ */
+ def globalNumberParser_=(f: NumericParser) { defaultNumberParser = f }
+ def globalNumberParser : NumericParser = defaultNumberParser
+
+ /**
+ * Defines the function used to convert a numeric string literal into a numeric format on a per-thread
+ * basis. Use globalNumberParser for a global override
+ */
+ def perThreadNumberParser_=(f : NumericParser) { numberParser.set(f) }
+ def perThreadNumberParser : NumericParser = numberParser.get().asInstanceOf[NumericParser] // cast for jvm 1.4
+}
diff --git a/src/jvm14-library/scala/util/parsing/json/Parser.scala b/src/jvm14-library/scala/util/parsing/json/Parser.scala
new file mode 100644
index 0000000000..28581ef6d6
--- /dev/null
+++ b/src/jvm14-library/scala/util/parsing/json/Parser.scala
@@ -0,0 +1,50 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2006-2007, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+// $Id: Parser.scala 15746 2008-08-11 17:33:54Z dchenbecker $
+
+
+package scala.util.parsing.json
+
+import scala.util.parsing.combinator._
+import scala.util.parsing.combinator.syntactical._
+import scala.util.parsing.combinator.lexical._
+
+/**
+ * @author Derek Chen-Becker <"java"+@+"chen-becker"+"."+"org">
+ */
+class Parser extends StdTokenParsers with ImplicitConversions {
+ // Fill in abstract defs
+ type Tokens = Lexer
+ val lexical = new Tokens
+
+ // Configure lexical parsing
+ lexical.reserved ++= List("true", "false", "null")
+ lexical.delimiters ++= List("{", "}", "[", "]", ":", ",")
+
+ /** Type signature for functions that can parse numeric literals */
+ type NumericParser = String => Any
+
+ // Global default number parsing function
+ protected var defaultNumberParser : NumericParser = {_.toDouble}
+
+ // Per-thread default number parsing function
+ protected val numberParser = new ThreadLocal[NumericParser]() {
+ override def initialValue() = defaultNumberParser
+ }
+
+ // Define the grammar
+ def root = jsonObj | jsonArray
+ def jsonObj = "{" ~> repsep(objEntry, ",") <~ "}"
+ def jsonArray = "[" ~> repsep(value, ",") <~ "]"
+ def objEntry = stringVal ~ (":" ~> value) ^^ { case x ~ y => (x, y) }
+ def value: Parser[Any] = (jsonObj | jsonArray | number | "true" ^^^ true | "false" ^^^ false | "null" ^^^ null | stringVal)
+ def stringVal = accept("string", { case lexical.StringLit(n) => n} )
+ def number = accept("number", { case lexical.NumericLit(n) => numberParser.get.asInstanceOf[NumericParser].apply(n)} ) // cast for jvm 1.4
+}
+