HooverChessUtils_PgnReader 0.9.0
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | Private Attributes | List of all members
hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler > Class Template Reference

The PGN parser. More...

#include <pgnparser.h>

Collaboration diagram for hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >:
Collaboration graph
[legend]

Public Member Functions

 PgnParser (PgnScanner &scanner, T_ActionHandler &actionHandler)
 Constructor.
 
 PgnParser (const PgnParser &)=delete
 
 PgnParser (PgnParser &&)=delete
 
PgnParseroperator= (const PgnParser &) &=delete
 
PgnParseroperator= (PgnParser &&) &=delete
 
void parse ()
 

Private Member Functions

void unexpectedTokenError (PgnErrorCode errorCode, std::uint32_t expectedTokenMask, PgnScannerToken token)
 
void parseTagPair ()
 
PgnScannerToken parseLine (PgnScannerToken token)
 
PgnScannerToken parseVariation ()
 
void handleMovePawn (const PgnScannerTokenInfo_PAWN_MOVE &move) const
 
void handleMovePawnCapture (const PgnScannerTokenInfo_PAWN_MOVE &move) const
 
void handleMovePawnPromo (const PgnScannerTokenInfo_PAWN_MOVE &move) const
 
void handleMovePawnPromoCapture (const PgnScannerTokenInfo_PAWN_MOVE &move) const
 
void handleMoveKnight (const PgnScannerTokenInfo_PIECE_MOVE &move) const
 
void handleMoveBishop (const PgnScannerTokenInfo_PIECE_MOVE &move) const
 
void handleMoveRook (const PgnScannerTokenInfo_PIECE_MOVE &move) const
 
void handleMoveQueen (const PgnScannerTokenInfo_PIECE_MOVE &move) const
 
void handleMoveKing (const PgnScannerTokenInfo_PIECE_MOVE &move) const
 
void handleMoveShortCastle () const
 
void handleMoveLongCastle () const
 
void handleMoveNum (const PgnScannerTokenInfo_MOVENUM &moveNum) const
 
PgnScannerToken parseNagsAfterMove ()
 
PgnScannerToken parseComments (PgnScannerToken token)
 
void parseCommentBlock ()
 
void parseSingleLineComment ()
 
void flushPendingComments ()
 

Private Attributes

PgnScannerm_scanner
 
T_ActionHandler & m_actionHandler
 
StringBuilder m_strBuilder { }
 
StringBuilder m_strBuilder2 { }
 
bool m_inMoveTextSection { }
 
std::vector< std::string > m_pendingComments { }
 

Detailed Description

template<typename T_ActionHandler>
class hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >

The PGN parser.

Template Parameters
T_ActionHandlerSemantic action handler. See PgnParser_NullActions for description.
Grammar for PGN parsing
Rule Parsing function Remarks
PGN GAME* COMMENT* <END_OF_FILE> parse() Any number of games with possibly trailing comments.
GAME TAGPAIRS MOVETEXT parse() A PGN game consists of a list of tag pairs followed by move text section.
TAGPAIRS (COMMENT* TAGPAIR)* parse() List of PGN key/value tags.
TAGPAIR <TAG_START> <TAG_KEY> <TAG_VALUE> <TAG_END> parseTagPair() A single PGN key/value tag.
MOVETEXT LINE <RESULT> parse() The move text section of a PGN game.
LINE (COMMENT | <MOVENUM>)* (MOVE_ITEM (COMMENT | <MOVENUM> | MOVE_ITEM | VARIATION)* )? parseLine() A line consists of any number of moves, interleaved with optional comments, move numbers, and variations. A variation may not appear before the first move. Move numbers are completely optional in PGNs. When present, however, they are validated to be correct by PgnReader.
VARIATION <VARIATION_START> LINE <VARIATION_END> parseVariation() Variation is an alternative line to a move.
MOVE_ITEM MOVE <nag>* parseLine()
parseNagsAfterMove()
A move followed by any number of numeric annotation glyphs (NAGs)
MOVE PgnScannerToken::MOVE_PAWN | parseLine() A pawn advancing move (non-promoting)
PgnScannerToken::MOVE_PAWN_CAPTURE | A pawn capture move (non-promoting)
PgnScannerToken::MOVE_PAWN_PROMO | A pawn advancing move (promoting)
PgnScannerToken::MOVE_PAWN_PROMO_CAPTURE | A pawn capture move (promoting)
PgnScannerToken::MOVE_PIECE_KNIGHT | Knight move
PgnScannerToken::MOVE_PIECE_BISHOP | Bishop move
PgnScannerToken::MOVE_PIECE_ROOK | Rook move
PgnScannerToken::MOVE_PIECE_QUEEN | Queen move
PgnScannerToken::MOVE_PIECE_KING | King move
PgnScannerToken::MOVE_SHORT_CASTLE | Short castling move (O-O)
PgnScannerToken::MOVE_LONG_CASTLE Long castling move (O-O-O)
COMMENT <COMMENT_START> (<COMMENT_TEXT> | <COMMENT_NEWLINE>)* <COMMENT_END> parseCommentBlock() PGN block comment.
<COMMENT_TEXT> parseSingleLineComment() PGN single line comment.

Strings may use backslashes for quoting the next character as is. This is useful only for quoting a quote (") or a backslash (\) character.

The rules are derived from the description in https://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm .

Remarks
The grammar used by this parser differs from the grammar in https://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm#c18 in various ways:
  • Comments are not included in the specification. However, they must be handled by a concrete parser implementation.
  • The syntax in specification allows variations without parent moves. This implementation decided to disallow that in the parser rather than in the later stages.
  • The syntax in specification allows NAGs without the preceding token being a move or another NAG. This implementation is stricter.

Constructor & Destructor Documentation

◆ PgnParser() [1/3]

template<typename T_ActionHandler >
hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::PgnParser ( PgnScanner scanner,
T_ActionHandler &  actionHandler 
)
inline

Constructor.

Parameters
[in]scannerPGN scanner
[in]actionHandlerSemantic action handler. See PgnParser_NullActions for description.

◆ PgnParser() [2/3]

template<typename T_ActionHandler >
hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::PgnParser ( const PgnParser< T_ActionHandler > &  )
delete

◆ PgnParser() [3/3]

template<typename T_ActionHandler >
hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::PgnParser ( PgnParser< T_ActionHandler > &&  )
delete

Member Function Documentation

◆ flushPendingComments()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::flushPendingComments ( )
inlineprivate

◆ handleMoveBishop()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMoveBishop ( const PgnScannerTokenInfo_PIECE_MOVE move) const
inlineprivate

◆ handleMoveKing()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMoveKing ( const PgnScannerTokenInfo_PIECE_MOVE move) const
inlineprivate

◆ handleMoveKnight()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMoveKnight ( const PgnScannerTokenInfo_PIECE_MOVE move) const
inlineprivate

◆ handleMoveLongCastle()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMoveLongCastle ( ) const
inlineprivate

◆ handleMoveNum()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMoveNum ( const PgnScannerTokenInfo_MOVENUM moveNum) const
inlineprivate

◆ handleMovePawn()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMovePawn ( const PgnScannerTokenInfo_PAWN_MOVE move) const
inlineprivate

◆ handleMovePawnCapture()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMovePawnCapture ( const PgnScannerTokenInfo_PAWN_MOVE move) const
inlineprivate

◆ handleMovePawnPromo()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMovePawnPromo ( const PgnScannerTokenInfo_PAWN_MOVE move) const
inlineprivate

◆ handleMovePawnPromoCapture()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMovePawnPromoCapture ( const PgnScannerTokenInfo_PAWN_MOVE move) const
inlineprivate

◆ handleMoveQueen()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMoveQueen ( const PgnScannerTokenInfo_PIECE_MOVE move) const
inlineprivate

◆ handleMoveRook()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMoveRook ( const PgnScannerTokenInfo_PIECE_MOVE move) const
inlineprivate

◆ handleMoveShortCastle()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::handleMoveShortCastle ( ) const
inlineprivate

◆ operator=() [1/2]

template<typename T_ActionHandler >
PgnParser & hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::operator= ( const PgnParser< T_ActionHandler > &  ) &
delete

◆ operator=() [2/2]

template<typename T_ActionHandler >
PgnParser & hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::operator= ( PgnParser< T_ActionHandler > &&  ) &
delete

◆ parse()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::parse ( )
inline

◆ parseCommentBlock()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::parseCommentBlock ( )
inlineprivate

◆ parseComments()

template<typename T_ActionHandler >
PgnScannerToken hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::parseComments ( PgnScannerToken  token)
inlineprivate

◆ parseLine()

template<typename T_ActionHandler >
PgnScannerToken hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::parseLine ( PgnScannerToken  token)
inlineprivate

◆ parseNagsAfterMove()

template<typename T_ActionHandler >
PgnScannerToken hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::parseNagsAfterMove ( )
inlineprivate

◆ parseSingleLineComment()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::parseSingleLineComment ( )
inlineprivate

◆ parseTagPair()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::parseTagPair ( )
inlineprivate

◆ parseVariation()

template<typename T_ActionHandler >
PgnScannerToken hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::parseVariation ( )
inlineprivate

◆ unexpectedTokenError()

template<typename T_ActionHandler >
void hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::unexpectedTokenError ( PgnErrorCode  errorCode,
std::uint32_t  expectedTokenMask,
PgnScannerToken  token 
)
inlineprivate

Member Data Documentation

◆ m_actionHandler

template<typename T_ActionHandler >
T_ActionHandler& hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::m_actionHandler
private

◆ m_inMoveTextSection

template<typename T_ActionHandler >
bool hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::m_inMoveTextSection { }
private

◆ m_pendingComments

template<typename T_ActionHandler >
std::vector<std::string> hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::m_pendingComments { }
private

◆ m_scanner

template<typename T_ActionHandler >
PgnScanner& hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::m_scanner
private

◆ m_strBuilder

template<typename T_ActionHandler >
StringBuilder hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::m_strBuilder { }
private

◆ m_strBuilder2

template<typename T_ActionHandler >
StringBuilder hoover_chess_utils::pgn_reader::PgnParser< T_ActionHandler >::m_strBuilder2 { }
private

The documentation for this class was generated from the following file: