시작하기 전에
사용자 정의 구문 분석기가 입력 메시지를 구문 분석해야 하는 경우, 브로커는 입력 함수를 호출합니다. 구문 분석기는 소유를 요구하는 입력 비트스트림 버퍼의 양을 브로커에 알려야 합니다. 고정 크기 헤더의 경우, 구문 분석기는 헤더 크기를 요구합니다. 구문 분석기가 메시지 전체를 핸들링하려고 한 경우 버퍼의 나머지를 요구합니다.
int cpiParseBufferEncoded( CciParser* parser, CciContext* context, int encoding, int ccsid ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc;
pc->iBuffer = (void *)cpiBufferPointer(&rc, parser); pc->iIndex = 0;
pc->iEncoding = encoding; pc->iCcsid = ccsid;
pc->iSize = cpiBufferSize(&rc, parser);
pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex);
pc->iCurrentElement = cpiRootElement(&rc, parser);
pc->iInTag = 0;
return(pc->iSize); }
일반 구문 분석 함수(예: cpiParseFirstChild)는 ESQL 또는 Java 표현식을 평가하기 위해 구문 요소 트리가 작성되어야 할 때 브로커가 호출하는 함수입니다. 예를 들어, 필터 노드는 ESQL 표현식에 ESQL 필드 참조를 사용합니다. 표현식을 평가하려면 이 필드 참조를 해석해야 합니다. 요청된 요소가 작성되거나 존재하지 않음을 구문 분석기가 알 때까지 구문 분석기의 일반 구문 분석 함수가 반복적으로 호출됩니다.
void cpiParseFirstChild( CciParser* parser, CciContext* context, CciElement* element ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc; if ((!cpiElementCompleteNext(&rc, element)) && (cpiElementType(&rc, element) == CCI_ELEMENT_TYPE_NAME)) { while ((!cpiElementCompleteNext(&rc, element)) && (!cpiFirstChild(&rc, element)) && (pc->iCurrentElement)) { pc->iCurrentElement = parseNextItem(parser, context, pc->iCurrentElement); } } return; }
사용자 정의 구문 분석기가 구문을 직렬화해야 하는 경우, 브로커는 출력함수를 호출합니다. 예를 들어, Compute 노드는 사용자 정의 구문 분석기 도메인에 트리를 작성했을 수 있습니다. 예를 들어, MQOutput 노드에 의해 이 트리가 출력되어야 하는 경우, 구문 분석기는 출력 비트스트림 버퍼에 빌드된 트리를 나타내는 데이터를 추가하는 작업을 담당합니다.
int cpiWriteBufferEncoded( CciParser* parser, CciContext* context, int encoding, int ccsid ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int initialSize = 0; int rc = 0; const void* a; CciByte b; initialSize = cpiBufferSize(&rc, parser); a = cpiBufferPointer(&rc, parser); b = cpiBufferByte(&rc, parser, 0); cpiAppendToBuffer(&rc, parser, (char *)"Some test data", 14); return cpiBufferSize(0, parser) - initialSize; }
일반적으로 수신되는 메시지 데이터는 단일 메시지 형식이므로, 하나의 구문 분석기가 메시지 컨텐츠 전체를 구문 분석합니다. 필요한 구문 분석기의 클래스 이름은 입력 메시지 MQMD 또는 MQRFH2 헤더의 형식 필드에 정의됩니다.
그러나, 메시지는 여러 형식으로 구성되어야 합니다. 예를 들어, 한 가지 형식의 헤더가 오면 그 다음에 다른 형식의 데이터가 와야 합니다. 이 경우, 첫 번째 구문 분석기가 체인의 다음 형식을 담당하는 구문 분석기의 클래스 이름을 식별하는 방식입니다. 사용자 정의 구문 분석기에서, 브로커는 다중 메시지 형식을 구성하는 메시지를 찾아 구문 분석기 클래스의 체인 아래로 탐색해야 하는 경우 구현 함수 cpiNextParserClassName을 호출합니다.
사용자 정의 구문 분석기가 다중 메시지 형식의 일부인 메시지 형식의 구문 분석을 지원하는 경우, 사용자 정의 구문 분석기는 반드시 cpiNextParserClassName 함수를 구현해야 합니다.
void cpiNextParserClassName( CciParser* parser, CciContext* context, CciChar* buffer, int size ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc = 0;
CciCharNCpy(buffer, pc->iNextParserClassName, size); return; }