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. 구문 분석기의 인스턴스 삭제

구문 분석기 선언 및 정의

브로커에 사용자 정의 구문 분석기를 선언 및 정의하려면 초기화 함수인 bipGetParserFactory를 LIL에 반드시 포함해야 합니다. 다음 단계는 브로커가 초기화 함수를 호출하는 방법 및 초기화 함수가 사용자 정의 구문 분석기를 선언하고 정의하는 방법을 간략히 설명합니다.

다음 프로시저에서는 구문 분석기를 브로커에 선언 및 정의하는 방법을 보여줍니다.

  1. LIL이 운영 체제에 로드되어 초기화된 후, 브로커는 초기화 함수 bipGetParserFactory를 호출합니다. 브로커는 LIL이 수행할 수 있는 사항과 브로커가 LIL을 호출하는 방법을 이해하기 위해 이 함수를 호출합니다. 예를 들면 다음과 같습니다.
    CciFactory LilFactoryExportPrefix * LilFactoryExportSuffix
    bipGetParserFactory()
  2. 그런 다음, bipGetParserFactory 함수는 유틸리티 함수 cpiCreateParserFactory를 호출합니다. 이 함수는 LIL이 지원하는 모든 구문 분석기의 고유 팩토리 이름(또는 그룹 이름)을 내보냅니다. 다시 전달되는 모든 팩토리 이름(또는 그룹 이름)은 브로커의 모든 LIL에서 고유해야 합니다.
  3. 그런 다음, LIL은 유틸리티 함수 cpiDefineParserClass를 호출하여 각 구문 분석기의 고유 이름 및 구현 함수 주소의 가상 함수 테이블을 전달해야 합니다.
    예를 들면, 다음 코드는 InputxParser라는 단일 구문 분석기를 선언 및 정의합니다.
    {
    	CciFactory* factoryObject;
    	int rc = 0;
    	CciChar factoryName[] = L"MyParserFactory";
    	CCI_EXCEPTION_ST exception_st;
    
    /* Create the Parser Factory for this parser */
    	factoryObject = cpiCreateParserFactory(0, factoryName);
    	if (factoryObject == CCI_NULL_ADDR) {
    		
    			/* Any local error handling can go here */
    	}
    	else {
    		/* Define the parsers supported by this factory */
    	static CNI_VFT vftable = {CNI_VFT_DEFAULT};
    
      /* Setup function table with pointers to parser implementation functions */
      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;
    
    	cpiDefineParserClass(0, factoryObject, L"InputxParser", &vftable);
    	}
    
    	/* Return address of this factory object to the broker */
    	return(factoryObject);
    }

    초기화 함수는 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 함수를 호출합니다. 사용자 정의 구문 분석기를 사용하는 세 개의 메시지 플로우가 있을 경우, 각각에 대해 cpiCreateContext 함수가 호출됩니다. 이 함수는 구성된 속성의 값을 보유할 사용자 정의 구문 분석기의 인스턴스화를 위한 메모리를 할당합니다. 예를 들면 다음과 같습니다.
  1. cpiCreateContext 함수를 호출합니다.
    CciContext* _createContext(
        CciFactory* factoryObject,
      CciChar* parserName,
      CciNode* parserObject
    ){
      static char* functionName = (char *)"_createContext()";
      PARSER_CONTEXT_ST* p;
        CciChar          buffer[256];
  2. 로컬 컨텍스트에 포인터를 할당하고 컨텍스트 영역을 지웁니다.
      p = (PARSER_CONTEXT_ST *)malloc(sizeof(PARSER_CONTEXT_ST));
    
      if (p) {
         memset(p, 0, sizeof(PARSER_CONTEXT_ST));
  3. 구문 분석기 오브젝트 포인터를 컨텍스트에 저장합니다.
       p->parserObject = parserObject;
  4. 구문 분석기 이름을 저장합니다.
     CciCharNCpy((CciChar*)&p->parserName, parserName, MAX_NODE_NAME_LEN);
  5. 구문 분석기 컨텍스트로 되돌아갑니다.
    return (CciContext*) p;

구문 분석기의 인스턴스 삭제

메시지 플로우가 재전개될 때 또는 실행 그룹 프로세스가 정지될 때 구문 분석기가 폐기됩니다(mqsistop 명령 사용). 구문 분석기가 폐기될 때는 사용된 모든 메모리를 비우고 보유 자원을 모두 해제해야 합니다. cpiDeleteContext 함수를 사용하여 이 작업을 수행할 수 있습니다. 예를 들면 다음과 같습니다.

void cpiDeleteContext(
    CciParser*      parser,
    CciContext* context
){
    PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
    int                rc = 0;

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