Solution: grammar: R A | '[' ']' | '[' R { ',' R } ']'
parser:
boolean R(inputStream in) { if( in.peek() == '[' ) { in.get(); if( in.peek() == ']' ) return true; // R '[' ']' in.get(); if( R(in) ) { // R '[' R while( in.peek() == ',' ) { in.get(); if( !R(in) ) return false; // failed after R '[' R { ',' 'R' } ',' } if( in.get() != ']' ) return false; // failed after R '[' R { ',' 'R' } else return true; // R '[' R { ',' 'R' } ']' } else return false; // failed after R '[' } else return A(in); // R A }