The manual states: The syntax of the various directives to declare symbols is as follows.
@example %token @var{tag}? ( @var{id} @var{number}? @var{string}? )+ ( @var{tag} ( @var{id} @var{number}? @var{string}? )+ )* %left @var{tag}? ( @var{id} @var{number}?)+ ( @var{tag} ( @var{id} @var{number}? )+ )* %type @var{tag}? ( @var{id} | @var{char} | @var{string} )+ ( @var{tag} ( @var{id} | @var{char} | @var{string} )+ )* %nterm @var{tag}? @var{id}+ ( @var{tag} @var{id}+ )* @end example I think the "@var{char}" option is missing in the "%token" and "%left" cases. Side note, I wonder if allowing string descriptions for chars is really useful, but I don't really mind: %token '.' "!" Another thing, when running with "-Wcounterexamples", I sometimes get messages like this: Productions leading up to the conflict state found. Still finding a possible unifying counterexample...time limit exceeded: 6,000000 Maybe it's because I'm not a native English speaker, but I've always found the usage of "find" in the meaning of "search" confusing, but especially here, as it ultimately does not find anything. Initially I had read this message as "there were problems, but still[in spite of that] did find something" so I wondered why it doesn't show me what it found. To avoid this confusion, I'd suggest to write "searching for" or "looking for" instead. Viele Grüße, Frank