В ANTLRWorks 1.4 у меня есть следующая грамматика. Я обдумываю идеи для реализации парсера в создателе текстовых приключенческих игр, где пользователь будет указывать различные допустимые команды для своей игры.
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')+;
Я просто нащупываю различные тонкости (например, здесь).
На этот раз, используя ANTLR, мне интересно, могу ли я анализировать ввод, например:
put wood in fire place
То есть «дрова» и «камин» - это объекты игры, указанные выше. Однако «место» также является синонимом «положить». Так что это было бы одинаково верно:
place wood in fire place
ANTLR выдает исключение NoViableAltException при попытке проанализировать последний токен «места». Я хочу распознать «камин» как gameObject.
Возможно ли такое в ANTLR? Возможно ли это в грамматике?
Попутно я работаю над ручной реализацией, в которой используется странная настраиваемая структура данных с битами NFA, словаря и многого другого. Но мне все еще нужно больше времени, и я должен пожертвовать несколькими клетками мозга, чтобы разработать необходимые алгоритмы поиска и вставки.
Но если это возможно в ANTLR, я мог бы просто использовать сгенерированный файл C #, да?