Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.slartibartfass.mug.parser
- import scala.util.parsing.combinator.RegexParsers
- class TUGONParser extends RegexParsers {
- def stringLiteral: Parser[String] = ("\"" + """([^"\p{Cntrl}\\]|\\[\\'"bfnrt]|\\u[a-fA-F0-9]{4})*+""" + "\"").r ^^ (_.replace("\"", ""))
- def decimalNumber: Parser[Double] = """-?(\d+(\.\d*)?|\d*\.\d+)""".r ^^ (_.toDouble)
- def vector: Parser[(Double, Double, Double)] =
- "<" ~> decimalNumber ~ "," ~ decimalNumber ~ "," ~ decimalNumber <~ ">" ^^ {
- case x ~ "," ~ y ~ "," ~ z => (x, y, z)
- }
- def quaternion: Parser[(Double, Double, Double, Double)] =
- "[" ~> (decimalNumber ~ "," ~ decimalNumber ~ "," ~ decimalNumber ~ "," ~ decimalNumber) <~ "]" ^^ {
- case a ~ "," ~ b ~ "," ~ c ~ "," ~ d => (a, b, c, d)
- }
- def key: Parser[String] = stringLiteral | """[A-Za-z0-9]+""".r
- def value: Parser[Any] = stringLiteral | decimalNumber | vector | quaternion
- def member: Parser[(String, Any)] = key ~ opt("=") ~ opt(value) ^^ {
- case key ~ None ~ None => (key, null)
- case key ~ Some("=") ~ Some(value) => (key, value)
- }
- def section: Parser[(String, Map[String, Any])] =
- """([A-Za-z0-9]+\s*)+""".r ~ ("{" ~> rep(section | member) <~ "}") ^^ {
- case key ~ value => (key, Map() ++ value)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement