Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.40 KB | None | 0 0
  1. object SExprParser {
  2. import scala.util.parsing.combinator._
  3.  
  4. sealed abstract class SExpr
  5. case class SList(list: List[SExpr]) extends SExpr
  6. case class SSym(symbol: String) extends SExpr
  7. case class SNum(num: Int) extends SExpr
  8. case class SString(string : String) extends SExpr
  9.  
  10. case class ReaderException(msg:String) extends RuntimeException(msg)
  11.  
  12. object Reader extends JavaTokenParsers {
  13.  
  14. def read(text: String): SExpr = {
  15. val result = parseAll(sexpr, text)
  16. result match {
  17. case Success(r, _) => r
  18. case Failure(msg, n) =>
  19. throw ReaderException(msg + " (input left: \"" + n.source.toString.drop(n.offset) + "\")")
  20. case Error(msg, n) =>
  21. throw ReaderException(msg + " (input left: \"" + n.source.toString.drop(n.offset) + "\")")
  22. }
  23. }
  24.  
  25. def sexpr: Parser[SExpr] = num | string | slist | symbol
  26.  
  27. def symbol: Parser[SExpr] = """[^()"\s]+""".r ^^ SSym
  28. def string : Parser[SExpr] =
  29. "\"" ~> """([^"\p{Cntrl}\\]|\\[\\'"bfnrt])*""".r <~ "\"" ^^ SString
  30. def slist: Parser[SExpr] = "(" ~> sexpr.* <~ ")" ^^ SList
  31. def num: Parser[SExpr] = wholeNumber ^^ { s => SNum(s.toInt) }
  32. }
  33.  
  34. object Printer {
  35. def print(sexpr: SExpr): String = sexpr match {
  36. case SSym(str) => str
  37. case SNum(n) => n.toString
  38. case SList(l) => "(" ++ l.map(print).mkString(", ") ++ ")"
  39. case SString(s) => "\"" + s + "\""
  40. }
  41. }
  42.  
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement