카피북 파서 참조

Mainframe Connector는 표준 COBOL 카피북을 지원하는 ANTLR4 기반 파서를 사용합니다.

이 문서에서는 카피북 파서에서 수행하는 사전 처리 작업, 지원되는 데이터 유형 및 사용 제한사항, qsam decode 및 qsam encode 명령어로 트랜스코더 구성을 사용하여 구성 필드 수정자를 구성하는 방법을 설명합니다.

사전 처리

카피북을 파싱하기 전에 카피북 파서는 데이터를 사전 처리하고 다음 단계를 수행합니다.

  • 주석 줄(7열의 * 또는 인라인 *> 및 *>CE 주석)을 삭제합니다.
  • 줄 연속(7열의 - 뒤에 따옴표로 묶인 리터럴)을 해결합니다.
  • 시퀀스 넘버 영역(열 1~6)과 열 73 이상을 비웁니다. 코드는 8열 이상에서 시작해야 합니다.
  • EJECT, SKIP1, SKIP2, SKIP3, TITLE와 같은 전처리기 관련 문을 보존합니다. 이러한 문은 파싱되지만 무시됩니다. COPY REPLACING에서 사용할 수 있는 전처리기 매개변수가 포함된 카피북은 카피북 파서에서 지원되지 않습니다. 이러한 카피북에서 식별자는 콜론(:)으로 묶입니다.

지원되는 데이터 유형 및 제한사항

다음은 카피북 파서에서 지원하는 데이터 유형과 사용 제한사항입니다.

  • 복사 장부에는 단일 최상위 01 레코드만 허용되며 01 레코드에는 OCCURS 절이 있을 수 없습니다.
  • 레벨 66(RENAMES/별칭) 및 레벨 77(독립형) 필드는 지원되지 않습니다. 88 수준(조건 이름)은 파싱되고 무시됩니다.
  • 모든 기본(비그룹) 필드에는 16진수 부동 소수점 필드(COMP-1 및 COMP-2)를 제외하고 PICTURE 절이 있어야 합니다. 다음 PICTURE 필드가 지원됩니다.
    • 알파벳(PIC A), 영숫자(PIC X), 영숫자 수정(A, X, 9, B, 0, /)
    • PIC G(DBCS, USAGE DISPLAY-1 필요)
    • PIC N(국가 또는 DBCS) 및 국가 수정(N, B, 0, /)
    • PIC U BYTE-LENGTH n를 포함한 PIC U(UTF-8)
    • 숫자(9, S, V) 및 숫자 수정($, B, /, V, Z, 0, 9, ,, ., *, +, -, CR, DB). PIC P(확장 위치)는 지원되지 않습니다.
    • 정밀도가 최대 18인 영역 십진수 및 압축 십진수 필드는 64비트 유형(LONG 또는 DECIMAL64)으로 디코딩되고, 정밀도가 더 높은 필드는 임의 정밀도 유형(BIG_INTEGER 또는 BIG_DECIMAL)으로 디코딩됩니다. schema_validation_mode가 BIG_QUERY로 설정된 경우 지원되는 최대 정밀도는 76(BIGNUMERIC)이고 최대 소수 자릿수는 38입니다(POSTGRES의 경우 최대 정밀도는 147,455이고 최대 소수 자릿수는 16,383이며, MYSQL의 경우 최대 정밀도는 65이고 최대 소수 자릿수는 30임).
  • IBM 16진수 부동 소수점(HFP)은 COMP-1/COMPUTATIONAL-1(단정밀도, 4바이트) 및 COMP-2/COMPUTATIONAL-2(배정밀도, 8바이트)를 사용하거나 트랜스코더 구성에서 hfp 필드 수정자를 적용하여 지원됩니다.
  • REDEFINES 절은 재정의된 모든 변형의 바이트 크기가 동일한 경우 정적 크기 필드에서 지원됩니다. 재정의된 필드는 OCCURS DEPENDING ON 절의 길이 필드 또는 null_if 수정자의 target_field로 참조할 수 없습니다.
  • OCCURS 절은 고정 길이 배열(OCCURS n TIMES), 동적 길이 배열(OCCURS min TO max TIMES DEPENDING ON field), 패킹된 동적 길이 배열(OCCURS UNBOUNDED DEPENDING ON field)에 지원됩니다. OCCURS 절의 ASCENDING/DESCENDING KEY 및 INDEXED BY 구문은 지원되지 않으며 DEPENDING ON는 범위 내의 필드 이름을 참조해야 합니다.
  • 다음 USAGE 절만 지원됩니다.
    • DISPLAY(영숫자 및 영역 십진수 필드의 기본값)
    • DISPLAY-1 (DBCS)
    • NATIONAL(PIC N 필드의 기본값, UTF-16BE로 인코딩됨)
    • UTF-8(PIC U 필드의 기본값)
    • BINARY, COMP, COMPUTATIONAL, COMP-4, COMPUTATIONAL-4, COMP-5, COMPUTATIONAL-5
    • COMP-3, COMPUTATIONAL-3, PACKED-DECIMAL
    • COMP-1, COMPUTATIONAL-1, COMP-2, COMPUTATIONAL-2
  • DATE 및 TIMESTAMP는 트랜스코더 구성을 사용하여 지원됩니다.
  • null 표시기는 트랜스코더 구성을 사용하여 지원됩니다.
  • 더블 바이트 문자 집합(DBCS) 필드 PIC G 및 PIC N가 지원됩니다. 기본적으로 USAGE 절이 없는 PIC N 필드에는 USAGE NATIONAL(UTF-16BE)가 할당됩니다. PIC N 필드를 DBCS로 사용하려면 카피북에 USAGE DISPLAY-1를 지정하거나 트랜스코더 구성에서 문자 인코딩을 재정의합니다.
  • 가변 길이 문자열은 트랜스코더 구성을 사용하여 지원됩니다.
  • SIGN 절(LEADING, TRAILING, SEPARATE CHARACTER)이 지원됩니다.
  • 주석이 지원됩니다.

