실제로 구현하기 위해

각 논터미널에 대한 FIRST 집합들을 전역변수로 할당하고

값을 구하게 된다.



first_sets 2차원 배열을 보면

논터미널의 개수 만큼 , 터미널 집합들이 배정된다.


실제로 이 상수의 크기는

pgyacc.h 에 정의 되어 있는데


#define RULE_SIZE 32
#define RULE_NUM 1024
#define RULE_SET_SIZE (RULE_SIZE/32)

#define TER_NUM 1024
#define NON_NUM 1024
#define TER_SET_SIZE (TER_NUM/32)

#define LR_NUM 4096
#define LR_SET_SIZE (LR_NUM/32)

#define EPSILON 0
#define DOLLOR (TER_NUM - 1)


#define ACCEPT 1025
#define SH_RE_CONF 1026
#define RE_RE_CONF 1027


크기 제약을 둔것이다.

하지만 상당히 크기가 큰데

실제 문법은 크기가 다양하고 저 값보다 작은 경우가 대부분이고

굳이 최대 크기까지 계산할 필요는 없으므로

실제 문법의 크기는 파싱과정에서 알아낸다.

rule_row  //  룰의 개수
st_ter      // 터미널 심볼의 개수
st_non    // 논터미널 심볼의 개수


앞서 설명한 알고리즘에 따라

2개의 스텝 과정을 거쳐서 FIRST 집합을 구하게 된다.


실제로 2칙(?) 연산 문법을 작성하고

FIRST를 구해보면 작 작동하는 것을 볼 수 있다.


Posted by 멍충한아싸

댓글을 달아 주세요