¿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,
?)
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?