// ** Lets start with the more trivial definitions of single characters:
//
// <horizontal-tab> ::= ASCII 9
// <new-line> ::= ASCII 10
// <vertical-tab> ::= ASCII 11
// <carriage-return> ::= ASCII 13
// <space> ::= ASCII 32
// <digit> ::= One of the characters: 0, 1, 2, 3, 4, 5, 6, 7, 8 or 9.
// <file> ::= One of the characters: a, b, c, d, e, f, g or h.
// <rank> ::= One of the characters: 1, 2, 3, 4, 5, 6, 7 or 8.
// <piece> ::= One of the characters: R, N, B, Q or K.
// <check> ::= One of the characters: + or #.
// <tagname-begin> ::= One of the characters: A-Za-z0-9
// <tagname-continuation> ::= One of the characters: A-Za-z0-9_
// <printable> ::= One of the characters ASCII 32...126 or 160...255.
// <promotion> ::= <piece>
//
// ** The white space definitions:
//
// <white-space> ::= <non-EOL-white-space> <white-space_opt>
// <EOL> <white-space_opt>
// <non-EOL-white-space> ::= <space>
// <horizontal-tab>
// <vertical-tab>
// <EOL> ::= <new-line>
// <carriage-return> <new-line_opt>
//
// ** The definitions that exist of one or more characters:
//
// <integer> ::= <digit> <digit>*
// <square> ::= <file> <rank>
// <disambiguation> ::= <file>
// <rank>
// <square>
//
// ** The definitions of single tokens:
//
// <tag-name> ::= <tagname-begin> <tagname-continuation>*
// <tag-value> ::= <string>
// <string> ::= "<printable>*"
// <game-termination> ::= 1-0
// 0-1
// 1/2-1/2
// *
// <elipsis> ::= ..
// ...
// <move-number-indication> ::= <integer> .
// <integer> <white-space>
// <SAN-move> ::= <piece> <disambiguation_opt> <square> <check_opt>
// <piece> <disambiguation_opt> x <square> <check_opt>
// <square> <promotion_opt> <check_opt>
// <file> x <square> <promotion_opt> <check_opt>
// O-O
// O-O-O
// <numeric-annotation-glyph> ::= $ <digit> <digit_opt>
//
// ** And finally, the definitions of one or more tokens on a row:
//
// <PGN-database> ::= <white-space_opt> <PGN-game>*
// <PGN-game> ::= <tag-section_opt> <movetext-section_opt> <game-termination> <white-space_opt> <comment_opt>
//
// <tag-section> ::= <tag-pair> <tag-section_opt>
// <tag-pair> ::= [ <white-space_opt> <tag-name> <white-space_opt> <tag-value> <white-space_opt> ] <white-space_opt>
//
// <movetext-section> ::= <comment_opt> <movetext-section-white>
// <comment_opt> <movetext-section-black>
// <movetext-section-white> ::= <move-sequence>
// <move-sequence> <white-move>
// <movetext-section-black> ::= <black-move> <movetext-section-white>
// <move-sequence> ::= <white-black-move>*
// <white-black-move> ::= <move-number-indication> <white-space_opt> <move> <move> <comment_opt> <recursive-variation-black_opt>
// <white-move> <black-move>
// <black-move> ::= <move-number-indication> <white-space_opt> <elipsis> <white-space_opt> <move> <comment_opt> <recursive-variation-black_opt>
// <white-move> ::= <move-number-indication> <white-space_opt> <move> <comment_opt> <recursive-variation-white_opt>
// <recursive-variation-white> ::= ( <white-space_opt> <comment_opt> <movetext-section-white> ) <white-space_opt> <comment_opt>
// <recursive-variation-black> ::= ( <white-space_opt> <comment_opt> <movetext-section-black> ) <white-space_opt> <comment_opt>
// <move> ::= <SAN-move> <white-space_opt> <numeric-annotation-glyph_opt> <white-space_opt>
// <comment> ::= { <printable>* } <white-space_opt> <comment_opt>
// : <printable>* <EOL> <white-space_opt> <comment_opt>