날짜 및 타임스탬프 필드 지원

Mainframe Connector는 트랜스코더 구성(--transcode-configuration)에서 format_date 및 format_timestamp 필드 수정자를 사용하여 날짜 및 타임스탬프 필드의 디코딩 및 인코딩을 지원합니다. field_suffixes를 사용하여 일치하는 필드에 이러한 수정자를 적용하거나 field_overrides를 사용하여 특정 필드에 적용할 수 있습니다.

{
  "field_suffixes": [
    {
      "suffix": "SUFFIX_STRING",
      "modifier": {
        "format_date": {
          "formats": [
            {
              "size": FIELD_SIZE,
              "pattern": "FORMAT_PATTERN"
            }
          ]
        }
      }
    }
  ]
}

다음 목록에서는 구성 속성을 자세히 설명합니다.

  • suffix: 이름이 -SUFFIX_STRING 또는 _SUFFIX_STRING로 끝나는 모든 카피북 필드와 일치합니다(대소문자를 구분하지 않음). suffix에 선행 하이픈이나 밑줄이 포함되지 않았는지 확인합니다. 또는 field_overrides를 "field": "FIELD_NAME"와 함께 사용하여 개별 필드를 타겟팅합니다.
  • format_date / format_timestamp: 필드를 파싱하거나 형식을 지정하는 데 사용되는 수정자를 정의합니다.
    • format_date는 크기가 지정된 문자열 필드(PIC X) 또는 정수 숫자 필드(예: PIC 9(n), COMP 또는 COMP-3, 소수 자릿수 0, 정밀도 최대 18, 형식 지정 전에 부호 없는 문자열 표현으로 동적으로 변환됨)에 적용할 수 있습니다.
    • format_timestamp는 크기가 지정된 문자열 필드(PIC X)에 적용할 수 있습니다. 타임스탬프는 시간대 또는 오프셋이 패턴에 포함되지 않는 한 UTC로 해석됩니다.
  • formats: DateTimeFormat 객체 목록으로, 각 객체는 다음을 지정합니다.
    • size: 패턴이 적용되는 필드의 크기입니다(문자열 필드의 경우 바이트 길이, 숫자 필드의 경우 정밀도).
    • pattern: 날짜 또는 타임스탬프 패턴입니다. 디코딩(qsam decode) 중에 필드 크기와 일치하는 형식이 일치할 때까지 순서대로 평가됩니다. 인코딩(qsam encode) 중에는 필드 크기와 일치하는 첫 번째 형식만 사용됩니다. 유효한 형식에 대한 자세한 내용은 지원되는 날짜 및 타임스탬프 형식을 참조하세요.
  • 서픽스 삭제(선택사항): 출력 필드 이름에서 -SUFFIX_STRING 또는 _SUFFIX_STRING를 삭제하려면 트랜스코더 구성의 transformations 배열에 rename 변환을 추가합니다.

