GrĂĽĂźe, liebe Freunde.
Wir setzen die Artikelserie fort, die die Aktivitäten der (stürmischen) unserer gemeinnützigen Organisation abdeckt.
Wie versprochen wechseln wir von einfach (Protokollierung) zu komplexer: Metaprogrammierung.
Krawatte
So kam es, dass unsere Muttergesellschaft (eine groĂźe Finanztechnologie) sich mithilfe von Mainframes und COBOL in eine andere groĂźe Organisation integrieren musste.
Es scheint - was ist die Schwierigkeit und was kann sie beeinflussen?
Tatsache ist, dass wir als Slave in dieser Integration Datenaustauschschnittstellen von außen unterstützen mussten. Nämlich - Binärdatendateien "COBOL-Datendateien".
Wie sich herausstellte (und wir hatten vorher keine Erfahrung mit COBOL), haben die darin enthaltenen Datendateien eine nichtlineare Struktur . Nämlich:
- Ein und derselbe Datenblock kann als verschiedene „Gruppen“ interpretiert werden (Datenformat in der COBOL-Terminologie), eine Art Datenpolymorphismus: Direktive redefines. Darüber hinaus mit allen verschachtelten Gruppen und ihren Feldern.
- Ein Block kann N-mal wiederholt werden: Direktive occurs
- Blöcke werden nacheinander ausgeführt, aber ihr Anfang wird ab dem Ende des vorherigen Blocks gezählt. Dementsprechend können Sie keinen separaten Block lesen, ohne die vorherigen Blöcke zu lesen.
, COBOL: "copybook" ( Data Section Division), , :
PIC X(06)V99
 PIC 9(06).9999999
PIC 9(07)V9(07) COMP-3
:
- IBM Computational 3
- (EBCDIC, ASCII) — ( )
- (CR, LF, CRLF, LFCR, Newline, N )
- 400
- header, record, trailer
: ?
, . : JRecord 90.
, — , - . , data picture comp-3 .
, 2 :
, . — — :
, ? — 1 .
- , :
COBOL — Data Section Division. , COBOL.
, -, COBOL ( Java) — MIT:
https://github.com/uwol/proleap-cobol-parser
, :
Antlr, meta-API Visitor. -.
visit e , Groovy , (data picture clause):
    @Override
    @CompileDynamic
    Boolean visitDataPictureClause(CobolParser.DataPictureClauseContext ctx) {
        PictureClause entry = (PictureClause) program.getASGElementRegistry().getASGElement(ctx)
        def (length, comp3length, scale) = calculateLengths(entry.pictureString)
        write """    setDataPicture("""
        write """        depth: ${currentFrame.depth},"""
        write """        pictureString: "${entry.pictureString}","""
        write """        length: ${length},"""
        write """        comp3length: ${comp3length},"""
        write """        scale: ${scale},"""
        Boolean result = super.visitDataPictureClause(ctx)
        write """    )"""
        return result
    }
, COBOL Groovy.
, copybook.
Java , .
Closure Groovy — Closure COBOL.
, COBOL (copybook):
000010 IDENTIFICATION  DIVISION.                                        XXXXXXXX
       PROGRAM-ID.     UnstringSample.                                  XXXXXXXX
       ENVIRONMENT     DIVISION.                                        XXXXXXXX
       CONFIGURATION SECTION.                                           XXXXXXXX
       SPECIAL-NAMES.   DECIMAL-POINT IS COMMA.                         XXXXXXXX
       INPUT-OUTPUT    SECTION.                                         XXXXXXXX
       DATA            DIVISION.                                        XXXXXXXX
       WORKING-STORAGE SECTION.                                         XXXXXXXX
       01 ABCDE-RECORD.                                                 XXXXXXXX
