Guest User

Untitled

a guest
Jul 19th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. import scala.util.parsing.combinator._
  2.  
  3. object Termination extends Enumeration {
  4. type Termination = Value
  5. val white, black, draw = Value
  6. }
  7. import Termination._
  8.  
  9. case class Game(tags: List[Tag], moves:List[MoveElement], termination: Termination)
  10. case class Tag(name: String, value: String)
  11. case class MoveElement(move: SAN, comment: String)
  12. case class SAN(value: String)
  13.  
  14. class PGNParser extends JavaTokenParsers with ImplicitConversions {
  15.  
  16. def moveNumberParser: Parser[Int] = ("""\d+""".r <~ """\.+""".r) ^^ (_.toInt)
  17.  
  18. def tagSectionToken: Parser[List[Tag]] =
  19. (tagPairParser +) ^^ (List() ++ _)
  20.  
  21. def tagPairParser: Parser[Tag] = {
  22. def toTag(name: String, value: String): Tag = Tag(name, value)
  23. "[" ~> ident ~ stringLiteral <~ "]" ^^ toTag
  24. }
  25.  
  26. def gameTerminationParser: Parser[Termination] = {
  27. def toGameTermination (t: String): Termination = {
  28. t match {
  29. case "0-1" => black
  30. case "1-0" => white
  31. case "1/2-1/2" => draw
  32. }
  33. }
  34. ("0-1" | "1-0" | "1/2-1/2") ^^ toGameTermination
  35. }
  36.  
  37. def moveTextSectionParser: Parser[List[MoveElement]] =
  38. (elementParser +) ^^ (List() ++ _)
  39.  
  40. def elementParser: Parser[MoveElement] = {
  41. def toMoveElement(move: SAN, comment: Option[String]): MoveElement =
  42. MoveElement(move, comment.getOrElse(null))
  43. (moveNumberParser ?) ~> sanMoveParser ~ (commentParser ?) ^^ toMoveElement
  44. }
  45.  
  46. def commentParser: Parser[String] = "\\{.*\\}".r
  47.  
  48. def sanMoveParser: Parser[SAN] = {
  49. ((pawnMoveWithPromotionParser |
  50. pawnCaptureWithPromotionParser |
  51. pawnMoveParser |
  52. pawnCaptureParser |
  53. pieceMoveParser |
  54. pieceCaptureParser |
  55. castelingParser ) <~ """[+#]?""".r) ^^ (SAN(_))
  56. }
  57.  
  58. def pawnMoveParser: Parser[String] = """[a-h][1-8]""".r
  59. def pawnCaptureParser: Parser[String] = """[a-h]x[a-h][1-8]""".r
  60. def pieceMoveParser: Parser[String] = """[KQBNR][a-h]?[1-8]?[a-h][1-8]""".r
  61. def pieceCaptureParser: Parser[String] = """[KQBNR][a-h]?[1-8]?x[a-h][1-8]""".r
  62. def pawnMoveWithPromotionParser: Parser[String] = """[a-h][18]=[QBNR]""".r
  63. def pawnCaptureWithPromotionParser: Parser[String] = """[a-h]x[a-h][18]=[QBNR]""".r
  64. def castelingParser: Parser[String] = """O-O-O""" | """O-O"""
  65.  
  66. def gameParser: Parser[Game] = {
  67. def toGame(tags: List[Tag], moves: List[MoveElement], termination: Termination) = Game(tags, moves, termination)
  68. (tagSectionToken ~ moveTextSectionParser ~ gameTerminationParser) ^^ toGame
  69. }
  70.  
  71. def value: Parser[List[Game]] = (gameParser +) ^^ (List() ++ _)
  72. }
Add Comment
Please, Sign In to add comment