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 들)
을 구한 것이다.
'프로젝트 > 어설픈 야크 ,2010' 카테고리의 다른 글
6. 어설픈 야크 만들기 (2) pred 함수 만들기 (0) | 2011.01.26 |
---|---|
6. 어설픈 야크 만들기 (1) lookahead 개념 (0) | 2011.01.19 |
5. 어설픈 야크 만들기 (3) LR(0) 집합 구성하기 (0) | 2011.01.14 |
5. 어설픈 야크 만들기 (2) CLOSURE 와 GOTO 연산 (0) | 2011.01.14 |
5. 어설픈 야크 만들기 (1) LR(0) (0) | 2011.01.12 |
4. 어설픈 야크 만들기 (4) FIRST 구현 (0) | 2011.01.12 |
댓글을 달아 주세요