diff options
author | Lukas Rytz <lukas.rytz@epfl.ch> | 2008-08-12 11:00:53 +0000 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@epfl.ch> | 2008-08-12 11:00:53 +0000 |
commit | 13fddf993cb528a32a29e28986630462f5a5fcd5 (patch) | |
tree | 9b004f47bd3c50cf6859017ee81deec9cc0dc5a2 | |
parent | 4f81ca5702998dd1e2a5bf8adce9df655b43fab9 (diff) | |
download | scala-13fddf993cb528a32a29e28986630462f5a5fcd5.tar.gz scala-13fddf993cb528a32a29e28986630462f5a5fcd5.tar.bz2 scala-13fddf993cb528a32a29e28986630462f5a5fcd5.zip |
json parser builds on jvm14.
-rw-r--r-- | build.xml | 35 | ||||
-rw-r--r-- | src/build/pack.xml | 30 | ||||
-rw-r--r-- | src/jvm14-library/scala/util/parsing/json/JSON.scala | 95 | ||||
-rw-r--r-- | src/jvm14-library/scala/util/parsing/json/Parser.scala | 50 |
4 files changed, 192 insertions, 18 deletions
@@ -900,7 +900,28 @@ DOCUMENTATION <touch file="${build-docs.dir}/manual.complete" verbose="no"/> </target> - <target name="docs.pre-comp" depends="docs.man"> + <target name="docs.pre-swing" depends="docs.man"> + <uptodate property="docs.swing.available" targetfile="${build-docs.dir}/swing.complete"> + <srcfiles dir="${src.dir}/swing"/> + </uptodate> + </target> + + <target name="docs.swing" depends="docs.pre-swing" unless="docs.swing.available"> + <stopwatch name="docs.swing.timer"/> + <mkdir dir="${build-docs.dir}/swing"/> + <scaladoc + destdir="${build-docs.dir}/swing" + windowtitle="Scala Swing Library" + doctitle="Scala Swing ${version.number} API" + classpathref="pack.classpath" + srcdir="${src.dir}/swing"> + <include name="**/*.scala"/> + </scaladoc> + <touch file="${build-docs.dir}/swing.complete" verbose="no"/> + <stopwatch name="docs.swing.timer" action="total"/> + </target> + + <target name="docs.pre-comp" depends="docs.swing"> <uptodate property="docs.comp.available" targetfile="${build-docs.dir}/compiler.complete"> <srcfiles dir="${src.dir}/compiler"/> </uptodate> @@ -920,8 +941,8 @@ DOCUMENTATION <touch file="${build-docs.dir}/compiler.complete" verbose="no"/> <stopwatch name="docs.comp.timer" action="total"/> </target> - - <target name="docs.done" depends="docs.man"/> + + <target name="docs.done" depends="docs.swing"/> <target name="docs.clean"> <delete dir="${build-docs.dir}" includeemptydirs="yes" quiet="yes" failonerror="no"/> @@ -1012,6 +1033,12 @@ DISTRIBUTION <copy toDir="${dist.dir}/doc/scala/tools"> <fileset dir="${build-docs.dir}/manual/html"/> </copy> + <mkdir dir="${dist.dir}/doc/scala/swing"/> + <copy file="${src.dir}/swing/doc/README" toDir="${dist.dir}/doc/scala/swing"/> + <mkdir dir="${dist.dir}/doc/scala/swing/api"/> + <copy toDir="${dist.dir}/doc/scala/swing/api"> + <fileset dir="${build-docs.dir}/swing"/> + </copy> </target> <target name="dist.man" depends="dist.doc"> @@ -1139,6 +1166,8 @@ FORWARDED TARGETS FOR PACKAGING <ant antfile="${src.dir}/build/pack.xml" target="msilpack-all.done" inheritall="yes" inheritrefs="yes"/> </target> + <target name="alldistpack" depends="distpack, fourdistpack, msildistpack"/> + <!-- =========================================================================== FORWARDED TARGETS FOR NIGHTLY BUILDS ============================================================================ --> 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 +} + |