2 个版本
0.2.2 | 2023年11月15日 |
---|---|
0.2.1 | 2023年11月15日 |
#12 in #pgn
17KB
230 行
棋类游戏PGN解析器
概述
这是一个用Rust编写的简单PGN(可移植游戏表示法)解析器,用于棋类游戏。它允许您解析PGN文件并提取关于棋类游戏的信息。
库
https://crates.io/crates/pgn_parser
用法
命令行界面(CLI)
PGN解析器附带一个CLI,提供以下子命令
帮助
显示PGN解析器CLI的帮助信息
pgn_parser help
解析
解析PGN文件并输出游戏信息。此子命令需要两个参数
-i 或 --input:指定输入文件。-o 或 --output:指定解析信息的输出文件。
pgn_parser parse -i input.txt -o output.txt
如果您未使用 -o 或 --output 选项指定输出文件,则游戏信息将直接写入您的命令行界面(CLI)。
语法
表示由方括号括起来的元数据块,由两个相邻的双引号括起来的单词组成。
metadata_block = { "[" ~ word ~ "\"" ~ word ~ "\"]" }
表示一个不是 "]" 或 """(双引号)的字符序列,允许除这些字符之外的任何字符。它捕获一个或多个字符。
word = { (!("]" | "\"") ~ ANY)+ }
表示从 'a' 到 'h' 的字符,表示棋盘的文件。
files = { 'a'..'h' }
表示从 '1' 到 '8' 的字符,表示棋盘的排。
ranks = { '1' .. '8' }
表示一个位于花括号中的移动注释。它捕获除 '}'(闭合花括号)之外的任何字符。
move_comment = { "{" ~ (!("}") ~ ANY)* ~ "}" }
表示一个棋子缩写:"K"(国王)、"Q"(王后)、"R"(车)、"B"(主教)或 "N"(骑士)。它是可选的。
piece = { ("K" | "Q" | "R" | "B" | "N")? }
表示一个王车易位:"O-O-O"(后翼易位)或 "O-O"(王翼易位)。
castle = { ("O-O-O" | "O-O") }
表示一个棋子移动
move_piece_with_capture = { piece ~ (files)? ~ "x" ~ files ~ ranks }
move_piece_without_capture = { piece ~ (files){1,2} ~ ranks }
move_piece = { (move_piece_with_capture | move_piece_without_capture)}
complete_move = { (move_piece | castle) ~ ("+" | "#")? }
表示一个棋子移动的成对表示法,包括移动编号和可选的移动注释。
move_pair = { (ASCII_DIGIT)+ ~ "." ~ complete_move ~ move_comment? ~ complete_move? ~ move_comment? }
表示一系列移动成对。
move_list = { (move_pair)+ }
表示一个棋局的结果,可以是 "1/2-1/2"(平局)、"1-0"(白方获胜)或 "0-1"(黑方获胜)。
game_result = { "1/2-1/2" | "1-0" | "0-1"
表示一个完整的棋局,从输入的开始(SOI)开始,后面跟着可选的元数据块、移动列表、游戏结果和输入的结束(EOI)。
game = { SOI ~ (metadata_block)* ~ move_list ~ game_result ~ EOI}
示例
输入示例
[Event "Rated Blitz game"]
[Site "https://lichess.org/GI7wh3rQ"]
[Date "2023.11.13"]
[White "Ilya_Sh"]
[Black "Jlquilo"]
[Result "1-0"]
[UTCDate "2023.11.13"]
[UTCTime "14:26:46"]
[WhiteElo "1886"]
[BlackElo "1886"]
[WhiteRatingDiff "+6"]
[BlackRatingDiff "-6"]
[Variant "Standard"]
[TimeControl "180+0"]
[ECO "B01"]
[Opening "Scandinavian Defense: Valencian Variation"]
[Termination "Normal"]
[Annotator "lichess.org"]
1. e4 d5 2. exd5 Qxd5 3. Nc3 Qd8 { B01 Scandinavian Defense: Valencian Variation } 4. d4 e6 5. Nf3 c6 6. Bd3 Be7 7. O-O b5 8. a3 a5 9. Ne4 Ba6 10. Nc5 Bc8 11. Re1 Nf6 12. Bg5 O-O 13. c3 Na6 14. Nxa6 Bxa6 15. Qc2 h6 16. Bxf6 Bxf6 17. Ne5 Qc7 18. Re3 Rfc8 19. Rh3 Bxe5 20. dxe5 Qxe5 21. g4 c5 22. Be4 Rab8 23. Rg3 Qg5 24. Kg2 b4 25. h4 Qxh4 26. g5 h5 27. Rh1 Qf4 28. Rxh5 Bb7 29. Bxb7 Rxb7 30. Qh7+ Kf8 31. Qh8+ Ke7 32. Qxc8 Qe4+ 33. Kh2 Rd7 34. Qxc5+ { Black resigns. } 1-0
输出
Game Metadata
Event: Rated Blitz game
Site: https://lichess.org/GI7wh3rQ
Date: 2023.11.13
White: Ilya_Sh
Black: Jlquilo
Result: 1-0
UTCDate: 2023.11.13
UTCTime: 14:26:46
WhiteElo: 1886
BlackElo: 1886
WhiteRatingDiff: +6
BlackRatingDiff: -6
Variant: Standard
TimeControl: 180+0
ECO: B01
Opening: Scandinavian Defense: Valencian Variation
Termination: Normal
Annotator: lichess.org
List of moves
Move #1
White: e4 Black: d5
Move #2
White: exd5 Black: Qxd5
Move #3
White: Nc3 Black: Qd8 { B01 Scandinavian Defense: Valencian Variation }
Move #4
White: d4 Black: e6
Move #5
White: Nf3 Black: c6
Move #6
White: Bd3 Black: Be7
Move #7
White: O-O Black: b5
Move #8
White: a3 Black: a5
Move #9
White: Ne4 Black: Ba6
Move #10
White: Nc5 Black: Bc8
Move #11
White: Re1 Black: Nf6
Move #12
White: Bg5 Black: O-O
Move #13
White: c3 Black: Na6
Move #14
White: Nxa6 Black: Bxa6
Move #15
White: Qc2 Black: h6
Move #16
White: Bxf6 Black: Bxf6
Move #17
White: Ne5 Black: Qc7
Move #18
White: Re3 Black: Rfc8
Move #19
White: Rh3 Black: Bxe5
Move #20
White: dxe5 Black: Qxe5
Move #21
White: g4 Black: c5
Move #22
White: Be4 Black: Rab8
Move #23
White: Rg3 Black: Qg5
Move #24
White: Kg2 Black: b4
Move #25
White: h4 Black: Qxh4
Move #26
White: g5 Black: h5
Move #27
White: Rh1 Black: Qf4
Move #28
White: Rxh5 Black: Bb7
Move #29
White: Bxb7 Black: Rxb7
Move #30
White: Qh7+ Black: Kf8
Move #31
White: Qh8+ Black: Ke7
Move #32
White: Qxc8 Black: Qe4+
Move #33
White: Kh2 Black: Rd7
Move #34
White: Qxc5+ { Black resigns. } Black:
Game Result
1-0
依赖项
~4MB
~76K SLoC