В 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? Возможно ли это в грамматике?
На стороне я ' m работает над ручной реализацией, которая использует странную настраиваемую структуру данных с битами NFA, словаря и т. д. Но мне все еще нужно больше времени и я должен пожертвовать несколькими клетками мозга, чтобы разработать необходимые алгоритмы поиска и вставки.
Но если это возможно в ANTLR, я мог бы просто использовать сгенерированный файл C #, да?