Стек с графической структурой - Graph-structured stack

В Информатика, а стек с графической структурой (GSS) - это ориентированный ациклический граф куда каждый направил дорожка представляет стек Стек с графической структурой является важной частью Алгоритм Томиты, где он заменяет обычный стек из выталкивающий автомат. Это позволяет алгоритму кодировать недетерминированные выборы при анализе неоднозначная грамматика, иногда с большей эффективностью.

На следующей диаграмме четыре стека: {7,3,1,0}, {7,4,1,0}, {7,5,2,0} и {8,6,2,0} .

Graph-structured_stack _-_ Borneq.png

Другой способ симулировать недетерминизм - это дублировать стек по мере необходимости. Дублирование было бы менее эффективным, поскольку вершины не были бы общими. В этом примере потребуется 16 вершин вместо 9.

Стеки _-_ Borneq.dot.png

Операции

GSSnode* GSS::Добавить(GSSnode* предыдущий, int элем){	int предыдущий уровень = предыдущий->уровень;	утверждать(уровни.размер() >= предыдущий уровень + 1);	int уровень = предыдущий уровень + 1;	если (уровни.размер() == уровень)	{		уровни.изменить размер(уровень + 1);	}	GSSnode* узел = findElemAtLevel(уровень, элем);	если (узел == nullptr)	{		узел = новый GSSnode();		узел->элем = элем;		узел->уровень = уровень;				уровни[уровень].отталкивать(узел);	}	узел->Добавить(предыдущий);	вернуть узел;}
пустота GSS::удалять(GSSnode* узел){	если (уровни.размер() > узел->уровень + 1)		если (findPrevAtLevel(узел->уровень + 1, узел)) бросить Исключение(«Снимать можно только сверху».);	для (int я = 0; я < уровни[узел->уровень].размер(); я++)		если (уровни[узел->уровень][я] == узел)		{			уровни[узел->уровень].стереть(уровни[узел->уровень].начать() + я);			перерыв;		}	Удалить узел;}

использованная литература

  • Масару Томита. Стек с графической структурой и анализ естественного языка. Ежегодное собрание Ассоциации компьютерной лингвистики, 1988 г. [1]
  • Элизабет Скотт, Адриан Джонстон GLL парсинг gll.pdf