XTRAN Example — Analyze Language Features Used
Scenario -- you're the software development manager for a PL/I shop, and you want to monitor your developers' use of PL/I's many language features, to ensure they're taking advantage of the useful ones and avoiding those that might be problematic.
XTRAN to the rescue!
The following example uses an XTRAN rules file comprising 114 non-comment lines of "meta-code" (XTRAN's rules language) to analyze use of language features in analyzed code. The rules took about 2 hours to write and debug.
This example analyzes PL/I, but the XTRAN rules used for this example are not specific to PL/I; they can be used unchanged to analyze any language XTRAN handles.
An English paraphrase of these rules is as follows:
For each statement Tally statement's type For each of statement's attributes Tally statement type / attribute combination For each of statement's expressions If expression has operator Tally expression operator Else if expression is declaration For each of declaration's data attributes Tally data attribute Open output file (create or append) For each statement type seen Output statement type's tally For each statement type seen For each attribute seen on this statement type Output statement type / attribute combination's tally For each expression operator seen Output expression operator's tally For each data attribute seen Output data attribute's tally Close output file
The code mining rules for this example can easily be enhanced to produce DSV output that can be interactively queried using existing XTRAN rules.
How can such powerful and generalized code analysis be automated in only 2 hours and 114 lines of 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
- Text manipulation
- Text formatting
- Delimited list manipulation
- Environment variable manipulation
- Content-addressable data bases
- "Per statement" recursive iterator
- "Per statement attribute" recursive iterator
- "Per expression" recursive iterator
- "Per declaration attribute" recursive iterator
- Access to XTRAN's Internal Representation (XIR)
- XIR's language-independent properties
- Navigation in XIR
- 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:
DCL a(3, 2:5) BINARY FIXED(6, 2); DCL (b, c) DECIMAL FLOAT (6); DCL (d, e) BINARY FIXED(31); DCL i; IF (a(2, 2) > b) THEN DO; a(2, 2) = b; GO TO lbl1; END; ELSE DO; a(1, i) = b; c = c / 2.0; SELECT (a(1, i)); WHEN (1, 2) DO; b = c; END; WHEN (3) b = 2 * b; OTHERWISE DO; b = 3 * b; c = 3 * c; END; END; END; d = 1 + d; DISPLAY (d) REPLY(c); lbl1: IF (e < d) THEN GOTO lbl2; e = i + e; SELECT; WHEN (e > i) DO; e = i; i = i + 3; END; WHEN (e < i) i = e; OTHERWISE i = e + 2; END; IF (e > d) THEN DO; e = e + i; i = e + i; END; e = e - i; lbl2: e = i - e;
Output from XTRAN:
Statement types --------------- <expr> = 17 DECLARE = 4 DISPLAY = 1 DO = 6 END = 8 OTHERWISE = 2 SELECT = 2 WHEN = 4 XTR_ELSE = 1 XTR_GOTO = 2 XTR_IF = 3 Statement attributes, by statement type --------------------------------------- DISPLAY/REPLY = 1 Expression operators -------------------- * = 3 + = 6 - = 2 / = 1 < = 2 = = 17 > = 3 Data attributes --------------- BINARY = 2 DECIMAL = 1 FIXED = 2 FLOAT = 1 PREC = 3 XTR_DIM = 2 XTR_DIMS = 1 XTR_LWRBND = 1 XTR_UPRBND = 2