C로 구문 분석기 작성

시작하기 전에

LIL(loadable implementation library)는 C 구문 분석기(또는 노드)용 구현 모듈입니다. LIL은 Linux 또는 UNIX 공유 오브젝트 또는 Windows DLL(Dynamic Link Library)로서, 파일 확장자가 .dll이 아닌 .lil을 가집니다.

개발자가 작성해야 하는 구현 함수는 C 구문 분석기 구현 함수에 나열되어 있습니다. 이 프로세스를 돕기 위해 WebSphere Message Broker가 제공하는 유틸리티 함수는 C 구문 분석기 유틸리티 함수에 나열되어 있습니다.

WebSphere Message Broker는 BipSampPluginParser.c라고 하는 샘플 사용자 정의 구문 분석기 소스를 제공합니다. 이 소스는 그대로 사용하거나 수정하여 사용할 수 있는 간단한 가상 XML 구문 분석기입니다.

구문 분석기 쓰기 작업은 구문 분석할 비트스트림의 복잡도에 따라 상당히 달라집니다. 여기서는 기본 단계에 대해서만 설명합니다. 이것은 다음 절에 설명되어 있습니다.
  1. 브로커 초기화 중 구문 분석기 정의
  2. 구문 분석기의 인스턴스 작성
  3. 사용자 정의 구문 분석기 인스턴스 삭제

브로커 초기화 중 구문 분석기 정의

사용자 정의 구문 분석기 초기화 함수는 브로커 초기화 중 자동으로 호출됩니다. 사용자 정의 구문 분석기의 역할은 다음과 같습니다.
  • 사용자 정의 구문 분석기가 구현하는 메시지 구문 분석기 팩토리를 작성하고 이름을 지정합니다. 구문 분석기 팩토리는 관련 구문 분석기 구현용 컨테이너입니다. 구문 분석기 팩토리 이름은 브로커 내에서 고유해야 합니다.
  • 지원되는 메시지 구문 분석기 클래스 이름을 정의하고, 사용자 정의 구문 분석기 구현 함수를 가리키는 포인터가 들어 있는 가상 함수 테이블을 가리키는 포인터를 제공합니다. 구문 분석기 클래스 이름은 브로커 내에서 고유해야 합니다.

사용자 정의 구문 분석기를 구현하는 각 LIL은 bipGetParserFactory 함수 및 해당 초기화 함수를 내보내야 합니다. 초기화 함수는 사용자 정의 구문 분석기가 지원하는 팩토리 이름, 오브젝트 클래스 또는 팩토리가 지원하는 공유 오브젝트를 정의합니다.

또한 초기화 함수는 팩토리 오브젝트를 작성하고 LIL이 지원하는 모든 구문 분석기의 이름을 정의해야 합니다. 팩토리는 무제한의 오브젝트 클래스(구문 분석기)를 지원할 수 있습니다. 구문 분석기가 정의될 때, 해당 구문 분석기의 구현 함수를 가리키는 포인터 목록이 브로커로 전달됩니다. 같의 이름의 구문 분석기가 이미 존재할 경우, 요청이 거부됩니다.

예를 들어, 구문 분석기를 정의하려면 다음을 수행하십시오.
  1. bipGetParserFactory 초기화 함수를 내보냅니다.
    void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory()
    {
  2. 변수를 선언합니다.
     CciFactory*     factoryObject;
      int             rc;
      static CPI_VFT  vftable = {CPI_VFT_DEFAULT};
  3. 모든 static 상수를 초기화합니다.
      initParserConstants();
  4. Setup functio구문 분석기 구현 함수를 가리키는 포인터로 함수 테이블을 설정합니다.
        vftable.iFpCreateContext            = cpiCreateContext;
        vftable.iFpParseBufferEncoded       = cpiParseBufferEncoded;
        vftable.iFpParseFirstChild          = cpiParseFirstChild;
        vftable.iFpParseLastChild           = cpiParseLastChild;
        vftable.iFpParsePreviousSibling     = cpiParsePreviousSibling;
        vftable.iFpParseNextSibling         = cpiParseNextSibling;
        vftable.iFpWriteBufferEncoded       = cpiWriteBufferEncoded;
        vftable.iFpDeleteContext            = cpiDeleteContext;
        vftable.iFpSetElementValue          = cpiSetElementValue;
        vftable.iFpElementValue             = cpiElementValue;
        vftable.iFpNextParserClassName      = cpiNextParserClassName;
        vftable.iFpSetNextParserClassName   = cpiSetNextParserClassName;
        vftable.iFpNextParserEncoding       = cpiNextParserEncoding;
        vftable.iFpNextParserCodedCharSetId = cpiNextParserCodedCharSetId;

초기화 함수는 cpiCreateParserFactory를 호출하여 구문 분석기 팩토리를 작성해야 합니다. 팩토리가 지원하는 구문 분석기 클래스는 cpiDefineParserClass를 호출하여 정의됩니다. 팩토리 오브젝트의 주소(cpiCreateParserFactory가 리턴)가 초기화 함수의 리턴 값으로서 브로커에 리턴되어야 합니다.

예를 들면, 다음과 같습니다.
  1. cpiCreateParserFactory 함수를 사용하여 구문 분석기 팩토리를 작성합니다.
        factoryObject = cpiCreateParserFactory(&rc, constParserFactory);
      
  2. cpiDefineParserClass 함수를 사용하여 팩토리가 지원하는 메시지 클래스를 정의합니다.
    if (factoryObject) {
          cpiDefineParserClass(&rc, factoryObject, constPXML, &vftable);
      }
    else {
            /* Error: Unable to create parser factory */
      }
  3. 이 팩토리 오브젝트의 주소를 브로커로 리턴합니다.
        return(factoryObject);
    }

구문 분석기의 인스턴스 작성

사용자 정의 구문 분석기 오브젝트의 인스턴스가 작성될 때마다, 메시지 브로커는 컨텍스트 작성 구현 함수 cpiCreateContext를 호출합니다. 그러면 사용자 정의 구문 분석기는 구문 분석기와 연관된 인스턴스 데이터를 할당할 수 있게 됩니다.

예를 들면, 다음과 같습니다.
  1. cpiCreateContext를 호출합니다.
    CciContext* cpiCreateContext(
        CciParser* parser
    ){
        PARSER_CONTEXT_ST *p;
    
  2. 로컬 컨텍스트에 포인터를 할당합니다.
      p = (PARSER_CONTEXT_ST *)malloc(sizeof(PARSER_CONTEXT_ST));
    
  3. 컨텍스트 영역을 지웁니다.
      if (p) {
         memset(p, 0, sizeof(PARSER_CONTEXT_ST));
        }
      else {
        /* Error: Unable to allocate memory */
      }
  4. 로컬 컨텍스트로 포인터를 다시 가져갑니다.
      return((CciContext*)p);
    }

사용자 정의 구문 분석기 인스턴스 삭제

구문 분석기 인스턴스를 삭제하려면 cpiDeleteContext 함수를 사용하십시오. 예를 들면, 다음과 같습니다.
void cpiDeleteContext(
    CciParser*      parser,
    CciContext* context
){
    PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
    int                rc = 0;

    return;
}
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2005 마지막 갱신 날짜: 11/08/2005
as10010_