X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=parser.l;h=021047b6755d647054d56adb95f47c9ac8fd8c56;hb=d098a3196db8758737f6a79992b460306045d499;hp=ba9ffa6f3cd42e22e281c6d51a159a6a071a13b2;hpb=eb0b8eabe5bf8d5139bc82bf79b88aded98d96c8;p=xboard.git diff --git a/parser.l b/parser.l index ba9ffa6..021047b 100644 --- a/parser.l +++ b/parser.l @@ -66,7 +66,7 @@ * Ranks can be 0-9. The parser returns 0 for off-board files and ranks. * For an unknown piece (as mover or promotion piece) it returns * IllegalMove, like it does when the piece doesn't match. - * Promotions can now also be appended Shogi-style, a bare '=' or '+', + * Promotions can now also be appended Shogi-style, a bare '=' or '^', * and this is then returned as promotion character. The piece indicator * can be prefixed by a '+' to indicate it is a promoted piece. */ @@ -178,7 +178,7 @@ extern void CopyBoard P((Board to, Board from)); %} %% -"+"?[A-Z][/]?[a-l][0-9][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|=)? { +"+"?[A-Z][/]?[a-l][0-9][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|[=^])? { /* * Fully-qualified algebraic move, possibly with promotion */ @@ -216,8 +216,6 @@ extern void CopyBoard P((Board to, Board from)); c = currentMoveString[4] = ToLower(yytext[yyleng-1]); } currentMoveString[5] = NULLCHAR; - if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) - return IllegalMove; /* [HGM] promotion to invalid piece */ } if (appData.debugMode) { @@ -251,23 +249,25 @@ extern void CopyBoard P((Board to, Board from)); currentMoveString[2] - AAA, currentMoveString[4]); - if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotion || result == BlackPromotion)) { + if (currentMoveString[4] == NULLCHAR) { + if(result == WhitePromotion || result == BlackPromotion) { if(gameInfo.variant == VariantCourier || gameInfo.variant == VariantShatranj) currentMoveString[4] = PieceToChar(BlackFerz); else if(gameInfo.variant == VariantGreat) currentMoveString[4] = PieceToChar(BlackMan); else if(gameInfo.variant == VariantShogi) - currentMoveString[4] = '+'; + currentMoveString[4] = '^'; else currentMoveString[4] = PieceToChar(BlackQueen); - currentMoveString[5] = NULLCHAR; + } else if(result == WhiteNonPromotion || result == BlackNonPromotion) + currentMoveString[4] = '='; + currentMoveString[5] = NULLCHAR; } return (int) result; } -[a-l][0-9][xX:-]?[a-l][0-9]((=?\(?[A-Za-z]\)?)|=)? { +[a-l][0-9][xX:-]?[a-l][0-9]((=?\(?[A-Za-z]\)?)|[=^])? { /* * Simple algebraic move, possibly with promotion * [HGM] Engine moves are received in this format, with lower-case promoChar! @@ -294,8 +294,6 @@ extern void CopyBoard P((Board to, Board from)); c = currentMoveString[4] = ToLower(yytext[yyleng-1]); } currentMoveString[5] = NULLCHAR; - if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) - return IllegalMove; } /* [HGM] do not allow values beyond board size */ @@ -324,11 +322,12 @@ extern void CopyBoard P((Board to, Board from)); else if(gameInfo.variant == VariantGreat) currentMoveString[4] = PieceToChar(BlackMan); else if(gameInfo.variant == VariantShogi) - currentMoveString[4] = '+'; // Queen might not be defined in mini variants! + currentMoveString[4] = '^'; // Queen might not be defined in mini variants! else currentMoveString[4] = PieceToChar(BlackQueen); - currentMoveString[5] = NULLCHAR; - } + } else if(result == WhiteNonPromotion || result == BlackNonPromotion) + currentMoveString[4] = '='; + currentMoveString[5] = NULLCHAR; } else if(appData.testLegality && // strip off unnecessary and false promo characters !(result == WhitePromotion || result == BlackPromotion || result == WhiteNonPromotion || result == BlackNonPromotion)) currentMoveString[4] = NULLCHAR; @@ -339,7 +338,7 @@ extern void CopyBoard P((Board to, Board from)); [A-L][0-9][xX:-]?[A-L][0-9] { /* * Simple algebraic move, in capitals - * [HGM] Engine moves are received in this format, with lower-case promoChar! + * [HGM] Some Xiangqi engines use this format ('ICCS notation'). So no promotions! */ int skip = 0; ChessMove result; @@ -375,21 +374,10 @@ extern void CopyBoard P((Board to, Board from)); currentMoveString[2] - AAA, currentMoveString[4]); - if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotion || result == BlackPromotion)) { - if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk) - currentMoveString[4] = PieceToChar(BlackFerz); - else if(gameInfo.variant == VariantGreat) - currentMoveString[4] = PieceToChar(BlackMan); - else - currentMoveString[4] = PieceToChar(BlackQueen); - currentMoveString[5] = NULLCHAR; - } - return (int) result; } -[a-l][0-9]((=?\(?[A-Za-z]\)?)|=)? { +[a-l][0-9]((=?\(?[A-Za-z]\)?)|[=^])? { /* * Pawn move, possibly with promotion */ @@ -416,10 +404,6 @@ extern void CopyBoard P((Board to, Board from)); cl.ftIn < BOARD_LEFT ) return ImpossibleMove; - if(c != '=' && c != '+' && c != NULLCHAR && CharToPiece(c) == EmptySquare) - return IllegalMove; - - Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), &cl); currentMoveString[0] = cl.ff + AAA; @@ -471,9 +455,6 @@ extern void CopyBoard P((Board to, Board from)); cl.ftIn < BOARD_LEFT ) return ImpossibleMove; - if(c != '=' && c != '+' && c != NULLCHAR && CharToPiece(c) == EmptySquare) - return IllegalMove; - Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), &cl); currentMoveString[0] = cl.ff + AAA; @@ -486,7 +467,7 @@ extern void CopyBoard P((Board to, Board from)); return (int) cl.kind; } -[a-l][xX:]?[a-l][0-9]((=?\(?[A-Z]\)?)|ep|"e.p."|=)? { +[a-l][xX:]?[a-l][0-9]((=?\(?[A-Z]\)?)|ep|"e.p."|[=^])? { /* * unambiguously abbreviated Pawn capture, possibly with promotion */ @@ -542,8 +523,8 @@ extern void CopyBoard P((Board to, Board from)); else c = currentMoveString[4] = ToLower(yytext[yyleng-1]); currentMoveString[5] = NULLCHAR; - if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) - return IllegalMove; + if(c != '=' && c != '^' && CharToPiece(c) == EmptySquare) + return ImpossibleMove; } else { currentMoveString[4] = NULLCHAR; } @@ -556,15 +537,19 @@ extern void CopyBoard P((Board to, Board from)); currentMoveString[2] - AAA, currentMoveString[4]); - if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotion || result == BlackPromotion)) { + if (currentMoveString[4] == NULLCHAR) { + if(result == WhitePromotion || result == BlackPromotion) { currentMoveString[4] = PieceToChar(BlackQueen); // [HGM] shatranj: take care of variants without Queen if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk) currentMoveString[4] = PieceToChar(BlackFerz); if(gameInfo.variant == VariantGreat) currentMoveString[4] = PieceToChar(BlackMan); - currentMoveString[5] = NULLCHAR; + if(gameInfo.variant == VariantShogi) + currentMoveString[4] = '^'; + } else if(result == WhiteNonPromotion || result == BlackNonPromotion) + currentMoveString[4] = '='; + currentMoveString[5] = NULLCHAR; } if (result != IllegalMove) return (int) result; @@ -600,7 +585,7 @@ extern void CopyBoard P((Board to, Board from)); return (int) IllegalMove; } -"+"?[A-Z][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|=)? { +"+"?[A-Z][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|[=^])? { /* * piece move, possibly ambiguous */ @@ -656,7 +641,7 @@ extern void CopyBoard P((Board to, Board from)); return (int) cl.kind; } -"+"?[A-Z][a-l0-9][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|=)? { +"+"?[A-Z][a-l0-9][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|[=^])? { /* * piece move with rank or file disambiguator */