CLOSURE 연산과
GOTO 연산을 정의하였으므로

이제 문법에 대해

초기 lr 아이템(상태) 에 

$tart -> . S  (커널항목)

이것을 추가하고 closure 를 구한뒤에

더이상 lr 아이템(상태) 가 늘어나지 않을 때까지

모든 심볼에 대해 GOTO를 계산한다.


구현상에서는 lr 아이템이 중복이 있는가 판별해야 하므로

임시 lr아이템을 만들고

기존 lr 아이템들과 비교한다, 

새로운 lr 아이템이 만들어질 때 크기조정 하는 것도 필요하다.


이것들을 전부 반영하여

만들어내는 코드는 다음과 같다, 


make_lr0  함수가 실제적으로 lr0 집합을 만들어내는 역할을 하게 된다.

여기서 

ag_table 2차원 배열을 사용하는데

이는 실질적으로 최종 목표 결과물인 action goto table 이다.

여기서는 goto 에 위해 상태가 이동 될 때

바로 ag_table 에 마킹을 함으로서 

lr 상태간 간선을 표현하고

동시에 SHIFT 를 또 배정하는 작업을 하지 않아도 된다.


lr (0) 집합의 각 상태에서 핸들의 위치를 출력하는 화면이다.



위 사진은  action goto table 에서

SHIFT 만 배정된 상태를 출력했다.  ( LR(0) 상태 집합에서 상태간 간선을 나타낸다 !!)


즉 

교재에서 보면 자주 보게되는 다음과 같은 그래프



여기에서 

각 노드들 ( 핸들이 마킹된 LR 상태들)

과 간선 (Action Goto Table 에 배정된 SHIFT 들)

을 구한 것이다.
Posted by 멍충한아싸

댓글을 달아 주세요