· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
hre

1.1. 소개

한글 정규표현식 라이브러리는 C 코드로 작성되었으며, 기존 ASCII 기반의 정규 표현식이 가지는 "멀티바이트 charset" 에 대한 잘못된 처리에 대해, 100% 완벽하게 처리합니다. 현재 이 프로젝트의 목표는 POSIX 정규 표현식을 준수하는 라이브러리를 만드는 것이 목표이다. 현재 v0.9.8 에 들어와서 Character class 를 제외한 POSIX "extended regular expressions" 를 모두 처리할 수 있으며, 점차적으로 POSIX "basic regular expressions" 또한 지원할 계획에 있다.

한글 정규표현식 라이브러리는 v0.9 버전대에 들어와서 한글의 특징대로 초성, 중성, 종성을 각자 처리할 수 있도록 함으로써, 한글을 좀 더 유연하게 표현할 수 있도록 구현하였으며, 이에 대한 자세한 내용은 아래의 "한글 정규 표현식" 에서 설명되어 있으니, 참조하기 바란다. 프로젝트 홈페이지는 http://kldp.net/projects/hre에 자리잡고 있다.
  • 프로그램 상의 버그가 있을 경우, [http]문제점 추적Bugs 에 글을 남겨 주세요.
  • 개발자의 지원이 필요할 경우, [http]문제점 추적Support Requests 에 글을 남겨 주세요.
  • HRE에 대한 패치를 만드신 분이 계시다면 [http]문제점 추적Patchs 에 글을 남겨 주세요.
  • HRE에 추가되었음 하는 기능이 있으시다면 문제점 추적]의 Feature Requests 에 글을 남겨 주세요.

1.1.1. 특징

  • <초성,중성,종성> 형태의 한글 정규 표현식 지원 (HRE 사용자 문서의 한글 정규 표현식을 참고)
  • 멀티 바이트 코드 (한글, 일본어, Unicode 등등) 에 대한 정확한 DFA 코드를 작성
  • 완성형, 조합형, Unicode (현재 UTF-8 만 테스트됨) 정규 표현식 지원 (단, 인코딩을 혼합해서 사용한 문서의 경우, 찾는 과정에서 잘못된 결과를 도출할 수 있기 때문에, 추천하지 않음. 하지만 가능함.)
  • v0.9.6 에 들어오면서 모든 표현식에서 유니코드 사용 가능.
  • v0.9.8 에 들어오면서 POSIX "extended regular expressions" 를 지원하게 되었다. 하지만 아직 아래와 같은 Character classes 는 지원하지 않는다.
[:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:]
[:graph:] [:lower:] [:print:] [:space:] [:upper:]

1.1.1.1. 지원하는 platform 들

현재 한글 정규표현식 라이브러리에서 성공적으로 테스트된 platform 정보는 아래와 같다. (다른 Arch 혹은 OS, Lang 에서 성공적으로 테스트 완료를 하신 분은 아래에 추가해 주시면 대단히 감사하겠습니다. 코드 수정이 있었을 경우, 개발자들에게 메일로 패치를 보내주세요.)
  • Architecture
    • ix86
  • Operating System
  • Language
    • C
    • Python

1.1.1.2. 기존 (영어?) 정규 표현식의 문제점

여기에서는 개발자가 왜 한글 정규 표현식을 만들게 되었는지에 대해서 짧게 이야기하려고 한다. 기존 grep 이나, egrep 등 다른 여타 정규 표현식을 사용할 경우, 대부분의 곳에서 한글을 제대로 처리하지 못한다는 사실을 확인할 수 있는데, 예를 들어,
$ grep "[가나다]"
와 같은 문법이 있다고 가정을 했을 때, 문법적인 의미는 비록 "가", "나", "다" 중 매치되는 것을 선택하고자 하는 의도이지만, 실제 해볼 경우, "라" 도 인식이 된다. 왜냐하면, grep 에서는 한글을 지원하지 않기 때문에, "가", "나", "다" 의 첫바이트, 두번째 바이트에 대한 각각의 표현을 인식하기 때문이다. 즉 묶어서 한글 한 character 로 인식하지 못하는데, 이것은 1 바이트 이상을 사용하는 모든 국가에서 기존 정규식을 그대로 사용할 수 없는 이유중 하나이다. (일본어도 2 바이트이지만 자신들의 노력으로 이 문제를 해결한 듯 하다.) 이러한 문제점은 여러 정규식 대부분에서 발생하는데, "가*", "가+", "가?", "가{3,5}" 등등 대부분의 정규식 표현이 멀티 바이트 코드를 가지는 글자에 대해서는 처리하지 못하는게 현실이다. 이러한 문제점을 해결하기 위해서 이 정규 표현식 프로젝트를 시작하게 되었다. 현재 CVS 버전에서는 POSIX 의 "Basic regular expression" 이 원하는 기능에 대해서 모두 구현되어 있으며, 이제 각 BRE, ERE 를 조건에 맞게 배열하는 것만 처리하면, 곧 v1.0 이 될 것이다.

