El camino de COBOL a Java: escribir un transpilador por día

Saludos, queridos amigos.


Continuamos la serie de artículos que cubren las actividades de la (tormenta) de nuestra organización sin fines de lucro.


Como prometimos, pasamos de lo simple (registro) a lo más complejo: la metaprogramación.


Corbata


Sucedió que nuestra corporación matriz (una gran tecnología financiera) necesitaba integrarse con otra gran organización utilizando mainframes y COBOL.


Parecería: ¿cuál es la dificultad y qué puede afectar?


El hecho es que al ser un esclavo en esta integración, tuvimos que admitir interfaces de intercambio de datos desde el exterior. A saber: archivos de datos binarios "archivos de datos COBOL".


Al final resultó que (y no teníamos experiencia con COBOL antes), los archivos de datos tienen una estructura no lineal . A saber:


  • El mismo bloque de datos puede interpretarse como diferentes "grupos" (formato de datos en terminología COBOL), una especie de polimorfismo de datos: directiva redefines. Además, con todos los grupos anidados y sus campos.
  • Un bloque puede repetirse N veces: directiva occurs
  • Los bloques van secuencialmente, pero su comienzo se cuenta desde el final del bloque anterior; en consecuencia, no puede leer un bloque separado sin leer los bloques anteriores.

, 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