디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

스캐너 제네레이터 구현 연재.............

[성대아싸]갤로그로 이동합니다. 2011.04.27 19:10:21
조회 100 추천 0 댓글 0


= 스캐너 제네레이터 =

(스캐너 템플릿)



저번에는 정규식 해석 엔진을 완성했죠,

근데 정규식 하나 입력하고 땡이면 좀 효용성이 없겠져?


그래서 스캐너 제네레이터를 만듭니다.

이는 GNU 의 flex 랑 비슷한겁니다. (어도비(Adobe)의 flex아닙니다!!)

이런 류의 프로그램들을 lexer라고 합니다.


요놈의 역할은 정규식을 입력하고 액션코드를 입력하면

해당 정규식에 텍스트가 매치되었을때 액션코드를 실행하는 겁니다.


템플릿은 다음과 같습니다.

-----------------------------------------

사용자 코드

%%

정규식1  액션코드1
정규식2  액션코드2
...
정규식n  액션코드n

%%

사용자 코드

-----------------------------------------



즉 %% 사이 부분을

스캐너 제네레이터가 자동으로 만들어 주는 겁니다.

C언어로 프로그램 짜는데 단어를 인식하는 부분을 일일히 짜기

귀찬으니까요, 스캐너 제네레이터가 대신 짜주는 겁니다.


결과물은? C언어로 씌어진 코드입니다.

프로그램을 생성하는 프로그램입니다....

재밌지 않나요?? ㅋㅋㅋ






(정규식이 여러개 매치 우선순위)


정규식을 여러개를 매치를 시키게 되므로

정규식 간에도 우선순위가 생기게 됩니다

무슨소리냐고요?? 예를 들면 이런겁니다.


%%

int|char|void   printf("type");

[a-z]+  printf("identifier");


; printf("end-statement");
\\s // space char, skip

%%


의 스캐너가 만들어졌다고 해봅시다.

이때 들어오는 문자열이 

"int aa;" 라고 하면


첫번째 정규식도 "int"까지 매치하고 성공합니다.

두번째 정규식도 "int" 까지 매치하고 성공합니다.


그러면 어떤 정규식에 매치가 된걸까요???

저희가 구현하려고 하는 pglexer는 이런 상황에서

\'먼저 쓴 놈\' 을 선택합니다.

위 상황의 경우 int 매치가 되면 "type" 가 출력되겠군요




그럼 이런 상황은 어떨까요???

문자열이 "int integer;"

인 경우를 봅시다.


처음 나타나는 "int" 는 매치가 잘되서 "type"

가 될 텐데요 그 뒤에가 문제입니다.

"integer;"



첫번째 정규식의 경우

"int" 까지 매치됩니다.


두번째 정규식의 경우

"integer" 까지 매치됩니다.



그러면 어떤 정규식에 매치되었다고 해야 할까요??


저희가 구현하려는 pglexer 는 이 상황에서는

\'길게 매치된  놈\' 을 선택합니다.



즉 pglexer 는 두가지 원칙을 지니고 있습니다.

1. 길게  매치된 놈
2. 먼저 쓴 놈

을 선택합니다.



원칙이라 말했지만 이건 그냥 

max값 찾는거나 마찬가지 입니다.

정규식 매치된 길이를 max값이랑 비교를 하는데

max 보다 더 길게 매치될 때가 되서야 max를 업데이트 합니다.


당연히 max값이니까 길게 매치된것을 선택하는 셈이고

순서대로 찾으니까, 길이가 같게 매치될 경우 

먼저 쓴놈이 선택이 되는 겁니다.




(스캐너 함수가 강제 반환후 재호출 되는 상황)


스캔하는 함수명은

pglexer에서는 pg_lex() 입니다.


그냥 \'스캔해라\' 하면 pg_lex()를 호출하면

EOF가 나올때까지 쭉 동작합니다.




근데 파서랑 결합되어서

스캐너 함수가 호출되었다가 반환했다가 하는 경우가 분명 생깁니다.

예를 들면


#define DIGIT 1
#define ADD 2
%%
[0-9]+ return DIGIT;
\\+  return ADD;

[^0-9+]+ // skip
%%



액션 코드에 return 문이 필요한 경우가 생깁니다. 이는

파서와 결합되어 스캔 함수가 토큰을 인식하고