1.1.2. 단점

  • <ㄱ-ㅎ,ㅏ-ㅣ,ㄱ-ㅎ> 과 같은 형태의 범위를 정할 경우, 한글의 모든 글자 11742 자를 처리해야 하기 때문에, CPU 의 속도에 따라, 한글 인코딩에 따라 차이가 날 수 있는데, 확장 완성형의 경우, PIII 600Mhz 에서
Testing in15...
입력 표현식 : [&lt;ㄱ-ㅎ,ㅏ-ㅣ,ㄱ-ㅎ>]
입력 문자열 : aaaaa강aa
Execution times (seconds)
Process Syntax        :   0.23 (1150%) usr   0.02 ( 0%) sys   0.25 (1253%) wall
Apply form            :   0.01 (50%) usr   0.00 ( 0%) sys   0.01 (50%) wall
Form State            :   0.13 (650%) usr   0.00 ( 0%) sys   0.13 (651%) wall
TOTAL                 :   0.02             0.00             0.02
0~1 초가 소유되며, 유니코드의 경우,
Testing in16...
입력 표현식 : [&lt;????????????]
입력 문자열 : aaaaaaaa媛&#48626;aaaaaaaa
Execution times (seconds)
Process Syntax        :   1.75 (8750%) usr   0.02 ( 0%) sys   1.77 (8868%) wall
Apply form            :   0.02 (100%) usr   0.00 ( 0%) sys   0.02 (100%) wall
Form State            :   0.74 (3700%) usr   0.00 ( 0%) sys   0.90 (4509%) wall
TOTAL                 :   0.02             0.00             0.02
1~3 초가 소효된다. (최적화가 절실히 필요, HRE 사용자 문서의 한글 정규 표현식을 참고)

1.1.3. ERE 와 HRE 의 차이점

POSIX "extended regular expressions" (이하 ERE) 와 HRE (한글 정규표현식 라이브러리) 에는 약간 차이가 존재한다. ERE 에 대해서는 [http]Regexp Syntax Summary에서 개략적으로 확인할 수 있으며, 아래에서는 ERE 와 HRE의 차이점만 언급하도록 하겠다.
  • 메타문자 . 의 의미가 조금 다릅니다.
    ERE 에서는 메타문자 . 의미와 HRE 에서의 메타문자 . 의미는 사실 같은 의미를 가지지만, hre_search () 함수의 루틴으로 인해, 실제 사용자가 찾고자 하는 문자열을 찾을 때 다른 의미를 가지게 된다. 즉, HRE에서의 메타문자 . 는 오직 1 바이트 문자를 위한 것이다. 예제로써 설명하는 것이 좀 더 이해하기 편한 것 같다.
  • 정규식 가.나 가 있다고 가정을 했을 때, 가a나는 valid 하지만, 가나나는 유효하지 않다.
  • ERE 에 존재하지 않는 "한글 범위 표현식"이 존재한다. 이에 대한 자세한 설명은 아래의 "한글 정규 표현식"에 자세히 설명되어 있다.
  • 가{0,2}와 같은 반복 표현식을 나타낼 경우, { 와 } 사이에 오게되는 숫자는 ERE 와는 달리, 0 ~ 9 사이만 범위를 정할 수 있다.
이 외의 부분은 모두 ERE 와 같다. 현재 HRE에서, ERE 를 사용하기 위해서는 아래와 같은 코드를 hre_compile () 함수를 실행하기 전에 추가해서 설정해 줘야 한다.
HRE_OPTIONS_MODE (&option) = HRE_MODE_ERE;

