Le chemin de COBOL Ă  Java: Ă©crire un transpilateur par jour

Salutations, chers amis.


Nous continuons la série d'articles couvrant les activités de (orageux) de notre organisation à but non lucratif.


Comme promis, nous passons du simple (logging) au plus complexe: la métaprogrammation.


Attacher


Il se trouve que notre société mère (une grande technologie financière) devait s'intégrer à une autre grande organisation utilisant des ordinateurs centraux et COBOL.


Il semblerait - quelle est la difficulté et que peut-elle affecter?


Le fait est qu'étant esclave de cette intégration, nous devions supporter les interfaces d'échange de données de l'extérieur. A savoir - fichiers de données binaires "fichiers de données COBOL".


Comme il s'est avéré (et nous n'avions aucune expérience avec COBOL auparavant), les fichiers de données qu'il contient ont une structure non linéaire . À savoir:


  • Un mĂŞme bloc de donnĂ©es peut ĂŞtre interprĂ©tĂ© comme diffĂ©rents «groupes» (format de donnĂ©es dans la terminologie COBOL), une sorte de polymorphisme de donnĂ©es: directive redefines. De plus, avec tous les groupes imbriquĂ©s et leurs champs.
  • Un bloc peut ĂŞtre rĂ©pĂ©tĂ© N fois: directive occurs
  • Les blocs sont sĂ©quentiels, mais leur dĂ©but est comptĂ© Ă  partir de la fin du bloc prĂ©cĂ©dent - en consĂ©quence, vous ne pouvez pas lire un bloc sĂ©parĂ© sans lire les blocs prĂ©cĂ©dents.

, 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 :


  • hold my coffee

, . — — :


  • COBOL Java (Groovy)

, ? — 1 .



- , :


  • ( )

COBOL — Data Section Division. , COBOL.


, -, COBOL ( Java) — MIT:
https://github.com/uwol/proleap-cobol-parser


, :


  • Java (Groovy)
  • API, (ETL)

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


All Articles