예시

  • -DT8 또는 _DT8로 끝나는 8바이트 필드를 yyyyMMdd 패턴을 사용하여 DATE로, -DT 또는 _DT로 끝나는 10바이트 필드를 MM-dd-yyyy 또는 MM/dd/yyyy로 형식 지정하려면 다음 안내를 따르세요.

    {
      "field_suffixes": [
        {
          "suffix": "DT8",
          "modifier": {
            "format_date": {
              "formats": [
                {
                  "size": 8,
                  "pattern": "yyyyMMdd"
                }
              ]
            }
          }
        },
        {
          "suffix": "DT",
          "modifier": {
            "format_date": {
              "formats": [
                {
                  "size": 10,
                  "pattern": "MM-dd-yyyy"
                },
                {
                  "size": 10,
                  "pattern": "MM/dd/yyyy"
                }
              ]
            }
          }
        }
      ]
    }
    
  • -TIMESTAMP, _TIMESTAMP, -TS 또는 _TS로 끝나는 26바이트 필드를 yyyy-MM-dd HH.mm.ss.SSSSSS 패턴을 사용하여 TIMESTAMP로 형식 지정하고 출력 열 이름에서 서픽스를 삭제하려면 다음 안내를 따르세요.

    {
      "field_suffixes": [
        {
          "suffix": "TIMESTAMP",
          "modifier": {
            "format_timestamp": {
              "formats": [
                {
                  "size": 26,
                  "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS"
                }
              ]
            }
          }
        },
        {
          "suffix": "TS",
          "modifier": {
            "format_timestamp": {
              "formats": [
                {
                  "size": 26,
                  "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS"
                }
              ]
            }
          }
        }
      ],
      "transformations": [
        {
          "rename": {
            "find": "^(.*)[-_](TIMESTAMP|TS)$",
            "replace": "$1"
          }
        }
      ]
    }
    

null 표시기 지원

Mainframe Connector는 트랜스코더 구성(--transcode-configuration)의 null_if 필드 수정자를 통해 null 표시기를 지원합니다.

서픽스 기반 null 표시기(COL1-NID와 같은 필드가 동일한 레코드에서 COL1의 null 표시기 역할을 함)를 구성하려면 "is_inverse": true 및 "target_field": "$self"를 사용하여 field_suffixes에 항목을 정의합니다.

{
  "field_suffixes": [
    {
      "suffix": "NULL_INDICATOR_NAME",
      "is_inverse": true,
      "modifier": {
        "null_if": {
          "target_field": "$self",
          "null_value": "NULL_VALUE",
          "non_null_value": "NOT_NULL_VALUE"
        }
      }
    }
  ]
}

