XTRAN Example — Translate PL/I Calling Arguments to C
The following example uses the standard set of XTRAN rules for parsing PL/I and translating it to C. NOTE that the translation shown below was done with default conditions. XTRAN provides many options for controlling the way it translates.
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 subr1 ENTRY; /*DCL subr1 ENTRY;*/ DCL subr2 ENTRY (BINARY FLOAT(6), /*DCL subr2 ENTRY (BINARY FLOAT(6),*/ BINARY FIXED(31), /*BINARY FIXED(31),*/ BINARY FLOAT(6)); /*BINARY FLOAT(6));*/ DCL subr3 ENTRY (BINARY FIXED(31), /*DCL subr3 ENTRY (BINARY FIXED(31),*/ BINARY FLOAT(6)); /*BINARY FLOAT(6));*/ DCL subr4 ENTRY (BINARY FLOAT(6), /*DCL subr2 ENTRY (BINARY FLOAT(6),*/ BINARY FLOAT(6)); /*BINARY FLOAT(6));*/ DCL func1 ENTRY (BINARY FIXED(31), /*DCL func1 ENTRY (BINARY FIXED(31),*/ BINARY FLOAT(6)) /*BINARY FLOAT(6))*/ RETURNS (BINARY FIXED(31)); /*RETURNS (BINARY FIXED(31));*/ DCL func2 ENTRY (BINARY FLOAT(6), /*DCL func2 ENTRY (BINARY FLOAT(6),*/ BINARY FIXED(31)) /*BINARY FIXED(31))*/ RETURNS (BINARY FIXED(31)); /*RETURNS (BINARY FIXED(31));*/ proc1: PROCEDURE; CALL subr1; /*CALL subr1;*/ CALL subr2( /*CALL subr2(*/ a + 1.0, /*a + 1.0,*/ func1(b, c + func2(d, 3)), /*func1(b, c + func2(d, 3)),*/ e); /*e);*/ CALL subr3(1, a); /*CALL subr3(1, a);*/ CALL subr4(a, b); /*CALL subr4(a, b);*/ END proc1;
Output from XTRAN:
double subr1(void); /*DCL subr1 ENTRY;*/ double subr2(double *, long *, double *); /*DCL subr2 ENTRY (BINARY FLOAT(6),*/ /*binary fixed(31),*/ /*binary float(6));*/ double subr3(long *, double *); /*DCL subr3 ENTRY (BINARY FIXED(31),*/ /*binary float(6));*/ double subr4(double *, double *); /*DCL subr2 ENTRY (BINARY FLOAT(6),*/ /*binary float(6));*/ long func1(long *, double *); /*DCL func1 ENTRY (BINARY FIXED(31),*/ /*binary float(6))*/ /*returns (binary fixed(31));*/ long func2(double *, long *); /*DCL func2 ENTRY (BINARY FLOAT(6),*/ /*binary fixed(31))*/ /*returns (binary fixed(31));*/ double proc1(void) { double a; double b; double c; double d; double e; subr1(); /*CALL subr1;*/ { int f3_a2 = 3; double f2_a2 = c + func2(&d, &f3_a2); double f1_a1 = a + 1.0; long f1_a2 = func1(&b, &f2_a2); subr2(&f1_a1, &f1_a2, &e); /*CALL subr2(*/ /*a + 1.0,*/ /*func1(b, c + func2(d, 3)),*/ /*e);*/ } { int f1_a1 = 1; subr3(&f1_a1, &a); /*CALL subr3(1, a);*/ } subr4(&a, &b); /*CALL subr4(a, b);*/ }