lex 에서는 특정 조건을 만족할 때
특별한 규칙을 적용시키기 위해 start state 라는 것을 제공하는데요..
그 중에 %s 와 %x 라는 것이 있습니다.
%x 와 %s 의 차이는 특정 상태로 들어갔을 때
이전의 룰을 적용하느냐 하지 않느냐의 차이이구요..
보통은 %x 를 사용하라고 권장하는 것 같더군요..
일단 사용법은..
%x CMNT /* exclusive start state */
%%
error { /* 어떤 행동.. */ }
"/*" BEGIN CMNT /* 주석부분 시작 */
<CMNT>. |
<CMNT>\n ; /* 주석부분 내부의 문자는 무시 */
<CMNT>"*/" BEGIN INITIAL /* 주석부분 끝 */
이 예제는 O'Reilly lex & yacc 문서에 있는 건데요..
(error 라는 것만 제가 임의로 추가했습니다.. ^^; )
/* 를 만나면 주석으로 인식해서 CMNT 라는 상태로 들어가게 되구요
(BEGIN CMNT)
일반 문자나 '\n' 의 경우에는 아무런 처리도 하지 않고 있다가
*/ 를 만날 때 CMNT 상태를 끝내는 (BEGIN INITIAL) 예제입니다.
이 경우 %x 는 exclusive start state 이므로
주석 내부에서 error 라는 문자열을 만나도 무시하게 되겠지요..
하지만 위의 예제를 %s 로 바꾸어 보면
%s CMNT /* (normal) start state */
%%
error { /* 어떤 행동.. */ }
"/*" BEGIN CMNT /* 주석부분 시작 */
<CMNT>. |
<CMNT>\n ; /* 주석부분 내부의 문자는 무시 */
<CMNT>"*/" BEGIN INITIAL /* 주석부분 끝 */
이 때는 주석부분 안에서라도 error 라는 문자열을 만나면
'어떤 행동' 을 실행하게 되는 것으로 알고 있습니다..
테스트는 안해봤구요.. ^^;;'
제가 잘못 알고 있는 점이나 부족한 점이 있으면
다른 고수님들께서 잘 알려주시면 감사하겠습니다.. ^^
exclusive start state...
처음 쓰는 글이네요.. (아~ 떨려라.. ^^; )
lex 에서는 특정 조건을 만족할 때
특별한 규칙을 적용시키기 위해 start state 라는 것을 제공하는데요..
그 중에 %s 와 %x 라는 것이 있습니다.
%x 와 %s 의 차이는 특정 상태로 들어갔을 때
이전의 룰을 적용하느냐 하지 않느냐의 차이이구요..
보통은 %x 를 사용하라고 권장하는 것 같더군요..
일단 사용법은..
이 예제는 O'Reilly lex & yacc 문서에 있는 건데요..
(error 라는 것만 제가 임의로 추가했습니다.. ^^; )
/* 를 만나면 주석으로 인식해서 CMNT 라는 상태로 들어가게 되구요
(BEGIN CMNT)
일반 문자나 '\n' 의 경우에는 아무런 처리도 하지 않고 있다가
*/ 를 만날 때 CMNT 상태를 끝내는 (BEGIN INITIAL) 예제입니다.
이 경우 %x 는 exclusive start state 이므로
주석 내부에서 error 라는 문자열을 만나도 무시하게 되겠지요..
하지만 위의 예제를 %s 로 바꾸어 보면
이 때는 주석부분 안에서라도 error 라는 문자열을 만나면
'어떤 행동' 을 실행하게 되는 것으로 알고 있습니다..
테스트는 안해봤구요.. ^^;;'
제가 잘못 알고 있는 점이나 부족한 점이 있으면
다른 고수님들께서 잘 알려주시면 감사하겠습니다.. ^^
댓글 달기