Creación de un analizador en C

Antes de empezar

Una biblioteca de implementación cargable, o LIL, es el módulo de implementación para un analizador (o nodo) C. Una LIL es un objeto Linux o UNIX compartido o una biblioteca de enlaces dinámicos (DLL) Windows, que no tiene la extensión de archivo .dll sino .lil.

Las funciones de implementación que el desarrollador tiene que escribir se listan en el apartado Funciones de implementación de analizador en C. Las funciones de programa de utilidad que WebSphere Message Broker proporciona para ayudar en este proceso se listan en el apartado Funciones de programa de utilidad de analizador en C.

WebSphere Message Broker proporciona el origen para un analizador definido por el usuario de ejemplo denominado BipSampPluginParser.c. Se trata de un analizador pseudo XML simple que se puede utilizar en su estado actual o que se puede modificar.

La tarea de escribir un analizador varía considerablemente de acuerdo con la complejidad de la corriente de bits que se debe analizar. Aquí sólo se describen los pasos básicos. Se describen en los apartados siguientes:
  1. Definición del analizador durante la inicialización del intermediario
  2. Creación de una instancia del analizador
  3. Supresión de una instancia del analizador definido por el usuario

Definición del analizador durante la inicialización del intermediario

La función de inicialización de analizador definida por el usuario se invoca automáticamente durante la inicialización de intermediario. El analizador definido por el usuario es responsable de:
  • Crear y denominar la fábrica de analizador de mensajes implementada por el analizador definido por el usuario. La fábrica de analizador es un contenedor para implementaciones de analizador relacionadas. Los nombres de fábrica de analizador deben ser exclusivos en un intermediario.
  • Definir los nombres de clase de analizador de mensajes soportados y proporcionar un puntero a una tabla de funciones virtual que contenga punteros a las funciones de implementación de analizador definido por el usuario. Los nombres de clase de analizador deben ser exclusivos en un intermediario.

Cada LIL que implementa un analizador definido por el usuario debe exportar una función denominada bipGetParserFactory como función de inicialización. La función de inicialización define el nombre de la fábrica que el analizador definido por el usuario soporta y las clases de objetos, u objetos compartidos, soportados por la fábrica.

La función de inicialización también debe crear el objeto de fábrica y define los nombres de todos los analizadores soportados por la LIL. Una fábrica puede soportar cualquier número de clases de objeto (analizadores). Cuando se define un analizador, se pasa al intermediario una lista de punteros a las funciones de implementación para dicho analizador. Si ya existe un analizador con el mismo nombre, se rechaza la petición.

Por ejemplo, para definir el analizador:
  1. Exporte la función de inicialización bipGetParserFactory:
    void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory()
    {
  2. Declare las variables:
     CciFactory*     factoryObject;
      int             rc;
      static CPI_VFT  vftable = {CPI_VFT_DEFAULT};
  3. Inicialice todas las constantes estáticas:
      initParserConstants();
  4. Configurar tabla de funciones con punteros a funciones de implementación de analizador:
      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;

Entonces la función de inicialización debe crear una fábrica de analizador invocando cpiCreateParserFactory. Las clases de analizador soportadas por la fábrica se definen invocando cpiDefineParserClass. La dirección del objeto de fábrica (devuelto por cpiCreateParserFactory) se debe devolver al intermediario como valor de retorno desde la función de inicialización.

Por ejemplo:
  1. Cree la fábrica de analizador utilizando la función cpiCreateParserFactory:
      factoryObject = cpiCreateParserFactory(&rc, constParserFactory);
      
  2. Defina las clases de mensaje soportadas por la fábrica utilizando la función cpiDefineParserClass:
    if (factoryObject) {
       cpiDefineParserClass(&rc, factoryObject, constPXML, &vftable);
      }
    else {
        /* Error: No se ha podido crear fábrica de analizador */
      }
  3. Devuelva la dirección de este objeto de fábrica al intermediario:
      return(factoryObject);
    }

Creación de una instancia del analizador

Siempre que se crea una instancia de un objeto de analizador definido por el usuario, el intermediario de mensajes invoca la función de implementación de creación de contexto cpiCreateContext. Esto permite al analizador definido por el usuario asignar datos de instancia asociados con el analizador.

Por ejemplo:
  1. Invoque cpiCreateContext:
    CciContext* cpiCreateContext(
      CciParser* parser
    ){
      PARSER_CONTEXT_ST *p;
    
  2. Asigne un puntero al contexto local:
      p = (PARSER_CONTEXT_ST *)malloc(sizeof(PARSER_CONTEXT_ST));
    
  3. Borre el área de contexto:
      if (p) {
         memset(p, 0, sizeof(PARSER_CONTEXT_ST));
        }
      else {
        /* Error: No se ha podido asignar memoria */
      }
  4. Devuelva el puntero al contexto local:
      return((CciContext*)p);
    }

Supresión de una instancia del analizador definido por el usuario

Para suprimir una instancia de un analizador, utilice la función cpiDeleteContext. Por ejemplo:
void cpiDeleteContext(
  CciParser*  parser,
  CciContext* context
){
  PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
  int                rc = 0;

  return;
}
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2005 Última actualización: 11/11/2005
as10010_