1.2. 문서들

1.2.1. HRE 사용자 문서

(hre를 자신의 application 에 활용하실 분은 이 문서를 참조하세요.)

1.2.1.1. 설치 방법 및 제거

1.2.1.1.1. C
  • 설치 (v0.9.6d 이상)
    $ tar xvvzf hre-version.tar.gz
    $ cd hre-version
    $ ./configure
    $ make
    $ make check
    # make install
    
(Cygwin 에서도 위와 같은 방법으로 설치 가능하다.) make install 시 configure 과정에서 --prefix 를 지정해 주지 않을 경우, libhre.a 는 /usr/local/lib 에, hre.h 파일은 /usr/local/include/hre/hre.h 에 설치된다.
  • 설치 (v0.9.6d 이하 버전)
    $ tar xvzf hre-version.tar.gz
    $ cd hre-version
    $ make
    $ make check
    
v0.9.6d 이하 버전을 사용할 경우 자신의 application 에 추가하는 방법파일 추가 방법 (make install 를 통해서 /usr/local/ 에 설치하지 않을 경우) 대로 사용해야한다.
  • 제거
    $ make clean
    $ make uninstall
    
1.2.1.1.2. Python
  • 설치 (v0.1 - Unix)
    1. 우선 위의 "C" 언어 패키지인 HRE를 먼저 위의 방법대로 설치해야 한다. (왜냐하면, Python 확장 모듈은
libhre.a 와 hre.h 에 의존하기 때문이다.) 설치를 했다면, 아래와 같은 방법으로 python 확장 모듈을 설치한다.
$ tar xvvzf pyhre-version.tar.gz
$ cd pyhre-version
$ python setup.py build
$ python test.py
$ python test_suite.py
# python setup.py install
  • 설치 (v0.1 - Windows)
    dist 디렉토리의 해당 파이썬 버전의 exe를 실행하면 된다.
만약 MinGW를 이용해서 직접 컴파일 하고자 하면 다음과 같이 한다. python setup.py build --compiler=mingw32 bdist_wininst

1.2.1.2. 자신의 application 에 추가하는 방법

* 파일 추가 방법 (make install 를 통해서 /usr/local/ 에 설치하지 않을 경우)
  • make install 을 통해서 생성된 libhre.a 파일과 hre.h 파일을 자신의 application 에 복사한다.
  • hre_compile () 와 hre_search (), hre_free () 함수를 이용하여, app 내에 구현한다. (패키지내에 들어 있는 sample.c 파일을 참조.)
     #include "hre</B>.h"
    
와 같은 hre.h 파일을 자신의 application 에 추가하여야 한다.
  • 파일 추가 방법 (/usr/local/ 혹은 make install 을 통해서 시스템 디렉토리에 설치한 경우)
  • make install 을 통해서 시스템 디렉토리에 복사한다.
  • hre_compile () 와 hre_search (), hre_free () 함수를 이용하여, app 내에 구현한다. (패키지내에 들어 있는 sample.c 파일을 참조.) 단, 여기서 위와 다른 점은 hre.h 의 include 경로 차이이다.
#include <hre/hre.h>;
make install을 통해서 시스템 디렉토리에 설치하였으므로 위와 같이 사용할 수 있다.
  • Routine 추가 방법
    정규 표현식의 type 은 hre_t 이며, 부과적으로 들어갈 수 있는 옵션에 대한 type 은 hre_option_t 이다. (현재 hre_option_t 내부에는 정의된 것이 존재하지 않는다.) 한글 정규 표현식 라이브러리의 사용은 다음과 같은 단계로 처리한다.
  • 정규식 컴파일 단계
    사용자가 입력한 정규식을 바탕으로 상태도를 구성하여 결과적으로 hre_t 에 DFA 테이블 정보를 넣는 것을 의미한다.
  • 찾기 단계
찾기를 원하는 문자열과 앞에서 구성한 DFA 테이블을 바탕으로 pattern 과 맞는 문자열을 찾는다.
  • Release 단계
    DFA 테이블을 구성하게 되면 기본적으로 메모리 할당을 하게 되는데, 사용된 메모리를 모두 release 한다.
자세한 예제의 경우, 패키지내에 들어가 있는 sample.c 파일을 살펴보기 바란다.

