C でのパーサーの作成

始める前に

以下のトピックを読み、理解していることを確認してください。

ロード可能インプリメンテーション・ライブラリー、または LIL、 は C パーサー (またはノード) のインプリメンテーション・モジュールです。 LIL は、ファイル拡張子が .dll ではなく .lil である、Linux または UNIX 共有オブジェクトまたは Windows ダイナミック・リンク・ライブラリー (DLL) です。

開発者が作成する必要のあるインプリメンテーション関数は、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. すべての静的定数を初期化します。
        initParserConstants();
  4. パーサー・インプリメンテーション関数へのポインターが含まれた関数表をセットアップします。
      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 Last updated: 11/07/2005
as10010_