Построение следующего набора - PullRequest
0 голосов
/ 27 апреля 2011

При создании первого набора для данной грамматики я заметил сценарий, не описанный в моей ссылке на алгоритм.

А именно, как можно вычислить следующий набор для нетерминала с таким правилом.

<exp-list_tail> --> COMMA <exp> <exp-list_tail>

Выражения, окруженные <..>, не являются окончательными, COMMA является терминалом.
Мое лучшее предположение, я должен просто добавить пустую строку в следующий набор, но я не уверен.

Обычно для случая, когда нетерминал находится в конце производственного правила, вы просто вычисляете следующий список для левого нетерминала, но вы можете видеть, как это может быть проблемой.

1 Ответ

1 голос
/ 27 сентября 2011

Чтобы ответить на этот вопрос правильно, было бы полезно знать всю грамматику. Тем не менее, вот попытка общего ответа:

Вот алгоритм расчета следующих групп:

Инициируйте все последующие группы в {}, кроме S, который является инициатором в {$}.
Пока есть изменения, для каждого A∈V выполните:
Для каждого Y → αAβ сделать:
следовать (А) = следовать (А) ∪ сначала (β)
Если β ⇒ * ε, также выполните: следовать (A) = следовать (A) ∪ следовать (Y)

Обратите внимание, что это детерминированный алгоритм, он даст вам один ответ, в зависимости только от вашей (всей) грамматики.

В частности, я не думаю, что это конкретное правило повлияет на последовательность следования <exp-list_tail> (это может, но, вероятно, не так).

...