Во-первых, если вы еще этого не сделали, вам следует прочитать статью Макпика по GLR http://www.cs.berkeley.edu/~smcpeak/papers/elkhound_cc04.ps. Это академическая статья, но в ней содержатся подробные сведения о GSS, GLR и методах, используемых для их реализации. Это также объясняет некоторые проблемы с использованием синтаксического анализатора GLR.
У вас есть три части для реализации стека с графовой структурой.
I. Сама структура данных графа
II. Стеки
III. GLR использует GSS
Вы правы, Google мало чем поможет. И если вы не любите читать книги по алгоритмам, они тоже не сильно помогут.
I. График структуры данных
Ответ Роба о «прямом представлении» будет проще всего реализовать. Это очень похоже на связанный список, за исключением того, что у каждого узла есть список следующих узлов вместо одного.
Эта структура данных является ориентированным графом, но, как утверждает Макпик, в СОБ могут быть циклы для эпсилон-грамматик.
II. Стеки
Графически структурированный стек - это просто список обычных стеков. Для однозначной грамматики вам нужен только один стек. Вам нужно больше стеков в случае конфликта синтаксического анализа, чтобы вы могли одновременно выполнять оба действия синтаксического анализа и поддерживать разное состояние, создаваемое обоими действиями. Использование графика позволяет вам использовать тот факт, что эти стеки имеют общие элементы.
Может помочь понять, как сначала реализовать один стек со связанным списком. Голова связанного списка является вершиной стека. Помещение элемента в стек просто создает новую головку и указывает ее на старую головку. Удаление элемента из стека - это просто перемещение указателя на head-> next.
В GSS принцип тот же. Нажатие на элемент просто создает новый головной узел и указывает его на старую голову. Если у вас есть две операции сдвига, вы поместите два элемента в старую головку, а затем получите два узла головы. Концептуально это всего лишь два разных стека, которые разделяют каждый элемент, кроме верхних. Выделение элемента - это просто перемещение указателя головы вниз по стеку, следуя каждому из следующих узлов.
III. Использование GLR GSS
Здесь статья Макпика полезна для чтения.
Алгоритм GLR использует преимущества GSS, объединяя заголовки стека с одинаковым элементом состояния. Это означает, что один элемент состояния может иметь более одного дочернего элемента. При уменьшении алгоритм GLR должен будет исследовать все возможные пути из заголовка стека.
Вы можете оптимизировать GLR, поддерживая детерминированную глубину каждого узла. Это просто расстояние от разделения в стеке. Таким образом, вы не всегда должны искать разбиение стека.
Это сложная задача! Так что удачи!