1.2.1.3. 한글 정규 표현식

KLDP 에서 한글 정규 표현식의 논의가 있었는데, 그 글은 [http]거기 :) 에서 확인할 수 있으며, 한글 정규 표현식 라이브러리에서 표현하는 방식은 "익명"의 사용자가 알려 주신 방법을 모태로 한다. 물론 그 때 올리신 방법과 약간 차이가 있다. 이전 그 글은 아래와 같은 내용이다. 일단 영어 정규식 쓰듯이 한글 정규식을 만드는 것은 별로 효과가 없다고 봅니다. 영어나 일본어 모두, 글자 하나하나가 최소 단위죠. (물론 일본어는 2바이트입니다만, 음절 추출 부분만 있다면 결과적으로 큰 차이는 없습니다.) 하지만, 한글은 한 글자가 기본적으로 음소가 조합되어 생기기 때문에, 그것을 따로 처리하기 힘듭니다. 설령 분리는 할 수 있지만, 그것을 마음대로 조합하는 것은 또 다른 문제죠. 특정 초성, 종성 몇가지에 특정 중성을 조합한다고 할 때, 글자만 치는 것으로는 문제가 있습니다. (초성이 ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, 중성이 ㅏ, ㅑ, ㅐ, ㅓ, ㅕ, ㅔ, 종성이 ㄱ, ㄴ, ㄹ인 조건을 생각해 보세요. 음절로는 거의 불가능하죠.) 개인적으로는 정규식 안에 구분 기호를 이용해서 초, 중, 종성을 따로 분리하는 것이 좋을 것 같군요. 그렇다면
  1. 위의 경우 - [ㄱ-ㅁ,ㅏㅑㅐㅓㅕㅔ,ㄱㄴㄹ]
  2. 자음 모두 - [ㄱ-ㅎ]
  3. 모음 모두 - [,ㅏ-ㅣ]
  4. 초성,중성으로 이루어진 글 모두 - [ㄱ-ㅎ,ㅏ-ㅣ]
  5. 가까나다따라마바빠사싸아자짜차카타파하 - [ㄱ-ㅎ,ㅏ]
  6. 초성,중성,종성 중 중성이 ㅡ가 들어가는 모든 글 - [ㄱ-ㅎ,-,ㄱ-ㅎ]
    그리고 괄호 안에서도 같은 방법으로 구분 기호를 이용해서 초, 중, 종성을 표시합니다.
그러니까 괄호 등의 안에서 구분 기호를 쓰면 그것이 초, 중, 종성을 나타내는 것입니다.
  1. ㄱ으로 시작하는 글자는 ㅏ~ㅓ, ㄴ으로 시작하는 글자는 ㅗ~ㅜ - (ㄱ,ㅏ-ㅓ)(ㄴ,ㅗ-ㅜ)
아직 부족한 점이 많은 것 같은데 여러분은 어떻게 생각하시는지 궁금하군요. 아직 한글 정규 표현식 식에 대한 표준안? 이 전혀 존재하지 않기 때문에, 개발자가 여러 의견을 읽음으로써 표준안? 을 만들 수 밖에 없었으며, 현재 HRE 에서 사용되는 방법은 아래와 같다. (기본적인 틀에서는 "익명" 님의 의견을 따랐다.)