특정 심볼로 반환하는 것을 원하는 경우이지요

다시 파서가 재호출을 할수도 있습니다.


이때 스캐너 함수는 종료되었다가

다시 호출되는 셈이므로


기존에 \'어디까지 매치되었었나??\' 를 알고 있어야 합니다.


pglexer 는 이를 전역변수로 해결합니다. 좀 더럽죠

걍 다시 호출하면 

이전까지 매치된 부분부터 다시 시작하여 매칭을 실시하죠




( 어떤 정규식에도 매치되지 않는 상황?)

정규식을 여러개 해놨어도

특수문자를 갈기는 바람에 매치되지 않는 상황도 생길수 있죠?


pglexer같은 경우 이 상황에서는

그냥 error 내뱉고 종료하게 합니다.



왜냐하면 이 스캐너 제네레이터는 DFA 기반입니다.

NFA처럼 유연하지 않습니다.

고로 만일 어떤 정규식에도 매치되지 않는 상황이 생기면

모호해집니다. 

준비되지 않은  상황이죠,


만일 모든 정규식이 매치 실패하면

한문자를 건너 뛴다고 해봅시다.

그러면 그 문자는 토큰도 아니죠

텍스트를 토큰으로 쪼개는게 이상해지게 됩니다.


이 부분은 만일 필요하다면 다시 고칠수 있겠죠





(정규식에 매치가 되고 액션코드까지 실행되면 점프한다)


DFA의 파워입니다.

매치된 만큼 건너뛰어 버립니다.


이는 비결정적인 NFA엔진의 백트래킹과는 

천지차이인 속도를 보여줍니다.


따라서 \'텍스트 중심 엔진\' 입니다.







(프로그램 완성)

스캐너 제네레이터 완성이 되었습니다.

