XTRAN Example — Create abstract of COBOL code
Scenario — you have inherited a body of COBOL code, and you want to review it without getting ensnared in its gory details.
XTRAN to the rescue!The following example uses an XTRAN rules file comprising 288 non-comment lines of XTRAN's rules language ("meta-code") to create an abstract of COBOL from the code itself. The rules took 4 hours to write and 3 hours to debug. (That's right, only 7 hours total!)
The XTRAN rules used for this example are not specific to COBOL; they can be used unchanged to abstract any 3GL language.
The rules are also command-driven, allowing you to easily create a wide variety of different kinds of abstracts. They allow you to specify, via commands, categories of statements. For each category, you can specify:
- What statement types are in the category.
 - What to do with each statement whose type is in the
    category:
- Don't show the statement or its children in the abstract.
 - Don't show the statement in the abstract, but do show its children.
 - Show the statement in the abstract, but don't show its children.
 - Show only the first in a series of statements in the category at the same level, effectively collapsing the sequence.
 
 - A description to show in the abstract.
 
For this example, we specified, via commands, the following categories and their properties (only those relevant to the example are shown):
| Category's statement types | 
Show statement?  | 
Show children?  | 
Collapse statement sequences?  | 
Description for abstract | 
|---|---|---|---|---|
ENVIRONMENT DIVISION | 
Yes | No | N/A | Environment division | 
IDENTIFICATION DIVISION | 
Yes | No | N/A | Identification division  | 
PROCEDURE DIVISION | 
Yes | Yes | N/A | Procedure division | 
WORKING-STORAGE SECTION | 
Yes | Yes | N/A | Working storage | 
IF | 
Yes | Yes | No | If | 
ELSE | 
Yes | Yes | No | Else | 
EVALUATE | 
Yes | Yes | No | Selection | 
WHEN | 
Yes | Yes | No | Selection value | 
STOP RUN | 
Yes | N/A | No | Exit program | 
| (Data declaration) | Yes | No | Yes | Data declarations | 
ADD, COMPUTE, SUBTRACT | 
Yes | N/A | Yes | Arithmetic | 
MOVE | 
Yes | N/A | Yes | Data movement | 
END-EVALUATE, END-IF | 
No | N/A | N/A | N/A | 
How can such powerful code abstraction be automated in only 7 hours and only 288 code lines of XTRAN rules? Because there is so much capability already available as part of XTRAN's rules language. These rules take advantage of the following functionality:
- Text file input and output (to read the commands)
 - Text manipulation
 - Delimited list manipulation (to parse the commands)
 - Environment variable manipulation (to specify the output file)
 - Content-addressable data bases (to store the abstracting specs)
 - "Per statement" recursive iterator (to process all statements)
 - Access to XTRAN's Internal Representation, or XIR (to get statements' types)
 - XIR's language-independent properties
 - Navigation in XIR (to explore a statement's context)
 - Creating new meta-functions written in meta-code, which we call user meta-functions
 
The input to and output from XTRAN are untouched.
Process Flowchart
Here is a flowchart for this process, in which the elements are color coded:
- BLUE for XTRAN versions (runnable programs)
 - ORANGE for XTRAN rules (text files)
 - RED for 
code  - PURPLE for text data files
 
Input to XTRAN:
       IDENTIFICATION DIVISION.
       PROGRAM-ID.    ABSTRACTING-EXAMPLE.
       AUTHOR.        KELLY A DEVELOPER.
       INSTALLATION.  SOME COBOL SHOP SOMEWHERE.
       DATE-WRITTEN.  MAY 2018.
       DATE-COMPILED. May 2018.
      *REMARKS.  JUST TO SHOW OFF XTRAN.
      *
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SOURCE-COMPUTER. WHIZ-BANG-1000.
       OBJECT-COMPUTER. WHIZ-BANG-1000.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  AMT                    PIC 9(7)V99.
       01  PAGE-TOTAL             PIC 9(8)V99     VALUE 0.
       01  DIFF                   PIC 9(7)V99.
       01  TOTAL                  PIC 9(7)V99.
       PROCEDURE DIVISION.
       DO-IT.
          ADD AMT TO PAGE-TOTAL
          SUBTRACT AMT FROM TOTAL GIVING DIFF
          COMPUTE AMT = AMT + 1
          IF AMT < 1.00 THEN
              MOVE 1.0 TO AMT
              MOVE 2 TO TOTAL
          ELSE
              ADD 2 TO AMT
              MOVE AMT TO TOTAL
              MOVE TOTAL TO PAGE-TOTAL    
              EVALUATE AMT
                  WHEN 1
                       MOVE 2 TO AMT
                       MOVE 1 TO DIFF
                       ADD 1 TO AMT
                       SUBTRACT 1 FROM TOTAL
                  WHEN OTHER
                       ADD 1 TO AMT
                       COMPUTE TOTAL = AMT + 2
                  END-EVALUATE
              END-IF
          ADD 1 TO AMT
          COMPUTE TOTAL = 1
          STOP RUN.
Output from XTRAN:
Identification division
Environment division
Data division
    Working storage
        Data declarations
Procedure division
    Arithmetic
    If
        Data movement
    Else
        Arithmetic
        Data movement
        Selection
            Selection value
                Data movement
                Arithmetic
            Selection value
                Arithmetic
    Arithmetic
    Exit program