%}
%%
-"+"?[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
*/
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!
} else {
c = currentMoveString[4] = ToLower(yytext[yyleng-1]);
}
- if(c == '+' && gameInfo.variant != VariantShogi) c = currentMoveString[4] = NULLCHAR; // + means check outside Shogi
+ if(c == '+' && gameInfo.variant != VariantShogi) currentMoveString[4] = NULLCHAR; // + means check outside Shogi
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
+ } else if(appData.testLegality && gameInfo.variant != VariantSChess && // strip off unnecessary and false promo characters
!(result == WhitePromotion || result == BlackPromotion ||
result == WhiteNonPromotion || result == BlackNonPromotion)) currentMoveString[4] = NULLCHAR;
* Pawn move, possibly with promotion
*/
DisambiguateClosure cl;
- int skip = 0; char c;
+ int skip = 0;
if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */
* Pawn capture, possibly with promotion, possibly ambiguous
*/
DisambiguateClosure cl;
- int skip1 = 0, skip2 = 0; char c;
+ int skip1 = 0, skip2 = 0;
if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */
if (result == WhiteCapturesEnPassant || result == BlackCapturesEnPassant)
return (int) result;
- else
+ else { // [HGM] all very nice, but this messed up the input move that we might want to accept with legality testing off...
+ if (WhiteOnMove(yyboardindex)) // undo the damage
+ currentMoveString[1]--, currentMoveString[3]--;
+ else currentMoveString[1]++, currentMoveString[3]++;
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
*/
cl.ftIn = yytext[1+skip] - AAA;
cl.promoCharIn = NULLCHAR;
- if(yyleng-skip > 3 && gameInfo.variant == VariantShogi) /* [HGM] can have Shogi-style promotion */
+ if(yyleng-skip > 3 && (gameInfo.variant == VariantShogi || gameInfo.variant == VariantSChess)) /* [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
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
*/
cl.ftIn = yytext[2+skip] - AAA;
cl.promoCharIn = NULLCHAR;
- if(yyleng-skip > 4) /* [HGM] can have Shogi-style promotion */
+ if(yyleng-skip > 4 && (gameInfo.variant == VariantShogi || gameInfo.variant == VariantSChess)) /* [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
}
[A-Za-z][@*][a-l][0-9] {
+
+ if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */
+
/* Bughouse piece drop. */
currentMoveString[1] = '@';
currentMoveString[2] = yytext[2];
return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins);
}
-("{"[^\}\n]*"} ")?(1-0|"1 - 0"|"1/0"|"1 / 0"|"1:0"|"1 : 0")(" (".*")"|" {".*"}")? {
+("{"[^\}]*"}"[ \n])?(1-0|"1 - 0"|"1/0"|"1 / 0"|"1:0"|"1 : 0")(" (".*")"|" {".*"}")? {
return (int) WhiteWins;
}
-("{"[^\}\n]*"} ")?(0-1|"0 - 1"|"0/1"|"0 / 1"|"0:1"|"0 : 1")(" (".*")"|" {".*"}")? {
+("{"[^\}]*"}"[ \n])?(0-1|"0 - 1"|"0/1"|"0 / 1"|"0:1"|"0 : 1")(" (".*")"|" {".*"}")? {
return (int) BlackWins;
}
-("{"[^\}\n]*"} ")?("1/2"|"1 / 2")(" "?[-:]" "?("1/2"|"1 / 2"))?(" (".*")"|" {".*"}")? {
+("{"[^\}]*"}"[ \n])?("1/2"|"1 / 2")(" "?[-:]" "?("1/2"|"1 / 2"))?(" (".*")"|" {".*"}")? {
return (int) GameIsDrawn;
}
-("{"[^\}\n]*"} ")?"*"(" (".*")"|" {".*"}")? {
+("{"[^\}]*"}"[ \n])?"*"(" (".*")"|" {".*"}")? {
return (int) GameUnfinished;
}