X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=parser.l;h=17d791567b16934e5db05a6abec6d427e3e7c682;hb=9d270b7479328210b4f4f47ad3c769c60e4ce200;hp=84c9ec50929806b2bdf5e60b574b10febc617313;hpb=a603f4499d0bd5b10426061ec68201525457db14;p=xboard.git diff --git a/parser.l b/parser.l index 84c9ec5..17d7915 100644 --- a/parser.l +++ b/parser.l @@ -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 */ @@ -215,9 +215,8 @@ extern void CopyBoard P((Board to, Board from)); } else { c = currentMoveString[4] = ToLower(yytext[yyleng-1]); } + if(c == '+' && gameInfo.variant != VariantShogi) c = currentMoveString[4] = NULLCHAR; // + means check outside Shogi currentMoveString[5] = NULLCHAR; - if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) - return IllegalMove; /* [HGM] promotion to invalid piece */ } if (appData.debugMode) { @@ -251,8 +250,8 @@ 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) @@ -261,13 +260,15 @@ extern void CopyBoard P((Board to, Board from)); 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! @@ -293,9 +294,8 @@ extern void CopyBoard P((Board to, Board from)); } else { c = currentMoveString[4] = ToLower(yytext[yyleng-1]); } + if(c == '+' && gameInfo.variant != VariantShogi) c = currentMoveString[4] = NULLCHAR; // + means check outside Shogi currentMoveString[5] = NULLCHAR; - if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) - return IllegalMove; } /* [HGM] do not allow values beyond board size */ @@ -327,8 +327,9 @@ extern void CopyBoard P((Board to, Board from)); 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 +340,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 +376,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 */ @@ -407,7 +397,8 @@ extern void CopyBoard P((Board to, Board from)); cl.ffIn = yytext[0] - AAA; cl.rtIn = yytext[1] - ONE; cl.ftIn = yytext[0] - AAA; - c = cl.promoCharIn = ToLower(yytext[2+skip]); + cl.promoCharIn = ToLower(yytext[2+skip]); + if(cl.promoCharIn == '+' && gameInfo.variant != VariantShogi) cl.promoCharIn = NULLCHAR; // + means check outside Shogi /* [HGM] do not allow values beyond board size */ if(cl.rtIn >= BOARD_HEIGHT || @@ -416,10 +407,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; @@ -462,7 +449,8 @@ extern void CopyBoard P((Board to, Board from)); cl.ffIn = yytext[0] - AAA; cl.rtIn = -1; cl.ftIn = yytext[1+skip1] - AAA; - c = cl.promoCharIn = yytext[2+skip1+skip2]; + cl.promoCharIn = yytext[2+skip1+skip2]; + if(cl.promoCharIn == '+' && gameInfo.variant != VariantShogi) cl.promoCharIn = NULLCHAR; // + means check outside Shogi /* [HGM] do not allow values beyond board size */ if(cl.ffIn >= BOARD_RGHT || @@ -471,9 +459,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 +471,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 */ @@ -543,7 +528,8 @@ 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; + return ImpossibleMove; + if(c == '+' && gameInfo.variant != VariantShogi) c = currentMoveString[4] = NULLCHAR; // + means check outside Shogi } else { currentMoveString[4] = NULLCHAR; } @@ -556,15 +542,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 +590,7 @@ extern void CopyBoard P((Board to, Board from)); return (int) IllegalMove; } -"+"?[A-Z][xX:-]?[a-l][0-9]=? { +"+"?[A-Z][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|[=+])? { /* * piece move, possibly ambiguous */ @@ -628,8 +618,9 @@ extern void CopyBoard P((Board to, Board from)); cl.ftIn = yytext[1+skip] - AAA; cl.promoCharIn = NULLCHAR; - if(yyleng-skip > 3) /* [HGM] can have Shogi-style promotion */ - cl.promoCharIn = yytext[yyleng-1]; + if(yyleng-skip > 3 && gameInfo.variant == VariantShogi) /* [HGM] can have Shogi-style promotion */ + cl.promoCharIn = yytext[yyleng-1-(yytext[yyleng-1]==')')]; + if(cl.promoCharIn == '+' && gameInfo.variant != VariantShogi) cl.promoCharIn = NULLCHAR; // + means check outside Shogi if (appData.debugMode) { fprintf(debugFP, "Parser Qa1: yyleng=%d, %d(%d,%d)-(%d,%d) = %d (%c)\n", @@ -656,7 +647,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-l0-9][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|[=+])? { /* * piece move with rank or file disambiguator */ @@ -695,7 +686,8 @@ extern void CopyBoard P((Board to, Board from)); cl.promoCharIn = NULLCHAR; if(yyleng-skip > 4) /* [HGM] can have Shogi-style promotion */ - cl.promoCharIn = yytext[yyleng-1]; + cl.promoCharIn = yytext[yyleng-1-(yytext[yyleng-1]==')')]; + if(cl.promoCharIn == '+' && gameInfo.variant != VariantShogi) cl.promoCharIn = NULLCHAR; // + means check outside Shogi /* [HGM] do not allow values beyond board size */ if(cl.rtIn >= BOARD_HEIGHT ||