Tengo lo que creo que es una simple pregunta ANTLR. Tengo dos tipos de tokens: ident
y special_ident
. Quiero que mi special_ident
coincida con una sola letra seguida de un solo dígito. Quiero que el ident
genérico coincida con una sola letra, seguido opcionalmente por cualquier número de letras o dígitos. Mi (incorrecta) gramática es a continuación:¿Cómo puede mi ANTLR lexer hacer coincidir un token hecho de caracteres que son subconjunto de otro tipo de token?
expr
: special_ident
| ident
;
special_ident : LETTER DIGIT;
ident : LETTER (LETTER | DIGIT)*;
LETTER : 'A'..'Z';
DIGIT : '0'..'9';
Cuando intento para comprobar esta gramática, consigo esta advertencia:
Decisión puede coincidir con la entrada como "Cifra Letra" utilizando múltiples alternativas: 1, 2. como resultado, alternativa (s) 2 eran discapacitados para esa entrada
entiendo que mi gramática es ambigua y que de entrada como A1
podría coincidir con cualquiera ident
o special_ident
. Realmente solo quiero que el special_ident
se use en el más estrecho de los casos.
Aquí hay algo de entrada de la muestra y lo que me gustaría que al partido:
A : ident
A1 : special_ident
A1A : ident
A12 : ident
AA1 : ident
¿Cómo puedo formar mi gramática I tal que me identifico correctamente mis dos tipos de identificadores?
Gracias ... Creo que todo esto tiene más sentido. ¿La última opción en 'ident' es redundante? ¿No 'CARTA DE LETRA' haría que toda la regla sea equivalente? Además, ¿sería equivalente para toda la regla decir 'LETTER LETTER?| LETRA DIGIT (LETRA | DIGIT) + '? –
Hay varias maneras diferentes en que puede tener las reglas (creo), solo me estaba asegurando de que la LETRA DIGIT tenga otra letra o un dígito después para separarla de la regla special_ident. La opción LETTER LETTER ya no requiere más tokens. Es por eso que uno tiene un signo más y el otro tiene el asterisco. – WayneH