ATuin

Json Parser

Dec 29th, 2011
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.89 KB | None | 0 0
  1. package org.logikujo.atuin.Json
  2.  
  3. import org.parboiled.scala._
  4. import org.parboiled.support._
  5. import org.parboiled.scala.parserunners.ReportingParseRunner
  6.  
  7. class JsonParser extends Parser {
  8.   def Json: Rule0  = rule {
  9.     WhiteSpace ~ ArrayJson |
  10.     WhiteSpace ~ ObjectJson }
  11.  
  12.   def ArrayJson: Rule0 = rule {
  13.     WhiteSpace ~ "[" ~ WhiteSpace ~
  14.     zeroOrMore(ValueJson, separator = WhiteSpace ~ "," ~ WhiteSpace) ~
  15.     WhiteSpace ~ "]"}
  16.  
  17.   def ObjectJson = rule {
  18.     WhiteSpace ~ "{" ~ WhiteSpace ~
  19.     zeroOrMore(Pair, separator = WhiteSpace ~ "," ~ WhiteSpace) ~
  20.     WhiteSpace ~ "}"}
  21.  
  22.   def Pair = rule {
  23.     StringJson ~ WhiteSpace ~
  24.     ":" ~
  25.     WhiteSpace ~ ValueJson
  26.   }
  27.  
  28.   def StringJson = rule { "\"" ~ zeroOrMore(Char) ~ "\""}
  29.  
  30.   def Char = { EscapedChar | NormalChar}
  31.  
  32.   def EscapedChar = { "\\" ~ anyOf("\"\\/bfnrt") | Unicode }
  33.  
  34.   def Unicode = { "\\u" ~ nTimes(4, HexDigit)}
  35.  
  36.   def HexDigit = {"0" - "9" | "a" - "f" | "A" - "F"}
  37.  
  38.   def NormalChar = {!anyOf("\"\\") ~ ANY}
  39.  
  40.   def ValueJson:Rule0 = {StringJson | IntegerJson | ObjectJson | ArrayJson |
  41.     ignoreCase("true") | ignoreCase("false") | ignoreCase("null")}
  42.  
  43.   def IntegerJson = rule {
  44.     optional(anyOf("+-")) ~
  45.     DigitsJson ~
  46.     optional((FractionJson ~ optional(ExponentJson)) |
  47.       ExponentJson)}
  48.  
  49.   def DigitsJson = rule {oneOrMore("0" - "9")}
  50.  
  51.   def FractionJson = rule {"." ~ DigitsJson}
  52.  
  53.   def ExponentJson = rule {ignoreCase('e') ~ optional(anyOf("+-")) ~ DigitsJson}
  54.  
  55.   def Separator = rule {zeroOrMore(WhiteSpace) ~ "," ~ zeroOrMore(WhiteSpace)}
  56.  
  57.   def WhiteSpace = rule {zeroOrMore(anyOf(" \n\r\t\f")) }
  58. }
  59.  
  60. case class Json (input:String) extends JsonParser {
  61.   private lazy val parser = new JsonParser {override val buildParseTree = true}
  62.   lazy val result = ReportingParseRunner(parser.Json).run(input)
  63.  
  64.   override def toString = ParseTreeUtils.printNodeTree(result)
  65. }
Advertisement
Add Comment
Please, Sign In to add comment