--- pgn-extract-15.0/grammar.c.checkmate 2001-09-14 16:36:03.000000000 +0800 +++ pgn-extract-15.0/grammar.c 2005-08-22 15:48:07.000000000 +0800 @@ -449,9 +449,12 @@ ParseMoveUnit(void) strcat((char *) move_details->move,"+"); Symbol = next_token(); /* Sometimes + is followed by #, so cover this case. */ - if(Symbol == CHECK_SYMBOL){ + if((Symbol == CHECK_SYMBOL) || (Symbol == CHECKMATE_SYMBOL)){ Symbol = next_token(); } + } else if(Symbol == CHECKMATE_SYMBOL){ + strcat((char *) move_details->move,"#"); + Symbol = next_token(); } move_details->Comment = ParseOptCommentList(); } --- pgn-extract-15.0/lex.c.checkmate 2001-09-14 16:36:03.000000000 +0800 +++ pgn-extract-15.0/lex.c 2005-08-22 15:39:15.000000000 +0800 @@ -225,7 +225,7 @@ init_lex_tables(void) ChTab['!'] = ANNOTATE; ChTab['?'] = ANNOTATE; ChTab['+'] = CHECK_SYMBOL; - ChTab['#'] = CHECK_SYMBOL; + ChTab['#'] = CHECKMATE_SYMBOL; ChTab['.'] = DOT; ChTab['('] = RAV_START; ChTab[')'] = RAV_END; @@ -721,8 +721,10 @@ get_next_symbol(void) } break; case CHECK_SYMBOL: - /* Allow ++ */ - while(ChTab[(unsigned)*linep] == CHECK_SYMBOL){ + case CHECKMATE_SYMBOL: + /* Allow ++ and +# */ + while((ChTab[(unsigned)*linep] == CHECK_SYMBOL) || + (ChTab[(unsigned)*linep] == CHECKMATE_SYMBOL)){ linep++; } break; --- pgn-extract-15.0/tokens.h.checkmate 2005-08-21 16:25:35.000000000 +0800 +++ pgn-extract-15.0/tokens.h 2005-08-21 16:25:43.000000000 +0800 @@ -28,7 +28,7 @@ typedef enum { * returned to the parser as complete token identifications. */ EOF_TOKEN, TAG, STRING, COMMENT, NAG, - CHECK_SYMBOL, MOVE_NUMBER, RAV_START, RAV_END, + CHECK_SYMBOL, CHECKMATE_SYMBOL, MOVE_NUMBER, RAV_START, RAV_END, MOVE, TERMINATING_RESULT, /* The remaining tokens are those that are used to * perform the identification. They are not handled by