Из вашего комментария:
Я хочу иметь возможность взять контекстно-свободную грамматику и запустить на ней анализатор, который определяет, существует ли любой"бесконечный цикл".
Это легко сделать. Прежде всего, давайте четко определим «контекстно-свободную грамматику». CFG - это система замещения, которая имеет «терминальные» и «нетерминальные» символы. Терминалы - это то, что «сделано»; нетерминалы заменяются последовательностью терминальных и нетерминальных символов.
В моих примерах нетерминалы будут в верхнем регистре, а терминалы будут в нижнем регистре. Правила замещения будут записаны как «НЕТЕРМИНАЛ: замещенные символы». Итак, пример CFG:
SENTENCE : SUBJECT VERB OBJECT
SUBJECT : ARTICLE NOUN
ARTICLE : a
ARTICLE : the
NOUN : can
NOUN : man
VERB : saw
VERB : kicked
OBJECT : ARTICLE NOUN
Итак, если мы начнем с SENTENCE, мы можем сделать замены:
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
и у нас больше нет нетерминалов, так что мы закончили.
CFG могут иметь циклы:
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, которые должны идти вечно; если бы не было производственного «СРОКА: 1», то этот работал бы вечно, не найдя правильную последовательность только терминалов.
Так как же определить, есть ли какие-либо постановки, которые могут работать вечно?
То, что вы делаете, это создаете ориентированный граф структуру данных. Сделайте все нетерминалы в узлах на графике. Затем добавьте ребро для каждого производственного правила, для которого справа нет нетерминала. Итак, для нашего первого примера у нас будет график:
SENTENCE -----> SUBJECT
| | | |
| | | |
v | | |
VERB | | |
v v |
OBJECT--->ARTICLE |
\ v
---------->NOUN
Во втором примере у нас будет график:
EQUATION --> TERM ---> ADDITION
<-----/
Если график содержит цикл , достижимый из начального символа , то грамматика содержит произведения, которые можно расширять навсегда. Если это не так, то не может.
Итак, теперь все, что вам нужно сделать, это построить детектор циклов, и это простая проблема в анализе графиков. Если циклов нет или единственные циклы недоступны из начального символа, то грамматика хорошая.