Hi,
I think that rule [20] (and other similar) are wrong:
CData ::= (Char* - (Char* ']]>' Char*))
The purpose of the rule is to match (reduce) any Char sequence not containing ']]>'.
But this result is not achieved since the Char definition includes ']' and '>' so the exception part of the rule:
-(Char* ']]>' Char*)
is ambiguous. Most parsers solve the ambiguity by applying the rule "reduce as soon, as much as possible" 
thus the rule will always mismatch because the first Char* reduces also the sequence ']]>' and the next terminal ']]>' will never match.
I think the rule (and other similar) should be written:
Cdata ::= ( Char - ']]>' )*

Best regards
Bacchi Raffaele