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.
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.
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