17#ifndef HOOVER_CHESS_UTILS__PGN_READER__PGNPARSER_H_INCLUDED
18#define HOOVER_CHESS_UTILS__PGN_READER__PGNPARSER_H_INCLUDED
87 void pgnTag(
const std::string_view &key,
const std::string_view &value)
89 static_cast<void>(key);
90 static_cast<void>(value);
113 static_cast<void>(str);
121 void nag(std::uint8_t nagNum)
123 static_cast<void>(nagNum);
149 static_cast<void>(srcMask);
150 static_cast<void>(dst);
165 static_cast<void>(srcMask);
166 static_cast<void>(dst);
182 static_cast<void>(srcMask);
183 static_cast<void>(dst);
184 static_cast<void>(promo);
200 static_cast<void>(srcMask);
201 static_cast<void>(dst);
202 static_cast<void>(promo);
218 static_cast<void>(srcMask);
219 static_cast<void>(dst);
220 static_cast<void>(capture);
236 static_cast<void>(srcMask);
237 static_cast<void>(dst);
238 static_cast<void>(capture);
254 static_cast<void>(srcMask);
255 static_cast<void>(dst);
256 static_cast<void>(capture);
272 static_cast<void>(srcMask);
273 static_cast<void>(dst);
274 static_cast<void>(capture);
290 static_cast<void>(srcMask);
291 static_cast<void>(dst);
292 static_cast<void>(capture);
320 static_cast<void>(result);
473template <
typename T_ActionHandler>
487 std::uint32_t expectedTokenMask,
490 std::string expectedTokens { };
492 while (expectedTokenMask != 0U)
494 if (!expectedTokens.empty())
495 expectedTokens +=
" | ";
498 expectedTokenMask = expectedTokenMask & (expectedTokenMask - 1U);
504 "Expected token {} but got: {} ({})",
531 for (
const char c : std::string_view {
m_scanner.YYText() + 1,
static_cast<std::size_t
>(
m_scanner.YYLeng() - 2) })
560 bool variationAllowed { };
584 variationAllowed =
true;
590 variationAllowed =
true;
596 variationAllowed =
true;
602 variationAllowed =
true;
608 variationAllowed =
true;
614 variationAllowed =
true;
620 variationAllowed =
true;
626 variationAllowed =
true;
632 variationAllowed =
true;
638 variationAllowed =
true;
644 variationAllowed =
true;
648 if (variationAllowed) [[likely]]
658 "VARIATION_START not allowed in a line before move"));
796 std::size_t pendingNewlines { };
806 while (pendingNewlines > 0U)
812 pendingNewlines = 0U;
826 default: [[unlikely]]
839 const char *commentStart {
m_scanner.YYText() };
840 const char *commentEnd { commentStart +
static_cast<std::size_t
>(
m_scanner.YYLeng()) };
845 while (commentStart != commentEnd)
847 switch (*commentStart)
862 while (commentStart != commentEnd)
864 switch (*(commentEnd - 1U))
878 if (commentStart != commentEnd)
881 m_actionHandler.comment(std::string_view { commentStart, commentEnd });
PGN error exception.
Definition pgnreader-error.h:70
PGN parser null semantic actions. This is useful only for testing and documentation purposes.
Definition pgnparser.h:74
void moveNum(std::uint32_t moveNum)
Called on move number.
Definition pgnparser.h:132
void moveTextSection()
Called between the end of the tag pair section and the beginning of the move text section.
Definition pgnparser.h:95
void movePawn(SquareSet srcMask, Square dst)
Pawn advancing move (non-promoting)
Definition pgnparser.h:147
void gameStart()
Called on game start before anything else.
Definition pgnparser.h:79
void moveQueen(SquareSet srcMask, Square dst, bool capture)
Queen move.
Definition pgnparser.h:270
void gameTerminated(PgnResult result)
Called on game end.
Definition pgnparser.h:318
void moveShortCastle()
Short castling move.
Definition pgnparser.h:296
void endOfPGN()
Called at the end of the PGN after everything else.
Definition pgnparser.h:324
void movePawnPromoCapture(SquareSet srcMask, Square dst, Piece promo)
Pawn capturing move (promoting)
Definition pgnparser.h:198
void variationEnd()
End of a recursive annotation variation (RAV)
Definition pgnparser.h:311
void comment(const std::string_view &str)
Called on comment.
Definition pgnparser.h:111
void movePawnCapture(SquareSet srcMask, Square dst)
Pawn capturing move (non-promoting)
Definition pgnparser.h:163
void moveLongCastle()
Long castling move.
Definition pgnparser.h:301
void pgnTag(const std::string_view &key, const std::string_view &value)
Called on PGN tag pair.
Definition pgnparser.h:87
void moveKnight(SquareSet srcMask, Square dst, bool capture)
Knight move.
Definition pgnparser.h:216
void variationStart()
Beginning of a recursive annotation variation (RAV)
Definition pgnparser.h:306
void nag(std::uint8_t nagNum)
Called on numeric annotation glyph.
Definition pgnparser.h:121
void moveRook(SquareSet srcMask, Square dst, bool capture)
Rook move.
Definition pgnparser.h:252
void movePawnPromo(SquareSet srcMask, Square dst, Piece promo)
Pawn advancing move (promoting)
Definition pgnparser.h:180
void moveBishop(SquareSet srcMask, Square dst, bool capture)
Bishop move.
Definition pgnparser.h:234
void moveKing(SquareSet srcMask, Square dst, bool capture)
King move.
Definition pgnparser.h:288
The PGN parser.
Definition pgnparser.h:475
void parse()
Definition pgnparser.h:911
void handleMovePawnPromo(const PgnScannerTokenInfo_PAWN_MOVE &move) const
Definition pgnparser.h:701
PgnScannerToken parseLine(PgnScannerToken token)
Definition pgnparser.h:558
StringBuilder m_strBuilder2
Definition pgnparser.h:480
void parseCommentBlock()
Definition pgnparser.h:792
void parseTagPair()
Definition pgnparser.h:508
void flushPendingComments()
Definition pgnparser.h:887
void handleMoveKing(const PgnScannerTokenInfo_PIECE_MOVE &move) const
Definition pgnparser.h:737
bool m_inMoveTextSection
Definition pgnparser.h:482
PgnParser(const PgnParser &)=delete
void unexpectedTokenError(PgnErrorCode errorCode, std::uint32_t expectedTokenMask, PgnScannerToken token)
Definition pgnparser.h:485
void handleMoveRook(const PgnScannerTokenInfo_PIECE_MOVE &move) const
Definition pgnparser.h:727
void handleMoveShortCastle() const
Definition pgnparser.h:742
PgnParser & operator=(const PgnParser &) &=delete
PgnScanner & m_scanner
Definition pgnparser.h:477
void handleMoveQueen(const PgnScannerTokenInfo_PIECE_MOVE &move) const
Definition pgnparser.h:732
PgnParser(PgnParser &&)=delete
PgnScannerToken parseVariation()
Definition pgnparser.h:667
void handleMovePawnPromoCapture(const PgnScannerTokenInfo_PAWN_MOVE &move) const
Definition pgnparser.h:709
void parseSingleLineComment()
Definition pgnparser.h:837
void handleMovePawnCapture(const PgnScannerTokenInfo_PAWN_MOVE &move) const
Definition pgnparser.h:694
PgnParser(PgnScanner &scanner, T_ActionHandler &actionHandler)
Constructor.
Definition pgnparser.h:900
T_ActionHandler & m_actionHandler
Definition pgnparser.h:478
void handleMoveKnight(const PgnScannerTokenInfo_PIECE_MOVE &move) const
Definition pgnparser.h:717
void handleMoveLongCastle() const
Definition pgnparser.h:747
void handleMovePawn(const PgnScannerTokenInfo_PAWN_MOVE &move) const
Definition pgnparser.h:687
void handleMoveNum(const PgnScannerTokenInfo_MOVENUM &moveNum) const
Definition pgnparser.h:752
void handleMoveBishop(const PgnScannerTokenInfo_PIECE_MOVE &move) const
Definition pgnparser.h:722
StringBuilder m_strBuilder
Definition pgnparser.h:479
PgnScannerToken parseNagsAfterMove()
Definition pgnparser.h:757
PgnScannerToken parseComments(PgnScannerToken token)
Definition pgnparser.h:770
std::vector< std::string > m_pendingComments
Definition pgnparser.h:483
The PGN scanner (lexer)
Definition pgnscanner.h:40
const PgnScannerTokenInfo & getTokenInfo() const noexcept
Returns additional information on the token.
Definition pgnscanner.h:125
PgnScannerToken nextToken()
Scans input and returns the next token.
Definition pgnscanner.h:89
static constexpr const char * scannerTokenToString(PgnScannerToken token) noexcept
Returns a string for a scanner token.
Definition pgnscanner.h:136
Set of squares. Implemented using a bit-mask.
Definition chessboard-types-squareset.h:35
Definition stringbuilder.h:28
void appendString(const char *str, std::size_t len)
void clear() noexcept
Definition stringbuilder.h:59
std::string_view getStringView() const noexcept
Definition stringbuilder.h:54
bool isEmpty() const noexcept
Definition stringbuilder.h:49
PgnErrorCode
Error code.
Definition pgnreader-error.h:35
PgnResult
Game result.
Definition pgnreader-types.h:32
Piece
Named piece.
Definition chessboard-types.h:204
Square
Named square.
Definition chessboard-types.h:122
@ BAD_PGN_TAG
PGN tag parsing failed (parser error)
@ UNEXPECTED_TOKEN
Unexpected (bad) token (parser error)
constexpr std::uint32_t pgnScannerTokenToMaskBit(PgnScannerToken token) noexcept
Definition pgnscannertokens.h:149
PgnScannerToken
PGN scanner token.
Definition pgnscannertokens.h:37
@ VARIATION_START
Variation start ('(')
Definition pgnscannertokens.h:57
@ VARIATION_END
Variation end ('(')
Definition pgnscannertokens.h:60
@ COMMENT_TEXT
Block comment text line OR single line comment.
Definition pgnscannertokens.h:127
@ TAG_START
PGN tag start ('[')
Definition pgnscannertokens.h:45
@ MOVENUM
Move number.
Definition pgnscannertokens.h:65
@ MOVE_PIECE_ROOK
Rook move.
Definition pgnscannertokens.h:100
@ COMMENT_NEWLINE
New line within a block comment.
Definition pgnscannertokens.h:130
@ MOVE_PIECE_KNIGHT
Knight move.
Definition pgnscannertokens.h:90
@ MOVE_PIECE_BISHOP
Bishop move.
Definition pgnscannertokens.h:95
@ MOVE_PAWN
Pawn advance (non-promoting)
Definition pgnscannertokens.h:70
@ TAG_KEY
PGN tag key.
Definition pgnscannertokens.h:48
@ MOVE_PAWN_PROMO
Pawn capture (promoting)
Definition pgnscannertokens.h:80
@ TAG_END
PGN tag end (']')
Definition pgnscannertokens.h:54
@ NAG
Numeric annotation glyph.
Definition pgnscannertokens.h:121
@ MOVE_SHORT_CASTLE
Short castling move.
Definition pgnscannertokens.h:113
@ MOVE_PAWN_CAPTURE
Pawn capture (non-promoting)
Definition pgnscannertokens.h:75
@ COMMENT_END
Block comment end.
Definition pgnscannertokens.h:133
@ END_OF_FILE
End of file.
Definition pgnscannertokens.h:42
@ RESULT
PGN game result (terminator)
Definition pgnscannertokens.h:138
@ MOVE_PIECE_KING
King move.
Definition pgnscannertokens.h:110
@ TAG_VALUE
PGN tag value.
Definition pgnscannertokens.h:51
@ MOVE_LONG_CASTLE
Long castling move.
Definition pgnscannertokens.h:116
@ MOVE_PAWN_PROMO_CAPTURE
Pawn capture (promoting)
Definition pgnscannertokens.h:85
@ COMMENT_START
Block comment start.
Definition pgnscannertokens.h:124
@ MOVE_PIECE_QUEEN
Queen move.
Definition pgnscannertokens.h:105
Definition chessboard-types-squareset.h:30
Additional token info for move number token.
Definition pgnscannertokens.h:192
std::uint32_t num
Move number.
Definition pgnscannertokens.h:194
std::uint8_t nag
Glyph number.
Definition pgnscannertokens.h:203
Additional token info for pawn move.
Definition pgnscannertokens.h:156
Piece promoPiece
Promotion piece for PgnScannerToken::MOVE_PAWN_PROMO and PgnScannerToken::MOVE_PAWN_PROMO_CAPTURE.
Definition pgnscannertokens.h:169
Square dstSq
Destination square of the move.
Definition pgnscannertokens.h:166
SquareSet srcMask
Allowed source squares per the move specification.
Definition pgnscannertokens.h:163
Additional token info for piece move.
Definition pgnscannertokens.h:174
bool capture
Whether move is a capture move.
Definition pgnscannertokens.h:184
Square dstSq
Destination square of the move.
Definition pgnscannertokens.h:187
SquareSet srcMask
Allowed source squares per the move specification.
Definition pgnscannertokens.h:181
PgnResult result
Game result.
Definition pgnscannertokens.h:210
PgnScannerTokenInfo_MOVENUM moveNum
Definition pgnscannertokens.h:228
PgnScannerTokenInfo_PIECE_MOVE pieceMove
Definition pgnscannertokens.h:227
PgnScannerTokenInfo_RESULT result
Definition pgnscannertokens.h:230
PgnScannerTokenInfo_NAG nag
Definition pgnscannertokens.h:229
PgnScannerTokenInfo_PAWN_MOVE pawnMove
Definition pgnscannertokens.h:226