[<초성,중성,종성>]
[ ~ ] 메타문자내 한글 표현은 반드시 '<' 와 '>' 사이에 와야 하며, '초성' 및 '중성', '종성'은 각각 다음과 같은 범위 표현을 할 수 있다.
예1) ㄱ-ㅎ
예2) ㅏ-ㅑ
예3) ㄱㄴㄷㅁ-ㅎ
예4) ㄱ-ㄷㅎㄷ
또한 초성, 중성, 종성 중 범위 표현을 생략할 수 있다. 하지만 반드시 ',' 는 항상 붙여주어야 한다. 즉 한글 표현식에 대한 최소의 표현식은 <,,> 가 되어야 한다는 것이다. 이러한 조합을 통해서 표현할 수 있는 방법은 다음과 같은 방법이 있을 수 있겠다.
  • [<ㄱ-ㄷ,,>]
    오직 초성이 ㄱ ~ ㄷ 인 것. 예) ㄱ, ㄴ, ㄷ
  • [<ㄱㄴㅁ,ㅏ-ㅖ,>]
    초성이 ㄱ 혹은 ㄴ, ㅁ 이고, 중성이 ㅏ ~ ㅖ 일 수 있는 것. 예) 가, 계, 몌, 갸, 등등
  • [<ㄱ,ㅏ,ㄱ-ㄷ>] 초성이 ㄱ 이고, 중성이 ㅏ, 종성이 ㄱ ~ ㄷ 인 문자들. 예) 각, 갇 등등
  • [<,ㅏ-ㅣ,>]
    오직 중성이 ㅏ ~ ㅣ 사이인 것. 예) ㅏ, ㅑ, ㅖ, ㅕ, ㅣ 등등
  • [<ㄱ,ㅏ-ㅣ,ㄱ-ㅎ>]
    초성이 'ㄱ' 인 모든 문자. 예) 각, 갼, 견 등등
  • [<ㄱ-ㅎ,ㅑ,ㄱ-ㅎ>]
    중성이 'ㅑ' 인 모든 문자. 예) 갹, 갼, 약 등등
  • [<ㄱ-ㅎ,ㅏ-ㅑ,ㄱ>]
    종성이 'ㄱ' 인 모든 문자
  • [<ㄱ,ㅏ,><ㄴ,ㅑ,>]
~ 메타 문자내에 두 한글 정규 표현식을 사용한 경우. 물론 영어와 같이 사용할 수 있다.
  • [ab-cd<ㄱ,ㅏ,>g-h<ㄴ,ㅑ,>xy-z]
    영문과 한글을 같이 혼합해서 사용한 예제.
  • [<,,ㄱ-ㄷ>] !!! 이런 표현식은 존재할 수 없다. 한글 코드에는 종성으로 구성된 한글 코드 자체가 존재하지 않는다. !!!
  • [<,ㅏㅑ,ㄴㄷ>]
    !!! 이런 표현식 또한 존재할 수 없다. 한글 코드에는 초성이 없는 한글 코드는 존재하지 않는다. !!!
  • [<ㄱ,,ㄷ>]
    !!! 이런 표현식 또한 존재할 수 없다. 한글 코드에는 중성이 없는 한글 코드는 존재하지 않는다. !!!
위의 예제들에서도 알수 있듯이, 어떠한 경우라도 <,,> 형태는 유지하고 있다는 것을 볼 수 있다. 기본적으로 '초성' 및 '중성', '종성' 부분이 비어있을 경우, 해당 문자가 없는 한글을 검색하고자 한다.

!!!주의!!! 한글 정규 표현식을 사용할 경우, 가장 문제시 될 수 있는 부분이 한글 정규식의 compile 시간인데, <ㄱ-ㅎ,ㅏ-ㅣ,ㄱ-ㅎ> 와 같은 모든 한글을 처리하도록 설정한다면, 확장 완성형의 모든 글자인 11742 글자를 모두 처리해야 하기 때문에, 영문자를 처리하는 정규 표현식 라이브러리와 질적으로 시간차이가 날 수 밖에 없다. 그래서 사용자는 한글 정규 표현식을 사용할 때 최소한의 한글 (즉, 자신이 찾고하 하는 한글 범위의 가장 작은 것) 을 선택하여 performance 에 신경을 쓸 필요가 있다. 몰론 추후 버전에서는 이에 대한 최적화를 수행하도록 코드 개선을 할 것이다.

1.2.1.4. 사용자 함수 설명

한글 정규 표현식 라이브러리에서 사용자가 이 라이브러리를 사용하기 위해서 알아야 하는 함수는 모두 3 개가 존재하는데, 각 함수의 설명을 하면 아래와 같다.
  • 정규식 컴파일 단계 (hre_compile () 함수)
    hre_t hre_compile (const char *re, hre_option_t option) 위와 같은 원형을 가지며, 사용자가 RE 에 자신이 찾고자 하는 Regular Expression 을 넣고, OPTION 에는 원하는 옵션을 넣는다. 만약 hre_compile () 이 실패할 경우, NULL 을 반환하게 된다. 현재 정의되어 있는 OPTION 에는 다음과 같은 부분이 있다. (현재 v0.9.8 에서는 ERE 만 지원하고 있다.)
  • ERE 를 사용하기 위해서는 아래와 같은 OPTION 을 설정해야 한다.
