¿Por qué ANTLR4 no coincide con "de" como palabra y "," como puntuación?

tengo unHello.g4 archivo de gramática con una definición gramatical:

definition : wordsWithPunctuation ;
words : (WORD)+ ;
wordsWithPunctuation : word ( word | punctuation word | word punctuation | '(' wordsWithPunctuation ')' | '"' wordsWithPunctuation '"' )*  ;
NUMBER : [0-9]+ ;
word : WORD ;
WORD : [A-Za-z-]+ ;
punctuation : PUNCTUATION ;
PUNCTUATION : (','|'!'|'?'|'\''|':'|'.') ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

Ahora, si estoy tratando de construir un árbol de análisis a partir de la siguiente entrada:

a b c d of at of abc bcd of
a b c d at abc, bcd
a b c d of at of abc, bcd of

devuelve errores:

Hello::definition:1:31: extraneous input 'of' expecting {<EOF>, '(', '"', WORD, PUNCTUATION}

aunque el:

a b c d  at:  abc bcd!

Funciona correctamente.

¿Qué tiene de malo la gramática, la entrada o el intérprete?

Si modifico elwordsWithPunctuation regla, agregando(... | 'of' | ',' word | ...) luego coincide completamente con la entrada, pero me parece sospechoso: cómo funciona la palabraof es diferente de la palabraa oabc? O por qué, es diferente de otropunctuation caracteres (es decir, por qué coincide con el: o!, pero no,?)

Actualización1:

Estoy trabajando con el complemento ANTLR4 para Eclipse, por lo que la compilación del proyecto ocurre con el siguiente resultado:

ANTLR Tool v4.2.2 (/var/folders/.../antlr-4.2.2-complete.jar)
Hello.g4 -o /Users/.../eclipse_workspace/antlr_test_project/target/generated-sources/antlr4 -listener -no-visitor -encoding UTF-8
Actualización2:

la gramática presentada anteriormente es solo parcial de:

grammar Hello;

text : (entry)+ ;

entry : blub 'abrr' '-' ('1')? '.' ('(' NUMBER ')')? sims '-' '(' definitionAndExamples ')' 'Hello' 'all' 'the' 'people' 'of' 'the' 'world';

blub : WORD ;

sims : sim (',' sim)* ;
sim : words ;

definitionAndExamples : definitions (';' examples)? ;

definitions : definition (';' definition )* ;
definition : wordsWithPunctuation ;

examples : example (';' example )* ;
example : '"' wordsWithPunctuation '"' ;

words : (WORD)+ ;
wordsWithPunctuation : word ( word | punctuation word | word punctuation | '(' wordsWithPunctuation ')' | '"' wordsWithPunctuation '"' )*  ;

NUMBER : [0-9]+ ;
word : WORD ;
WORD : [A-Za-z-]+ ;
punctuation : PUNCTUATION ;
PUNCTUATION : (','|'!'|'?'|'\''|':'|'.') ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

Ahora me parece a mí, que las palabras delentry regla de alguna manera romper las otras reglas dentro de laentry regla. ¿Pero por qué? ¿Es una especie de antipatrón en la gramática?

Respuestas a la pregunta(1)

Su respuesta a la pregunta