Из вашего комментария:
Я хочу, чтобы иметь возможность взять Conte xt Free Grammar и запустить анализатор на нем, который определяет, есть ли любой «бесконечный цикл».
Это легко сделать. Прежде всего, давайте четко определим «контекстную свободную грамматику». CFG представляет собой систему замещения, которая имеет «терминальные» и «нетерминальные» символы. Терминалы - это вещи, которые «делаются»; нетерминалы заменяются последовательностью терминальных и нетерминальных символов.
В моих примерах, не-терминалы будут в UPPERCASE, а терминалы будут в нижнем регистре. Правила замещения будут записаны как «NONTERMINAL: замещенные символы». Так пример CFG является:
SENTENCE : SUBJECT VERB OBJECT
SUBJECT : ARTICLE NOUN
ARTICLE : a
ARTICLE : the
NOUN : can
NOUN : man
VERB : saw
VERB : kicked
OBJECT : ARTICLE NOUN
Так что, если мы начнем с ПРИГОВОРА, то мы можем сделать замены:
SENTENCE
SUBJECT VERB OBJECT
ARTICLE NOUN VERB OBJECT
the NOUN VERB OBJECT
the man VERB OBJECT
the man kicked OBJECT
the man kicked ARTICLE NOUN
the man kicked the NOUN
the man kicked the can
и у нас нет более нетерминалы, поэтому мы сделали.
CFGs может иметь циклы:
EQUATION : TERM = TERM
TERM : 1
TERM : ADDITION
ADDITION : TERM + TERM
И теперь мы делаем постановки:
EQUATION
TERM = TERM
1 = TERM
1 = ADDITION
1 = TERM + TERM
1 = 1 + TERM
1 = 1 + 1
Это один может в конечном итоге остановить, но он может идти вечно также. Конечно, вы можете определить CFG, что должен go forever; если бы не было никакого производства «СРОК: 1», то этот был бы навсегда, не найдя действительной последовательности только терминалов.
Итак, как вы определяете, есть ли любые производств, которые могут работать вечно?
Что вы делаете, это сделать направленный график структура данных. Внесите все нетерминалы в узлы на графике.Затем добавьте ребро для каждого производственного правила, которое с правой стороны имеет нетерминал. Так что для нашего первого примера, мы имеем график:
SENTENCE -----> SUBJECT
| | | |
| | | |
v | | |
VERB | | |
v v |
OBJECT--->ARTICLE |
\ v
---------->NOUN
Во втором примере мы имеем график:
EQUATION --> TERM ---> ADDITION
<-----/
Если граф содержит цикл , который доступен из start symbol, тогда грамматика содержит произведения, которые можно развернуть навсегда. Если это не так, то это невозможно.
Итак, теперь все, что вам нужно сделать, это построить детектор цикла, и это простая проблема в анализе графа. Если циклов нет или если из стартового символа недоступны только циклы, то грамматика хороша.
Не указывайте рекурсивный список ключевых слов. – msarchet
Если у вас есть K2 = «% K4%» и K4 = «% K2%», то, если вы не предоставите больше информации или не удалите рекурсивные данные, вы никогда не сможете решить тупик. – pavanred
. Что вы делаете, имеет имя; вы создаете * контекстно-свободную грамматику *. CFG очень хорошо изучены, но ваш вопрос очень расплывчатый, слишком расплывчатый, чтобы ответить. Что вы подразумеваете под «Я хочу избежать такой проблемы»? Вы, например, хотите иметь возможность взять CFG и запустить на нем анализатор, который определяет, есть ли * любой * бесконечный цикл? Или, если есть * всегда * бесконечные циклы? Или что? Что * точно * вы пытаетесь сделать здесь? –