다음 목록에서는 null 표시기를 구성하는 데 사용할 수 있는 매개변수를 설명합니다.

  • suffix: 카피북에서 null 표시기 필드를 식별하는 서픽스 -NULL_INDICATORNAME 또는 NULL_INDICATOR_NAME에 해당합니다.
  • is_inverse: FieldSuffix에서 true로 설정하면 수정자가 서픽스가 없는 표시기 필드와 이름이 일치하는 동위 필드에 적용되고(예: 표시기가 COL1-NID1인 경우 COL1) "$self"는 표시기 필드 자체를 참조합니다. field_overrides를 사용하여 특정 필드에 직접 null_if를 적용하고 target_field를 표시기 필드의 이름으로 설정할 수도 있습니다.
  • null_value 또는 null_values: 참조된 필드가 null임을 나타내는 target_field의 단일 값(null_value) 또는 값 목록(null_values)을 지정합니다.
  • non_null_value 또는 non_null_values: (선택사항) target_field에서 단일 값(non_null_value) 또는 값 목록(non_null_values)을 지정하여 참조된 필드가 null가 아님을 나타냅니다. 생략하면 null_value 또는 null_values 이외의 값은 null이 아닌 것으로 처리됩니다. null_value(s) 또는 non_null_value(s) 중 하나를 지정해야 합니다.
  • null 표시기 필드 제외 또는 유지: 기본적으로 null 표시기 필드는 출력 스키마의 열로 유지됩니다. 트랜스코딩 중에 null 표시기 필드를 사용하면서 출력 테이블에서 생략하려면 transformations 배열의 표시기 필드에 exclude 변환을 추가합니다(filler는 필드 디코딩을 완전히 건너뛰므로 null 표시기 필드에 filler 수정자를 적용하지 마세요).
  • 표시기 필드 유형 재정의: (선택사항) null 표시기 필드를 bytes 또는 binary로 디코딩하려면 "modifier": { "bytes": {} } 또는 "modifier": { "binary": {} }를 사용하여 표시기 필드에 비역 field_suffixes(또는 field_overrides) 규칙을 추가합니다. bytes의 경우 null_value 및 non_null_value를 16진수 문자열로 표현합니다(예: "FF" 또는 "00").

예시

다음 예시에서 COL1-NID1 및 FIELD-NID2는 null 표시기로 평가된 후 출력 테이블에서 제외되지만 COL2-NULL는 출력 스키마에 유지됩니다.

카피북 스니펫:

01 REC.
   10 COL1-NID1 PIC S9(4) USAGE COMP.
   10 COL1      PIC S9(6) USAGE COMP.
   10 FIELD     PIC X(10).
   10 FIELD-NID2 PIC X(1).
   10 COL2      PIC X(10).
   10 COL2-NULL PIC X(1).

트랜스코더 구성(transcode-configuration.json):

{
  "field_suffixes": [
    {
      "suffix": "NID1",
      "is_inverse": true,
      "modifier": {
        "null_if": {
          "target_field": "$self",
          "null_value": "-1",
          "non_null_value": "0"
        }
      }
    },
    {
      "suffix": "NID2",
      "is_inverse": true,
      "modifier": {
        "null_if": {
          "target_field": "$self",
          "null_value": "?"
        }
      }
    },
    {
      "suffix": "NULL",
      "is_inverse": true,
      "modifier": {
        "null_if": {
          "target_field": "$self",
          "null_value": "?"
        }
      }
    }
  ],
  "transformations": [
    {
      "exclude": {
        "field": "COL1-NID1"
      }
    },
    {
      "exclude": {
        "field": "FIELD-NID2"
      }
    }
  ]
}

DBCS 필드 지원

DBCS 필드(USAGE DISPLAY-1가 있는 PIC G 또는 PIC N)를 사용할 때는 다음을 확인하세요.

  • PIC G 필드는 USAGE DISPLAY-1를 명시적으로 지정해야 합니다.
  • USAGE 절이 없는 PIC N 필드는 기본적으로 USAGE NATIONAL(UTF-16BE)입니다. PIC N 필드를 DBCS 필드로 처리하려면 카피북에 USAGE DISPLAY-1를 지정하거나 트랜스코더 구성에서 인코딩을 재정의합니다.
  • 기본적으로 USAGE DISPLAY-1 필드는 시프트 아웃(0x0E) 및 시프트 인(0x0F) 제어 문자 없이 원시 DBCS 바이트를 예상하는 cp300(x-IBM300) DBCS 문자 집합을 사용하여 디코딩 및 인코딩됩니다.
  • 다른 DBCS 문자 집합(예: Cp834) 또는 시프트 아웃(0x0E) 및 시프트 인(0x0F) 바이트를 사용하는 멀티바이트 문자 집합(MBCS)(예: x-IBM930, x-IBM933, x-IBM935, x-IBM937, x-IBM939, x-IBM942, x-IBM942C, x-IBM943, x-IBM943C, x-IBM949, x-IBM949C, x-IBM950, x-IBM964, x-IBM970, x-IBM1364)을 사용하려면 트랜스코더 구성(--transcode-configuration)에서 string 필드 수정자를 구성합니다.

