#chess #pgn #parser #information #notation #extract #portable

bin+lib pgn_parser

这是一个用Rust编写的简单PGN(可移植游戏表示法)解析器,用于棋类游戏。它允许您解析PGN文件并提取关于棋类游戏的信息。

2 个版本

0.2.2 2023年11月15日
0.2.1 2023年11月15日

#12 in #pgn

MIT 许可证

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