풀 소스와 예제는 다음에 설명하겠스빈다.


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 주위의 유혹에 쉽게 마음이 흔들릴 것 같은 스타는? 운영자 24/10/21 - -
275421 형들이라면 어떤걸 택하시겠어요??? [4] 안졸리니졸리갤로그로 이동합니다. 11.09.24 75 0
275419 이 명제에 오류가 있을까 [1] elwlwlwk갤로그로 이동합니다. 11.09.24 47 0
275418 인터넷이 이상하내 [3] Unia갤로그로 이동합니다. 11.09.24 51 0
275417 JCE 정말 너무한다.. 신입공채 지원서 제출 누르니깐 아놔 ㅅㅂ [2] JCE신입(110.11) 11.09.24 120 0
275413 와시발좆될뻔 [8] 三didas갤로그로 이동합니다. 11.09.24 181 0
275412 역시 프갤은 새벽에 더 활발한듯... [3] warota(221.150) 11.09.24 71 0
275409 김치로이드 훨씬 부드러워졌네 SODMaster갤로그로 이동합니다. 11.09.24 37 0
275408 제발 도와주셈 . 컴퓨터 파일 개 이상해짐 ㅡㅜ [1] 아ㅣ(123.212) 11.09.24 33 0
275407 봉숭아물이 많이 빠졌습니다. [2] 밤이네..갤로그로 이동합니다. 11.09.24 77 0
275406 이문동쮸쥬바횽있길래 질문 아까 디스어셈블러 [2] 일광면갤로그로 이동합니다. 11.09.24 46 0
275405 스프링좀 하는쉑이는 쳐봅니다. 쵸쵸(219.251) 11.09.24 45 0
275403 루프 횟수가 적은 경우라면 일광면갤로그로 이동합니다. 11.09.24 30 0
275402 이 씨발 내방인데 [1] 로하로하알로하갤로그로 이동합니다. 11.09.24 65 0
275401 형들 궁금한게 있는데요. 돼끼(112.165) 11.09.24 27 0
275400 남녀의 생각차이. [3] 밤이네..갤로그로 이동합니다. 11.09.24 80 0
275397 에공 오늘도 결국 못쉬네 ㅠ [1] 일광면갤로그로 이동합니다. 11.09.24 47 0
275396 리눅스 마지막 질문(변수) [4] ㅇㅇ(59.1) 11.09.24 43 0
275395 근데,,여자로 태어나면 뭐가 좋음? [4] 커피친설탕(59.3) 11.09.24 137 0
275394 슈스케 재밋지 나도좋아해 ㅎㅎ [5] SuCo갤로그로 이동합니다. 11.09.24 61 0
275393 아 배아파.. [1] zeroxy갤로그로 이동합니다. 11.09.24 34 0
275392 리눅스 관련 질문 한가지만 더 (계정관련) [4] ㅇㅇ(59.1) 11.09.24 51 0
275391 미안해요 알았음ㅋ 이힝(121.177) 11.09.24 32 0
275390 형들 C언어 공부중인데, 배열포인터를 함수의 매개변수로 전달할려면 [1] 시민큐(121.160) 11.09.24 134 0
275387 씨발럼들이 갤은 너덜한데 [2] 로하로하알로하갤로그로 이동합니다. 11.09.24 50 0
275386 for문 조건식에 이꼴넣으면 안되나여 씨팔 [5] 이힝(121.177) 11.09.24 70 0
275385 여기 혹시 룰더스카이 하는 사람있음? [6] abbey road갤로그로 이동합니다. 11.09.24 48 0
275384 너네는 한손으로 몇까지 셀수 있냐? [7] warota(221.150) 11.09.24 98 0
275383 캐꼬닭형 존나 소규모 정모 언제하는 건데? 얼빠진호랑이갤로그로 이동합니다. 11.09.24 88 0
275382 갤이 완전 너덜너덜하네... SODMaster갤로그로 이동합니다. 11.09.24 33 0
275381 횽들 랜덤프로그램에대해 아는거잇는횽 잇어?? [5] (61.77) 11.09.24 54 0
275380 슬픕니다. [2] 얼빠진호랑이갤로그로 이동합니다. 11.09.24 90 0
275379 갤러리 자동로그인주소 ㅋㅋ(124.54) 11.09.24 95 0
275378 프갤에 숙제 물어 보는 애들을 위해 내가 했던 과제들을 올려주지. [3] warota(221.150) 11.09.23 66 0
275377 횽들 리눅스 질문좀..(변수관련) [10] ㅇㅇ(59.1) 11.09.23 59 0
275376 StackOverflow 완전 신세계네 [2] 폐인의세계갤로그로 이동합니다. 11.09.23 85 0
275375 ㅄ드라. 스프링하라. [1] 쵸쵸(219.251) 11.09.23 38 0
275374 요즘 심심해서 맹그는 팟캐스트 플레이어 [3] 시불라미갤로그로 이동합니다. 11.09.23 94 0
275372 자바 초보 질문이요. [3] ㅁㄴ(220.78) 11.09.23 54 0
275370 컴돌이새끼 명지대야 그리고 떡밥좀 그만줘 새끼들아 [4] 컴미(183.99) 11.09.23 54 0
275368 혹시 Alice 란 프로그래밍 잘다루시는 횽있어? 는너(128.210) 11.09.23 53 0
275367 쿄스케는 목동에서 헤메이고 있습니다 [4] 쿄스케갤로그로 이동합니다. 11.09.23 45 0
275366 정전인가.. [1] 커피친설탕(59.3) 11.09.23 19 0
275365 도미노피자 매우 맛난 메뉴 알려드림 [3] SuCo갤로그로 이동합니다. 11.09.23 79 0
275364 저기 님들 [3] 라시엘갤로그로 이동합니다. 11.09.23 46 0
275363 자바 날짜관련 진짜 씹쓰레기였넨 [2] 시불라미갤로그로 이동합니다. 11.09.23 89 0
275361 오늘 갤이 뭐 이리 병신같냐 [2] 땡칠도사갤로그로 이동합니다. 11.09.23 57 0
275360 갤러리 자동로그인주소 [2] ㅋㅋ(124.54) 11.09.23 31 0
275359 안녕하세요 언어공부하려는데 질문좀 여쭙겠습니다. ㅁㄴㄷ(121.130) 11.09.23 35 0
275356 ▣▣▣▣▣▣▣▣▣▣▣▣▣▣터줏대감 자리 여깁니다▣▣▣▣▣▣▣▣▣▣▣▣ [1] ㅁ1현이(125.137) 11.09.23 37 1
275355 오늘 슈스케 하는건 알고 겔질합니까? [4] SuCo갤로그로 이동합니다. 11.09.23 59 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2