SKIP
프로그래밍 언어의 소스 코드는 공백이나 코멘트처럼 의미가 없는 부분이 존재한다.
스캔한 부분을 읽고 바로 바리기 위해서는 아래와 같이 SKIP 명령(SKIP directive)을 사용한다.
이때, 토큰은 생성되지 않는다.
SKIP: { < 토큰명 : 패턴 > | < 토큰명 : 패턴 > | < 토큰명 : 패턴 > } |
SKIP 대신 SPECIAL_TOKEN 명령을 사용할 수도 있으며 차이는 토큰을 보존하지 않느냐, 하느냐의 차이이다.
SKIP 명령 사용시 스킵한 문자열은 접근할 수 없지만 SPECIAL_TOKEN은 다음 차례의 TOKEN 명령을 통하여 다시 한번 재 접근이 가능하다.
1. 행 코멘트 스킵
SPECIAL_TOKEN : { < LINE_COMMENT: “//” (~[“\n”, “\r”])* (“\n” | “\r\n” | “\r”)? > } |
문자열 “//”를 만나고, 중간에 개행(\n)과 복귀(\r)을 제외한 모든 문자열(0~n회) 그리고 줄바꿈 코드 까지(코드의 끝일 경우 생략 가능한 경우 까지 포함) LINE_COMMENT 로 분류.
2. 블록 코멘트 스킵
SKIP : { < BLOCK_COMMENT: “/*” (~[])* “*/” > } | import stdio; /*
} |
(~[])*에서 *패턴은 가능하면 긴 문자열에 일치시키려 한다.
이것을 ‘최대 길이 일치의 원칙’ 이라고 한다.
따라서, 중간에 */를 만나더라도, 마지막의 */ 까지 인식하게 된다.
블록코멘트에 대한 이러한 이슈를 해결하기 위해서는, ‘상태 이동’을 통해 해결할 수 있다.
SKIP : { <“/*”> : IN_BLOCK_COMMENT } |
위의 소스에서 보이는 규칙중 IN_BLOCK_COMMENT’를 우리는 ‘상태’(status)라고 부릅니다.
SKIP 내부에서 {패턴 : 상태명} 이라고 쓰게 되면 패턴이 일치했을 경우, 해당 상태로 이동(transit)한다.
해당 상태로 이동하게 되면, 이동한 상태 전용의 어휘 해석 규칙 이외에는 동작하지 않는다.
상태 전용의 규칙을 정의하려면 다음과 같이 TOKEN 명령 앞에 <상태명>을 포함하면 된다.
<상태명> TOKEN : { }
<상태명> SKIP : { }
<상태명> SPECIAL_TOKEN : { }
따라서 위의 소스를 완성하면 이러한 모양이 된다.
SKIP : { <“/*”> : IN_BLOCK_COMMENT } <IN_BLOCK_COMMENT> SKIP : { <~[]> } <IN_BLOCK_COMMENT> SKIP : { <“*/“> : DEFAULT } |
<IN_BLOCK_COMMENT>의 상태규칙은 스캐너가 IN_BLOCK_COMMENT 상태를 가질 때 만 동작한다.
위의 코드에서 DEFAULT 상태(DEFAULT state)는 스캐너를 제일 처음의 상태로 되돌린다는 의미이다.
즉, 상태를 지정하지 않은 어휘 해석의 규칙들이 모두 DEFAULT 상태에 속한다.
이 코드 또한 블록 코멘트를 스캔하는 도중 파일의 끝에 도달하면 에러가 있음에도 정상적으로 처리된다.
따라서 MORE 명령의 필요성이 요구된다.
SKIP만을 사용한 코드는 각각 ‘독립적’인 상태 규칙으로서, 모든 규칙을 만족해야만 한다는 강제성이 없다.
따라서, MORE 명령어로 1개의 블록코멘트에 대해 3가지의 규칙이 모두 성립되어야 함을 보여주면 된다.
MORE : { </*“> : IN_BLOCK_COMMENT } <IN_BLOCK_COMMENT> MORE : { <~[]> } <IN_BLOCK_COMMENT> SPECIAL_SKIP : { <“*/”> : DEFAULT } |
MORE 명령 이후 일치하는 상태 규칙이 없을 경우에는 오류가 발생하게 된다.
즉, 해당 규칙 말고 나머지 규칙이 ‘MORE(더)’ 있다는 것을 스캐너에게 전달하는 것이다.
MORE 명령어를 씀으로서, 3가지의 조건 모두를 만족해야만 에러를 발생시키지 않음을 확실하게 해준 것이다.
'잡동사니 > 컴파일러' 카테고리의 다른 글
[컴파일러 구조와 원리] - TOKEN (0) | 2015.12.31 |
---|---|
[컴파일러 구조와 원리] - 어휘 해석 (0) | 2015.12.31 |
[컴파일러 구조와 원리] - 파서 제네레이터 (Parser Generator) (0) | 2015.12.31 |
[컴파일러 구조와 원리] - 구문 해석( lexical analyze ) (0) | 2015.12.31 |
[컴파일러 구조와 원리] - 컴파일의 4단계 (0) | 2015.12.31 |