XXXXXX  02 ABCDE-REC.                                                   XXXXXXXX
        03 ABCDE-COMMON.                                                XXXXXXXX
           05 ABCDE-DETAILS.                                            XXXXXXXX
             10 ABCDE-RECORD-ABC.                                       XXXXXXXX
                15 ABCDE-PRI-ABC.                                       XXXXXXXX
                   20 ABCDE-ABC-AAAAAAAA         PIC X(02).             XXXXXXXX
                   20 ABCDE-ABC-ACCT-ABCS.                              XXXXXXXX
                      25 ABCDE-ABC-ABC-1         PIC X(02).             XXXXXXXX
                      25 ABCDE-ABC-ABC-2         PIC X(03).             XXXXXXXX
                      25 ABCDE-ABC-ABC-3         PIC X(03).             XXXXXXXX
                      25 ABCDE-ABC-ABC-4         PIC X(04).             XXXXXXXX
:
io.infinite.cobol.CobolCompiler|import groovy.transform.CompileStatic
import io.infinite.cobol.CobolRuntime
import io.infinite.cobol.CobolApi
import io.infinite.other.CopybookStructureEnum
@CompileStatic
class CobolClosureRuntime extends CobolRuntime {
    @Override
    void run(Long totalSize, InputStream inputStream, String charsetName, List<Byte> lineBreakBytes, CobolApi cobolApi, CopybookStructureEnum copybookStructure) {
        super.setup(totalSize, inputStream, charsetName, lineBreakBytes, cobolApi, copybookStructure)
readFile() {
    createRecord("ABCDE-RECORD") {
        createGroup(2, "ABCDE-REC") {
            createGroup(3, "ABCDE-COMMON") {
                createGroup(4, "ABCDE-DETAILS") {
                    createGroup(5, "ABCDE-RECORD-ABC") {
                        createGroup(6, "ABCDE-PRI-ABC") {
                            createGroup(7, "ABCDE-ABC-AAAAAAAA") {
                                setDataPicture(
                                    depth: 7,
                                    pictureString: "X(02)",
                                    length: 2,
                                    comp3length: 2,
                                    scale: 0,
                                )
                            }//<(end of group: ABCDE-ABC-AAAAAAAA)
                            createGroup(7, "ABCDE-ABC-ACCT-ABCS") {
                                createGroup(8, "ABCDE-ABC-ABC-1") {
                                    setDataPicture(
                                        depth: 8,
                                        pictureString: "X(02)",
                                        length: 2,
                                        comp3length: 2,
                                        scale: 0,
                                    )
                                }//<(end of group: ABCDE-ABC-ABC-1)
                                createGroup(8, "ABCDE-ABC-ABC-2") {
                                    setDataPicture(
                                        depth: 8,
                                        pictureString: "X(03)",
                                        length: 3,
                                        comp3length: 2,
                                        scale: 0,
                                    )
                                }//<(end of group: ABCDE-ABC-ABC-2)
                                createGroup(8, "ABCDE-ABC-ABC-3") {
                                    setDataPicture(
                                        depth: 8,
                                        pictureString: "X(03)",
                                        length: 3,
                                        comp3length: 2,
                                        scale: 0,
                                    )
                                }//<(end of group: ABCDE-ABC-ABC-3)
                                createGroup(8, "ABCDE-ABC-ABC-4") {
                                    setDataPicture(
                                        depth: 8,
                                        pictureString: "X(04)",
                                        length: 4,
                                        comp3length: 3,
                                        scale: 0,
                                    )
                                }//<<<<(end of group: ABCDE-ABC-ABC-4)
                            }//<<<<(end of group: ABCDE-ABC-ACCT-ABCS)
                        }//<<<<(end of group: ABCDE-PRI-ABC)
                    }//<<<<(end of group: ABCDE-RECORD-ABC)
                }//<<<<(end of group: ABCDE-DETAILS)
            }//<<<<(end of group: ABCDE-COMMON)
        }//<<<<(end of group: ABCDE-REC)
    }//<<<<(end of group: ABCDE-RECORD)
}//<<<<<
    }
}
, Production .
— , . — copybook — .
.
$.
:
- Open Source COBOL Java (Groovy)
- COBOL (proleap.io)
- COMP-3
- Data Section Division
- redefines
- occurs
- API, XML ( )
- (EBCDIC, ASCII )
1)
2) — , . .
3) , " ". 2020 .
https://i-t.io , . -, .
.
!
:
https://github.com/INFINITE-TECHNOLOGY/COBOL