Pennington / Example

XTRAN Demonstration:  Producing Module/Function Cross-Reference of Pascal

The following analysis used an XTRAN rules file comprising just over 300 lines of "meta-code" (XTRAN's rules language) to analyze all declarations of, and calls to, PROCEDUREs and FUNCTIONs.  The XTRAN rules file itself is not specific to Pascal; it is language-independent, and can be used to analyze any language that allows declaration of, and calls to, procedures or functions.

Note that the analysis identified a recursive call at line 23 of the file module2.pas, even though it was to an outer procedure.

The input to and output from XTRAN are untouched, except for the addition of line numbers to the input files for reference.



* Input to XTRAN:

File module1.pas:

 1 PROCEDURE proc1; EXTERNAL;
 2
 3 FUNCTION func1(a : INTEGER; b : INTEGER) : INTEGER; EXTERNAL;
 4
 5 PROCEDURE proc2(a : INTEGER; b : ^INTEGER); EXTERNAL;
 6
 7 FUNCTION func2 : INTEGER; EXTERNAL;
 8
 9 PROCEDURE proc3;
10
11	VAR i, j : INTEGER;
12
13 BEGIN
14	proc1;					{procedure call}
15	i := func2;				{function call}
16	i := j;					{no procedure or function call}
17	func1(1, 2);				{function call}
18	j := func1(1, 2) + func2;		{2 function calls}
19	j := func1(func2, 2);			{function call as function arg}
20	proc3;					{recursive procedure call}
21	j := func1(1, 2) + func1(2, 1);		{2 calls to same function}
22	proc2(i, ^j)				{procedure call}
23 END.

File module2.pas:

 1 FUNCTION func1(a : INTEGER; b : INTEGER) : INTEGER; EXTERNAL;
 2
 3 PROCEDURE proc2(a : INTEGER; b : ^INTEGER); EXTERNAL;
 4
 5 FUNCTION func2 : INTEGER; EXTERNAL;
 6
 7 PROCEDURE proc3; EXTERNAL;
 8
 9 PROCEDURE proc4;
10
11	VAR i, j : INTEGER;
12
13	FUNCTION func5(arg : INTEGER) : INTEGER;
14
15	    VAR i : INTEGER;
16
17	    BEGIN
18	    IF arg = 1 THEN
19		func5 := 1;			{stop recursion}
20	    ELSE
21		BEGIN
22		i := func5(i - 1);		{recursive call}
23		j := proc4;			{recursive call to outer PROC}
24		func5 := i			{not a call}
25		END
26	    END;
27 BEGIN
28	proc3;					{procedure call}
29	i := func1(1, 2);			{function call}
30	func1(1, 2);				{function call}
31	i := j;					{no procedure or function call}
32	proc4;					{recursive procedure call}
33	i := func5(j);				{call to inner function}
34	j := func2 + func2;			{2 calls to same function}
35	j := func1(1, 2) + func1(2, 1);		{2 calls to same function}
36	j := func1(func2, 2);			{function call as function arg}
37	proc4;					{recursive procedure call}
38	proc2(i, ^j);				{procedure call}
39 END.


* Output from XTRAN:

                  PROCEDURE/FUNCTION Cross-Reference

Legend:
	D    => declaration
	X    => external declaration
	N    => nested declaration
	R    => recursive call
	else => call

Declarations & calls for each PROCEDURE/FUNCTION, by source file:

func1()
    module1.pas. . . . . . . . . . . . . . . . . . . . . 3X, 17, 18, 19, 21
    module2.pas. . . . . . . . . . . . . . . . . . . . . 1X, 29, 30, 35, 36
func2()
    module1.pas. . . . . . . . . . . . . . . . . . . . . 7X, 15, 18, 19
    module2.pas. . . . . . . . . . . . . . . . . . . . . 5X, 34, 36
func5()
    module2.pas. . . . . . . . . . . . . . . . . . . . . 13N, 22R, 33
proc1()
    module1.pas. . . . . . . . . . . . . . . . . . . . . 1X, 14
proc2()
    module1.pas. . . . . . . . . . . . . . . . . . . . . 5X, 22
    module2.pas. . . . . . . . . . . . . . . . . . . . . 3X, 38
proc3()
    module1.pas. . . . . . . . . . . . . . . . . . . . . 9D, 20R
    module2.pas. . . . . . . . . . . . . . . . . . . . . 7X, 28
proc4()
    module2.pas. . . . . . . . . . . . . . . . . . . . . 9D, 23R, 32R, 37R

PROCEDURE/FUNCTION declarations & calls in each source file,
  by PROCEDURE/FUNCTION name:

module1.pas
    func1() . . . 3X, 17, 18, 19, 21
    func2() . . . 7X, 15, 18, 19
    proc1() . . . 1X, 14
    proc2() . . . 5X, 22
    proc3() . . . 9D, 20R
module2.pas
    func1() . . . 1X, 29, 30, 35, 36
    func2() . . . 5X, 34, 36
    func5() . . . 13N, 22R, 33
    proc2() . . . 3X, 38
    proc3() . . . 7X, 28
    proc4() . . . 9D, 23R, 32R, 37R


COPYRIGHT 2008; reproduction prohibited without permission.  Revised 2006-11-27

XTRAN is a trademark of Pennington Systems Incorporated.

Pennington Systems Incorporated
8655 East Via de Ventura, Suite G200
Scottsdale, Arizona 85258-3321

Phone:  +1(480)626-5503
Fax:  +1(480)626-7618
Email:  Info@Pennington.com
Web:  http://WWW.Pennington.com

[home] Home