Как использовать алгоритм Уоршелла для транзитивного замыкания для определения канонических замыканий парсера LR(1)?

Я пытаюсь реализовать алгоритм Уоршелла для быстрого вычисления замыканий LR(1).

Я думаю Я понимаю, как это работает для LR(0):

  • узлы графа LR элементы, как A → B • C
  • ребра являются "переходами", начиная с A → B • C до C → • D

проблема в том, что LR (1) требует вычисления lookaheads, и я не могу понять, как включить их в алгоритм.
Мне кажется, что даже если я знаю транзитивное закрытие любого заданного элемента LR I еще нужно пройти все те же вычисления, чтобы выяснить, что набор lookahead для каждого элемента.

можно ли использовать алгоритм Уоршелла для вычисления канонических замыканий LR(1), или это возможно только для более ограниченных случаев (например, LR(0), SLR(1) и т. д.)?

1 ответов


Я не думаю, что вы можете использовать алгоритм Warshall для этого, потому что каждый раз, когда вы добавляете новый элемент, вам может потребоваться добавить другие элементы. Это итеративный процесс. Направленный график или матрица связности будут продолжать меняться. Я могу ошибаться. Я вычислил закрытие наборов элементов LR(1) с итерационным процессом, сохраняя при этом массив элементов, уже включенных в набор замыканий. Вы можете скачать мой генератор анализатора LRSTAR и вы можете решить, что вам не нужно написать свой собственный генератор синтаксического анализатора. Примечание: я использовал Орграфа алгоритм из бумаги Деремер, вместо Warshall алгоритм для вычисления прогнозных наборы. Вижу список документов, реализованных в LRSTAR.