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 :
, . — — :
, ? — 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