HRE_OPTIONS_MODE (&option) = HRE_MODE_ERE;
  • 찾기 단계 (hre_search () 함수)
    int hre_search (hre_t dfa, const char *str) hre_compile () 함수를 통해서 생성된 DFA 테이블은 hre_t 에 들어가 있게 되며, DFA 는 hre_compile () 함수가 반환한 값을, STR 에는 DFA 패턴과 매치되는 문자열을 찾고자 하는 문자열을 넣는다. hre_search () 함수가 DFA 패턴과 매치되는 것을 찾을 경우, 매치된 문자열의 끝 뒷부분을 가르키게 된다. 예를 들면,
DFA : abc
STR : babcd
위와 같이 DFA 가, "abc" 이고, 문자열이 "babcd" 일 경우, hre_search () 함수는 4 를 반환한다. 즉 4 는 STR 의 'c' 를 가르킨다. 만약 match 되는 문자열을 찾을 수 없을 경우, -1 을 반환한다.
  • Release 단계 (hre_free () 함수)
    void hre_free (hre_t dfa) hre_compile () 함수를 실행하여 hre_t 를 돌려받을 경우, hre_t 를 위해 할당된 메모리들이 존재하는데, 이 DFA 테이블을 시스템에 release 한다. (free 한다.)
실제 위 사용한 예제를 언급한다면, 아래와 같이 구성할 수 있을 것이다. (좀 더 자세하고 실질적인 예제는 src/sample.c 와 test_suite/main.c 에서 확인할 수 있다.)
#include &lt;hre/hre.h&gt;
#define SUCCESS_EXIT_CODE 1
#define FATAL_EXIT_CODE (44 | 0x10000000)
/* 정규 표현식 라이브러리의 phony main 함수.  */
int
main (argc, argv)
int argc;
char *argv[];
{
int i;
char *re = &quot;[&lt;ㄱ,ㅏ,&gt;&lt;ㄷ,ㅏ,&gt;]&quot;;
char *str = &quot;다&quot;;
hre_t test;
hre_option_t option;
HRE_OPTIONS_MODE (&amp;option) = HRE_MODE_ERE;
/* 사용자가 입력한 정규식을 컴파일한다.  */
if (!(test = hre_compile (re, option)))
{
printf (&quot;정규 표현식에 오류가 존재합니다.\n&quot;);
return (FATAL_EXIT_CODE);
}
if (HDFA_ERRNO (test))
{
fprintf (stderr, &quot;ERROR NUMBER = %d\n&quot;, HDFA_ERRNO (test));
hre_free (test);
}
/* 찾기.  반환값이 -1 이 아닐 경우 패턴을 찾은 것이며, 반환값은 찾은 패턴의
끝을 가르키고 있다.  */
i = hre_search (test, str);
if (i == -1)
{
printf (&quot;패턴과 맞는 문자열을 찾지 못하였습니다.\n&quot;);
return (FATAL_EXIT_CODE);
}
/* 메모리 릴리즈 */
hre_free (test);
printf (&quot;입력한 정규 표현식 : %s\n&quot;, re);
printf (&quot;비교한 문자열      : %s\n&quot;, str);
printf (&quot;찾은 위치          : %d\n&quot;, i);
return (SUCCESS_EXIT_CODE);
}

1.2.2. HRE 개발자 문서

(hre를 다른 곳에 응용 및 포팅을 하실 분들은 이 문서를 참조하세요.)

1.2.2.1. HRE CVS build 방법

CVS 에 존재하는 최신의 패키지를 다운로드 받아 설치하는 부분까지 설명을 하였다.
$ mkdir temporary
$ cd temporary
우선 임의의 빈 디렉토리를 생성한다.
$ CVSROOT=:ext:username@cvs.kldp.net:/cvsroot/hgre
개발자일 경우, 위와 같이 설정하고, Anonymous 일 경우 아래와 같이 설정한다.
$ CVSROOT=:pserver:anonymous@cvs.kldp.net:/cvsroot/hre
$ cvq -q login
Anonymous 일 경우, 로그인 할 때 암호를 묻는데, 그냥 엔터치면 된다. 이후부터는 그대로 입력해도 무방할 것이다.
$ cvs -q checkout -P hre
$ cd hre
$ aclocal
$ autoheader
$ automake -a
위의 automake 를 실행하는 과정에서 오류가 발생할 수 있는데, 오류가 발생할 경우, 다시 한번 더 실행해 주면 된다. 오류가 발생하지 않을 때 까지 실행한다.
$ autoconf
$ ./configure
$ make
$ make check

