Tengo la siguiente gramática en ANTLRWorks 1.4. Estoy jugando con ideas para la implementación de un analizador sintáctico en un creador de juegos de texto y aventuras, donde el usuario especificará los diversos comandos permitidos para su juego.¿Es posible tener una gramática en la que una "palabra clave" también se pueda tratar como "no palabra clave"?
grammar test;
parse : cmd EOF;
cmd : putSyn1 gameObject inSyn1 gameObject;
putSyn1 : Put | Place | Drop ;
inSyn1 : In | Into | Within;
gameObject : det obj;
det : The | A | An | ;
obj : Word obj | Word;
Space : (' ' | '\t' | '\r' | '\n'){$channel=HIDDEN;};
Put : 'put';
Place : 'place';
Drop : 'drop';
In : 'in';
Into : 'into';
Within : 'within';
The : 'the';
A : 'a';
An : 'an';
Word : ('a'..'z' | 'A'..'Z')+;
me estoy haciendo una idea de las diversas sutilezas involucradas (como lo hice here).
Esta vez, usando antlr, me pregunto si puedo analizar la entrada tales como:
put wood in fire place
Es decir, "madera" y "chimenea" son los GameObjects anteriores. Sin embargo, "lugar" es también un sinónimo de "poner". Por lo que este sería igualmente válida:
place wood in fire place
antlr me da una NoViableAltException al intentar analizar el último "lugar" token. Quiero reconocer "fire place" como gameObject.
¿Es posible este tipo de cosas en ANTLR? ¿Es posible en gramática?
En el lado, estoy trabajando en una implementación manual que utiliza una estructura de datos personalizada extraña con bits de NFA, Dictionary's y whatnot. Pero aún necesito más tiempo y debo sacrificar algunas células cerebrales para diseñar los algoritmos de inserción de búsqueda & requeridos.
Pero si esto es posible en ANTLR, podría usar el archivo C# generado, ¿eh?
tal vez su ejemplo sea solo un ejemplo, pero, para este en particular, puede usar 'chimenea' (una palabra) en lugar de 'lugar de incendio' –
Bueno, es un _creator de aventuras de texto_, y estoy esperando que el usuario tenga objetos de juego de varias palabras en sus habitaciones creadas. – Rao