defaults.dbcs를 사용하여 모든 USAGE DISPLAY-1 필드에 대해 전역적으로 DBCS 인코딩을 설정하거나 field_overrides 또는 field_suffixes를 사용하여 특정 필드에 대해 설정할 수 있습니다.

{
  "defaults": {
    "dbcs": {
      "string": {
        "encoding": "x-IBM930"
      }
    }
  }
}

가변 길이 문자열 지원

카피북 파서는 트랜스코더 구성에서 varlen 필드 수정자를 사용하여 가변 길이 문자열 그룹 필드를 지원합니다.

10 VAR-GRP.
   15 VAR-LEN  PIC 9(4) USAGE COMP.
   15 VAR-TEXT PIC X(50).

varlen 필드 수정자를 사용할 때는 다음 사항을 확인하세요.

  • 트랜스코더 구성에서 field_overrides 또는 field_suffixes를 사용하여 그룹 항목(예: VAR-GRP)에 varlen 수정자를 적용합니다.

    {
      "field_overrides": [
        {
          "field": "VAR-GRP",
          "modifier": {
            "varlen": {}
          }
        }
      ]
    }
    
  • 그룹 항목에는 정확히 두 개의 하위 필드가 포함되어야 합니다.

    1. 첫 번째 하위 필드는 문자열 데이터의 바이트 길이를 지정하는 64비트 정수(LONG, 예: 바이너리 COMP 또는 존 십진수 정수 필드)로 디코딩되어야 합니다.
    2. 두 번째 하위 필드는 수정되지 않은 문자열 필드(예: PIC X(n), PIC N(n) 또는 PIC U(n))여야 합니다.
  • 특정 하위 필드 서픽스(예: -LEN 또는 -TEXT)는 필요하지 않으며 출력 스키마의 결과 열은 그룹 항목의 이름(VAR-GRP)을 사용합니다.

지원되지 않는 필드 및 구조

다음 섹션에서는 카피북 파서에서 지원되지 않는 필드와 구문을 설명합니다.

지원되지 않는 COBOL 구조

카피북 파서는 다음 COBOL 구문을 지원하지 않지만 파싱할 수 있습니다. 카피북에서 이러한 구문을 사용하면 Mainframe Connector에 오류가 표시됩니다.

  • ALIGNED
  • BLANK WHEN ZERO
  • COMMON, OWN, LOCAL
  • DYNAMIC LENGTH(예: PIC X DYNAMIC LENGTH 또는 PIC U DYNAMIC LENGTH LIMIT n)
  • INTEGER, STRING
  • JUSTIFIED
  • OCCURS의 ASCENDING/DESCENDING KEY
  • OCCURS의 INDEXED BY
  • RECEIVED BY
  • RECORD AREA
  • RENAMES
  • SYNCHRONIZED/SYNC
  • THREAD-LOCAL
  • TYPE IS ...
  • TYPEDEF
  • USING LANGUAGE/CONVENTION

지원되지 않는 데이터 유형

다음 USAGE 유형은 문법으로 파싱할 수 있지만 카피북 컴파일러에서 지원되지 않습니다.

  • BIT
  • CONTROL-POINT
  • DATE
  • DOUBLE
  • EVENT
  • FUNCTION-POINTER
  • INDEX
  • KANJI
  • LOCK
  • POINTER
  • PROCEDURE-POINTER
  • REAL
  • SQL
  • TASK