[antlr-interest] FEN grammar

Bart Kiers bkiers at gmail.com
Sun Aug 28 14:36:50 PDT 2011


Hi Jonne,

After skimming through the Wiki page you mentioned, I realize what you mean
by "overlap". Then no, making fragments will not help you since you will
only know at parse-time if a digit should be a part of a `number` or a
`rank` or a `move`. Fragment rules are only for other fragment rules: the
parser has no notion of them.

I quickly hacked a FEN grammar together. I'm sure I goofed up some things,
but perhaps it's a starting point:

grammar Fen;

parse
  :  placement Space
     color     Space
     castling  Space
     enPassant Space
     number    Space
     number    EOF
  ;

placement
  :  place+ (FSlash place+)+
  ;

place
  :  piece
  |  Rank
  ;

color
  :  W_lc
  |  B_lc
  ;

castling
  :  Hyphen
  |  K_uc? Q_uc? K_lc? Q_lc? // Must macth at least one though! You can do
that by using a semantic predicate.
  ;

enPassant
  :  position
  |  Hyphen
  ;

position
  :  file Rank
  ;

file
  :  A_lc
  |  B_lc
  |  C_H_lc
  ;

number
  :  digit+
  ;

digit
  :  Zero
  |  Rank
  |  Nine
  ;

piece
  :  rook
  |  knight
  |  bishop
  |  queen
  |  king
  |  pawn
  ;

rook   : R_lc | R_uc;
knight : N_lc | N_uc;
bishop : B_lc | B_uc;
queen  : Q_lc | Q_uc;
king   : K_lc | K_uc;
pawn   : P_lc | P_uc;

FSlash : '/';
Space  : ' ';
Zero   : '0';
Rank   : '1'..'8';
Nine   : '9';
Hyphen : '-';
W_lc   : 'w';
R_lc   : 'r';
N_lc   : 'n';
A_lc   : 'a';
B_lc   : 'b';
C_H_lc : 'c'..'h';
Q_lc   : 'q';
K_lc   : 'k';
P_lc   : 'p';
R_uc   : 'R';
N_uc   : 'N';
B_uc   : 'B';
Q_uc   : 'Q';
K_uc   : 'K';
P_uc   : 'P';


Regards,

Bart.



On Sun, Aug 28, 2011 at 10:26 PM, Jonne Zutt <jonne.zutt.ml at gmail.com>wrote:

> Hi all,
>
> I made my first attempts to use antlr today.
> Although I read some tutorials, example programs and a page about
> common pitfalls, I stepped
> into several pitfalls myself as well, I guess.
> Is there anybody who wants to shed some light on the below grammar to
> parse chess FEN strings
> (see http://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation).
>
> I am debugging with the string:
> "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
> without the quotes (this is the initial position for chess).
>
> I have several problems:
> - I was using more tokens, but several are overlapping (e.g., for the
> enPassant rule I used to have FILE RANK
>  where RANK was a lexer token '1'..'8', but that overlaps with the
> NUMBER token and also with pieces).
>  I'm not sure how to deal with tokens that have overlap? Should they
> always be changed into fragments?
>  I wanted to make tokens for each piece as well. Such as KNIGHT : 'n'
> | 'N'; But the bishop turns out to be
>  quite overloaded as well (with BLACK and FILE).
>
> - For some reason, 0 seems to match my NUMBER, but 1 does not match.
> This is what the debugger shows
>  me. If I switch 0 1 into 1 0, the halfmoveClock is not matching.
>
> - If I press ctrl-Y in the AntlrWorks plugin, I loose all my data!!
> arghh. In IntelliJ that is my shortcut to delete
>  a line.
>
> Below is my grammer. Any help / comments would be nice :)
> Thanks,
> Jonne.
>
>
> grammar Fen;
>
> input
>        :       fen EOF;
>
> fen
>        :       piecePlacement WS activeColor WS castling WS enPassant WS
> halfmoveClock WS fullmoveNumber;
>
> piecePlacement
>        :       pieces SEP pieces SEP pieces SEP pieces SEP pieces SEP
> pieces SEP
> pieces SEP pieces;
>
> pieces
>        :       ('p'|'P' | 'n'|'N' | 'b'|'B' | 'r'|'R' | 'q'|'Q' | 'k'|'K' |
> '1'..'8')+;
>
> activeColor
>        :       'w' | 'b';
>
> castling
>        :       NONE
>        |       ('K' | 'Q' | 'k' | 'q')+;
>
> enPassant
>        :       NONE
>        |       FILE '1'..'8';
>
> halfmoveClock
>        :       NUMBER;
>
> fullmoveNumber
>        :       NUMBER;
>
> // LEXER
>
> WS      :       (' ' | '\t')+;
> SEP     :       '/';
>
> NONE    :       '-';
> FILE    :       'a'..'h';
> NUMBER  :       '0' | ('1'..'9' ('0'..'9')*);
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe:
> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>


More information about the antlr-interest mailing list