1.2.2.2. HRE 처리 절차

hre 에서 사용자 입력을 받아들여 DFA 테이블을 만드는 과정은 다음과 같다.
  • 사용자 입력 해석 단계 (parser)
    이 단계에서는 사용자 (정규 표현식 라이브러리를 자신의 app 에 사용하는 사람) 가 입력한 정규 표현식을 해석하여, "표현식" 을 만들어 내는데, 이러한 표현식은 debug_equation () 함수를 통해서 출력해 볼 수 있다.
  • 멀티 바이트 코드 분리 단계
    이 단계에서는 앞에서 만든 "표현식" 을 바탕으로 재귀 호출을 하며 IDENTIFIER 가 1 바이트 이상인지, 즉, 한글 코드 (조합형, (확장) 완성형, 유니코드) 인지를 확인한 후, 이것은 바이트 순서대로 "표현식" 을 수정하게 된다. 즉 한글의 DFA 생성방법과 영어의 DFA 생성방법에는 약간의 차이가 존재한다.
  • 상태도 (automata) 생성 단계
    앞에서 생성한 "표현식"을 바탕으로 "상태도"를 만드는 단계로 debug_state () 함수를 통해서 확인할 수 있다.
  • 합병 (merging) 단계
    상태도에 대한 합병을 하여, 테이블 크기를 최대한 줄인다.
  • DFA 생성 단계
    위에서 생성한 "상태도" 를 바탕으로 hre_t 에 실질적인 DFA 테이블을 넣는다.

1.2.2.3. Debugging

입력된 정규 표현식은 b가*a 이다.
  • 사용자 입력 해석 단계 (parser)
    [aso@debian /My_All/dev/hre]
    $ gdb hre
    GNU gdb 6.0
    Copyright 2003 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i686-pc-linux-gnu"...
    (gdb) b hre_apply_multi_form
    Breakpoint 1 at 0x80498ad: file hre.c, line 616.
    (gdb) r
    Starting program: /My_All/dev/hre/hre
    Breakpoint 1, hre_apply_multi_form (p=0x80cc8d8, last_rhs=5) at hre.c:616
    616       if (EQU_VALUE (TREE_EQU_TAB_N (p, last_rhs)))
    (gdb) p debug_equation (p, p.last_rhs, 0)
    E5   -> E0 & E4
    E0   -> b
    E4   -> E2 & E3
    E2   -> E1 *
    E1   -> 가
    E3   -> a
    $1 = void
    (gdb)
    
  • 멀티 바이트 코드 분리 단계
    [aso@debian /My_All/dev/hre]
    $ gdb hre
    GNU gdb 6.0
    Copyright 2003 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i686-pc-linux-gnu"...
    (gdb) b hre_form_state
    Breakpoint 1 at 0x804a0a0: file hre.c, line 807.
    (gdb) r
    Starting program: /My_All/dev/hre/hre
    Breakpoint 1, hre_form_state (p=0x80cc8d8) at hre.c:807
    807       TREE_ITEM_BUF (p) = 0;
    (gdb) p debug_equation (p, p.last_rhs, 0)
    E5   -> E0 & E4
    E0   -> b
    E4   -> E2 & E3
    E2   -> E1 *
    E1   -> E8 | E9
    E8   -> E6 & E7
    E6   -> 0xb0
    E7   -> 0xa1
    E9   -> [zero]
    E3   -> a
    $1 = void
    (gdb)
    
  • 상태도 (automata) 생성 단계 (hre_form_state () 함수 끝부분에서 호출될 경우, 전체 리스트를 출력한다.)
(gdb) b hre_form_state
....
....
(gdb) p debug_state (p, sp)
-------+-------+-------+-------+-------+-------+-------+------
클래스 |길이   |*SList | SMRL  |Empty  |Shift  |Sh.lhs |Sh.rhs
-------+-------+-------+-------+-------+-------+-------+------
3 |     1 | 14  0 | 0000  |     0 |     1 | 0xa1    |  1
2 |     1 | 11  0 | 0000  |     1 |     0 |       |
1 |     1 |  4  0 | 0000  |     0 |     2 |  a 0xb0 |  2  3
0 |     1 |  5  0 | 0000  |     0 |     1 |  b    |  1
-------+-------+-------+-------+-------+-------+-------+------
(gdb)

1.3. 다운로드 및 CVS

* [http]http://kldp.net/project/showfiles.php?group_id=497 에서 다운로드 가능 * [http]http://kldp.net/scm/?group_id=497 에서 CVS 확인 가능

1.3.1. 릴리즈 정보

1.3.2. v0.9.8a

* 솔리리스에서 발생하는 버그 제거.

1.3.3. v0.9.8

  • ERE 준수.
  • ERE 표준 준수 테스트 룰셋
  • 기존 test suite 교체.

1.3.4. v0.9.7

  • $ 메타문자 처리 추가.
  • . 메타문자 처리 추가.
  • ^ 메타문자 처리 추가.
  • [^ ~ ] 메타문자 처리 추가.
  • hre_search () 내 버그 수정.

1.3.5. v0.9.6f

* 한글 범위 표현식 속도 개선 (<ㄱ-ㅎ,ㅏ-ㅣ,ㄱ-ㅎ> 의 완성형은 1 초, 유니코드는 3~4초가 소유.) * 유니코드 및 완성형 테이블 정보 수정.

1.3.6. v0.9.6e

* libhre.a 뿐만 아니라, libhre.so 파일 생성.

1.3.7. v0.9.6d

* autoconf 화된 HRE 버전이다. (make install 시 /usr/local/include/, /usr/local/lib/ 하위 디렉토리에 hre.h 파일과 libhre.a 파일이 각각 복사된다.)

1.3.8. v0.9.6a

* 한글 범위 표현식 속도 개선.

1.3.9. v0.9.6

* 한글 범위 표현식에서 지원하지 않던 유니코드 지원. (이제 지원하는 모든 표현식에서 확장 완성형과, 유니코드를 사용할 수 있음.)

1.3.10. v0.9.5a

* Cygwin 에서 작업하다 생긴 CRLF 제거. (버그 리포팅을 해주신 이재홍님에게 감사드립니다.)

1.3.11. v0.9.5

* 버그가 없는 한 마지막 릴리즈가 될 것입니다. (제가 생각한 정규식 모양은 모두 갖추어졌기 때문에 마지막으로 생각한 것입니다.) * 테스트 룰셋을 작성할 수 있는 기반 마련 * 예외 상황에 대한 오류 복구 기능 추가 * 정규 표현식 조합에서 오류 수정

1.3.12. v0.9

* 한글 정규 표현식 (<ㄱ,ㅏ,ㅁ> 형태) 지원 (경축) * 메타문자 지원 * ( ) 메타문자 지원 * 몇몇 메모리 관련 버그 제거

1.3.13. v0.8.1

* 이민철님이 알려주신 bug 수정 및 다른 기타 메모리 leak 제거.

1.3.14. v0.8

* 인식할 수 있는 token 의 제한이 있음. 자세한 사항은 HRE 사용자 문서 를 참조 바람. * 정규식이 완성형, 조합형, 유니코드로 이루어지더라도 정확한 DFA 테이블 생성. * 정적 라이브러리 구성. (정규 표현식 라이브러리를 이용한 sample 파일 존재.)

2. 라이센스 및 개발자 정보

Hangeul Regular Expression
Copyright (C) 2001 Weongyo Jeong & Hyejin Soang
This program is  free software; you can  redistribute it and/or modify
it under the terms  of the GNU General Public  License as published by
the  Free Software Foundation; either version  2,  or (at your option)
any later version.
This program is distributed  in the hope that  it will be  useful, but
WITHOUT    ANY  WARRANTY;  without   even   the  implied  warranty  of
MERCHANTABILITY  or  FITNESS FOR  A PARTICULAR   PURPOSE.  See the GNU
General Public License for more details.
You should  have received a  copy of  the GNU  General Public  License
along with   this  program; if   not,  write  to   the Free   Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Contact : Weongyo Jeong  - weongyo@hotmail.com
Hyejin Soang   - redcloak@empal.com



sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2005-10-04 12:06:12
Processing time 0.0161 sec