그래프 구조 스택

Graph-structured stack

컴퓨터 과학에서 그래프 구조화 스택(GSS)은 각 방향 경로가 스택을 나타내는 방향 비순환 그래프입니다.그래프 구조화된 스택은 Tomita 알고리즘의 필수적인 부분으로, 푸시다운 자동화일반적인 스택을 대체합니다.이를 통해 알고리즘은 애매한 문법을 해석할 때 비결정론적 선택을 부호화할 수 있으며 경우에 따라서는 더 큰 효율로 부호화할 수 있습니다.

다음 다이어그램에는 {7,3,1,0}, {7,4,1,0}, {7,5,2,0} 및 {8,6,2,0}의 4개의 스택이 있습니다.

Graph-structured_stack_-_Borneq.png

비결정론을 시뮬레이션하는 또 다른 방법은 필요에 따라 스택을 복제하는 것입니다.정점이 공유되지 않기 때문에 복제 효율이 떨어집니다.이 예에서는 9개 대신 16개의 정점이 필요합니다.

Stacks_-_Borneq.dot.png

운용

GSS 노드* GSS: 추가(GSS 노드* 프리브, 인트 일람) {  인트 프리레벨 = 프리브->수평;  주장하다(레벨.크기() >= 프리레벨 + 1);  인트 수평 = 프리레벨 + 1;  한다면 (레벨.크기() == 수평)  {   레벨.크기 조정(수평 + 1);  }  GSS 노드* 노드 = FindElemAtLevel(수평, 일람);  한다면 (노드 == 특수)  {   노드 = 신규 GSS 노드();   노드->일람 = 일람;   노드->수평 = 수평;     레벨[수평].푸시백(노드);  }  노드->더하다(프리브);  돌아가다 노드; } 
무효 GSS: 삭제(GSS 노드* 노드) {  한다면 (레벨.크기() > 노드->수평 + 1)   한다면 (findPrevAtLevel(노드->수평 + 1, 노드)) 던지다 예외.("위에서만 제거할 수 있습니다.");  위해서 (인트 i = 0; i < > 레벨[노드->수평].크기(); i++)   한다면 (레벨[노드->수평][i] == 노드)   {    레벨[노드->수평].지우다(레벨[노드->수평].시작한다.() + i);    브레이크.;   }  삭제하다 노드; } 

레퍼런스

  • 토미타 마사루그래프 구조화 스택자연어 해석.컴퓨터 언어학 협회 연차총회, 1988.[1]
  • 엘리자베스 스콧, Adrian Johnstone GLL 해석 gll.pdf