Можно ли иметь грамматику, в которой «ключевое слово» можно рассматривать как «не ключевое слово»?

В 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 #, да?

5
задан Community 23 May 2017 в 12:17
поделиться