Advertisement
Guest User

TUGON Parser

a guest
Sep 12th, 2014
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.28 KB | None | 0 0
  1. package net.slartibartfass.mug.parser
  2.  
  3. import scala.util.parsing.combinator.RegexParsers
  4.  
  5. class TUGONParser extends RegexParsers {
  6.  
  7.   def stringLiteral: Parser[String] = ("\"" + """([^"\p{Cntrl}\\]|\\[\\'"bfnrt]|\\u[a-fA-F0-9]{4})*+""" + "\"").r ^^ (_.replace("\"", ""))
  8.  
  9.  def decimalNumber: Parser[Double] = """-?(\d+(\.\d*)?|\d*\.\d+)""".r ^^ (_.toDouble)
  10.  
  11.  def vector: Parser[(Double, Double, Double)] =
  12.    "<" ~> decimalNumber ~ "," ~ decimalNumber ~ "," ~ decimalNumber <~ ">" ^^ {
  13.      case x ~ "," ~ y ~ "," ~ z => (x, y, z)
  14.    }
  15.  
  16.  def quaternion: Parser[(Double, Double, Double, Double)] =
  17.    "[" ~> (decimalNumber ~ "," ~ decimalNumber ~ "," ~ decimalNumber ~ "," ~ decimalNumber) <~ "]" ^^ {
  18.      case a ~ "," ~ b ~ "," ~ c ~ "," ~ d => (a, b, c, d)
  19.    }
  20.  
  21.  def key: Parser[String] = stringLiteral | """[A-Za-z0-9]+""".r
  22.  
  23.  def value: Parser[Any] = stringLiteral | decimalNumber | vector | quaternion
  24.  
  25.  def member: Parser[(String, Any)] = key ~ opt("=") ~ opt(value) ^^ {
  26.    case key ~ None ~ None => (key, null)
  27.    case key ~ Some("=") ~ Some(value) => (key, value)
  28.  }
  29.  
  30.  def section: Parser[(String, Map[String, Any])] =
  31.    """([A-Za-z0-9]+\s*)+""".r ~ ("{" ~> rep(section | member) <~ "}") ^^ {
  32.      case key ~ value => (key, Map() ++ value)
  33.    }
  34.  
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement