home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / crsref / adaref.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-05-03  |  23.2 KB  |  696 lines

  1.  PROGRAM ADAREF(INPUT,OUTPUT);
  2.  
  3.  
  4.  
  5.  
  6.  (* ADAREF - CROSS REFERENCE ADA PROGRAMS.                            *)
  7.  (*                                                                   *)
  8.  (* ORIGINAL PROGRAM (NAMED XREF).                                    *)
  9.  (*    - N. WIRTH 71/01/15, 74/05/07, 75/07/02, 76/02/10.             *)
  10.  (*      (SEE CHAPTER 4 IN "ALGORITHMS + DATA STRUCTURES = PROGRAMS") *)
  11.  (* USE BETTER SORT, CASE STATEMENT IN SCANNER, PROCEDURE MAP,        *)
  12.  (* CONTROL STATEMENT PROCESSING.                                     *)
  13.  (*    - A. MICKEL 75/12/08.                                          *)
  14.  (* USE RING STRUCTURE FOR REFERENCES.                                *)
  15.  (*    - R. CICHELLI 76/11/14.                                        *)
  16.  (* PROCESS LINE NUMBERS.                                             *)
  17.  (*    - D. LALIBERTE 78/03/15.                                       *)
  18.  (* PROCESS COMPILER TITLES, DIFFERENT PRINT DENSITIES,               *)
  19.  (* USE VALUE PART, SORT CORRECTLY, ADD NESTING LEVELS.               *)
  20.  (*   - J. STRAIT 78/12/28.                                           *)
  21.  (* CONVERTED PASREF TO ADAREF TO PROCESS ADA PROGRAMS                *)
  22.  (*  - K. CASSIDY,  C. ANDERSON    USAF ARMAMENT LAB (904-882-8264)   *)
  23.  (*               82/11/30                                            *)
  24.  (*                                                                   *)
  25.  
  26.  
  27.  
  28.  
  29.  LABEL 99;
  30.  
  31.  
  32.  
  33.  
  34.  CONST P = 1499;     (*SIZE OF HASH TABLE*)
  35.    NK =126;          (* NO. OF KEYWORDS *)
  36.    KLN= 36;          (* KEYLENGTH *)
  37.    LPPG6 = 63;       (*LINES PER PAGE AT 6 LINES PER INCH*)
  38.    LTPG6 = 3;        (*LINES AT TOP OF PAGE AT 6 LINES PER INCH*)
  39.    LLINMAX = 120;    (*MAXIMUM INPUT LINE LENGTH*)
  40.    LLOUTMAX = 132;   (*MAXIMUM OUTPUT LINE LENGTH*)
  41.    MAXN = 100000;    (*MAX NO. OF LINES*)
  42.    DGPN =  6;        (*NO. OF DIGITS PER NUMBER*)
  43.    STARS = ' *****'; 
  44.  
  45.  
  46.  
  47.  TYPE INDEX = 0..P;
  48.    INDEX1= -1..P;
  49.    ALFA = PACKED ARRAY [1..KLN] OF CHAR;
  50.    REF = ^ITEM;
  51.    WORD = RECORD KEY: ALFA;
  52.             LAST: REF;
  53.           END ;
  54.    ITEM = PACKED RECORD
  55.             LNO: 0..MAXN;
  56.             NEXT: REF
  57.           END ;
  58.    PROCREF = ^PROC;  (*PROCEDURE OR FUNCTION REFERENCE*)
  59.    PROC = PACKED RECORD
  60.             NAME: ALFA;
  61.             LNO: 0..MAXN;
  62.             NEXT: PROCREF
  63.           END ;
  64.  
  65.  
  66.  
  67.  
  68.  VAR I: INDEX;
  69.    K: INTEGER;
  70.    M: INTEGER;       (*NO. OF LINES ON PAGE*)
  71.    N: INTEGER;       (*NO. OF LINES INPUT*)
  72.    LPPG: INTEGER;    (*NUMBER OF LINES PER PAGE*)
  73.    LTPG: INTEGER;    (*NUMBER OF BLANK LINES AT TOP OF PAGE*)
  74.    LN: INTEGER;      (*CURRENT LINE NUMBER*)
  75.    LLOUT: INTEGER;   (*LINE LENGTH FOR OUTPUT*)
  76.    LLIN: INTEGER;    (*LINE LENGTH FOR INPUT*)
  77.    CCOUNT: INTEGER;  (*CHARACTER COUNT IN LINE*)
  78.    NOPL: INTEGER;    (*NO. OF LINE-NUMBERS PER LINE*)
  79.    EMPTY: ALFA;
  80.  (*                                                *)
  81.  (* THE NEXT CONSTRUCT FORCES ID.A AND ID.ORD TO SHARE FIRST WORD *)
  82.    ID: RECORD CASE BOOLEAN OF
  83.               FALSE: (A: ALFA);
  84.                 TRUE:  (ORD:INTEGER)
  85.        END ;
  86.    T: ARRAY [INDEX] OF WORD;    (*HASH TABLE*)
  87.    KEYINDEX: 0..NK;
  88.    KEY: ARRAY[0..NK] OF RECORD
  89.                           K: ALFA;
  90.                           N: -1..1
  91.                         END;
  92.    PROCKEY,FUNCKEY,ACCEPT_KEY,BEGINKEY,PACKKEY,USE_KEY: ALFA;
  93.    PROCLOW,FUNCLOW,ACCEPTLOW,BEGINLOW,PACKLOW,USELOW: ALFA; 
  94.    CASEKEY,IFKEY,LOOPKEY,RECKEY,SELECT_KEY,TASKKEY,WITH_KEY:ALFA;
  95.    CASELOW,IFLOW,LOOPLOW,RECLOW,SELECTLOW,TASKLOW,WITHLOW:ALFA;
  96.    INBODY: BOOLEAN;
  97.    NESTING,NESTCOUNT: INTEGER;
  98.    NEST: ARRAY[1..LLINMAX] OF INTEGER;
  99.    PROCORFUNC,
  100.    PAGINATING: BOOLEAN;
  101.    FIRSTPROC,
  102.    PROCPTR: PROCREF; (*POINTERS TO CHAIN OF PROCEDURES*)
  103.  
  104.  
  105.  
  106.  
  107.  VALUE EMPTY := (KLN OF ' ');
  108.     T := (P OF ((KLN OF ' '), NIL), ((KLN OF ' '), NIL));
  109.     (*RESERVED WORD TABLE*)
  110.     KEY := (('                                    ', 0),             
  111.            ('ABORT                               ', 0),
  112.            ('ABS                                 ', 0),
  113.            ('ACCEPT                              ',+1),
  114.            ('ACCESS                              ', 0),
  115.            ('ALL                                 ', 0), 
  116.            ('AND                                 ', 0),
  117.            ('ARRAY                               ', 0),
  118.            ('AT                                  ', 0), 
  119.            ('BEGIN                               ',+1),
  120.            ('BODY                                ', 0),
  121.            ('CASE                                ',+1),
  122.            ('CONSTANT                            ', 0),
  123.            ('DECLARE                             ', 0),
  124.            ('DELAY                               ', 0),
  125.            ('DELTA                               ', 0), 
  126.            ('DIGITS                              ', 0),
  127.            ('DO                                  ', 0),
  128.            ('ELSE                                ', 0),
  129.            ('ELSIF                               ', 0),
  130.            ('END                                 ',-1),
  131.            ('ENTRY                               ', 0),
  132.            ('EXCEPTION                           ', 0),
  133.            ('EXIT                                ', 0),  
  134.            ('FOR                                 ', 0),
  135.            ('FUNCTION                            ', 0),
  136.            ('GENERIC                             ', 0),
  137.            ('GOTO                                ', 0),
  138.            ('IF                                  ',+1),
  139.            ('IN                                  ', 0),
  140.            ('IS                                  ', 0),
  141.            ('LIMITED                             ', 0),
  142.            ('LOOP                                ',+1),
  143.            ('MOD                                 ', 0),
  144.            ('NEW                                 ', 0),
  145.            ('NOT                                 ', 0),
  146.            ('NULL                                ', 0),
  147.            ('OF                                  ', 0),
  148.            ('OR                                  ', 0),
  149.            ('OTHERS                              ', 0),
  150.            ('OUT                                 ', 0),
  151.            ('PACKAGE                             ',+1),
  152.            ('PRAGMA                              ', 0),
  153.            ('PRIVATE                             ', 0),
  154.            ('PROCEDURE                           ', 0),
  155.            ('RAISE                               ', 0),
  156.            ('RANGE                               ', 0),
  157.            ('RECORD                              ',+1),
  158.            ('REM                                 ', 0),
  159.            ('RENAMES                             ', 0),
  160.            ('RETURN                              ', 0),
  161.            ('REVERSE                             ', 0),
  162.            ('SELECT                              ',+1),
  163.            ('SEPARATE                            ', 0),
  164.            ('SUBTYPE                             ', 0),
  165.            ('TASK                                ', 0),
  166.            ('TERMINATE                           ', 0),
  167.            ('THEN                                ', 0),
  168.            ('TYPE                                ', 0),
  169.            ('USE                                 ', 0),
  170.            ('WHEN                                ', 0),
  171.            ('WHILE                               ', 0),
  172.            ('WITH                                ', 0),
  173.            ('X0R                                 ', 0),
  174.            ('abort                               ', 0),     
  175.            ('abs                                 ', 0),
  176.            ('accept                              ',+1),
  177.            ('access                              ', 0),
  178.            ('all                                 ', 0),
  179.            ('and                                 ', 0),
  180.            ('array                               ', 0),
  181.            ('at                                  ', 0),
  182.            ('begin                               ',+1),
  183.            ('body                                ', 0),
  184.            ('case                                ',+1),
  185.            ('constant                            ', 0),
  186.            ('declare                             ', 0),
  187.            ('delay                               ', 0),
  188.            ('delta                               ', 0),
  189.            ('digits                              ', 0),
  190.            ('do                                  ', 0),
  191.            ('else                                ', 0),
  192.            ('elsif                               ', 0),
  193.            ('end                                 ',-1),
  194.            ('entry                               ', 0),
  195.            ('exception                           ', 0),
  196.            ('exit                                ', 0),
  197.            ('for                                 ', 0),     
  198.            ('function                            ', 0),
  199.            ('generic                             ', 0),
  200.            ('goto                                ', 0),
  201.            ('if                                  ',+1),
  202.            ('in                                  ', 0),
  203.            ('is                                  ', 0),
  204.            ('limited                             ', 0),
  205.            ('loop                                ',+1),
  206.            ('mod                                 ', 0), 
  207.            ('new                                 ', 0),
  208.            ('not                                 ', 0),
  209.            ('null                                ', 0),
  210.            ('of                                  ', 0),
  211.            ('or                                  ', 0),
  212.            ('others                              ', 0),
  213.            ('out                                 ', 0),
  214.            ('package                             ',+1),
  215.            ('pragma                              ', 0),
  216.            ('private                             ', 0),
  217.            ('procedure                           ', 0),
  218.            ('raise                               ', 0),
  219.            ('range                               ', 0),
  220.            ('record                              ',+1),
  221.            ('rem                                 ', 0),
  222.            ('renames                             ', 0),
  223.            ('return                              ', 0),
  224.            ('reverse                             ', 0),
  225.            ('select                              ',+1), 
  226.            ('separate                            ', 0), 
  227.            ('subtype                             ', 0),
  228.            ('task                                ', 0),
  229.            ('terminate                           ', 0),
  230.            ('then                                ', 0),
  231.            ('type                                ', 0),
  232.            ('use                                 ', 0),
  233.            ('when                                ', 0),
  234.            ('while                               ', 0),
  235.            ('with                                ', 0),
  236.            ('xor                                 ', 0));
  237.     PROCKEY := 'PROCEDURE                           ';
  238.     PROCLOW := 'procedure                           ';
  239.     FUNCKEY := 'FUNCTION                            ';
  240.     FUNCLOW := 'function                            ';
  241.     BEGINKEY := 'BEGIN                               ';
  242.     BEGINLOW := 'begin                               ';
  243.     CASEKEY := 'CASE                                ';
  244.     CASELOW := 'case                                ';
  245.     IFKEY := 'IF                                  ';
  246.     IFLOW := 'if                                  ';
  247.     PACKKEY := 'PACKAGE                             ';
  248.     PACKLOW := 'package                             ';
  249.     LOOPKEY := 'LOOP                                ';
  250.     LOOPLOW := 'loop                                ';
  251.     RECKEY := 'RECORD                              ';
  252.     RECLOW := 'record                              ';
  253.     TASKKEY := 'TASK                                ';
  254.     TASKLOW := 'task                                ';
  255.     ACCEPT_KEY := 'ACCEPT                              ';
  256.     ACCEPTLOW := 'accept                              ';
  257.     SELECT_KEY := 'SELECT                              ';
  258.     SELECTLOW := 'select                              ';
  259.     USE_KEY := 'USE                                 ';
  260.     USELOW := 'use                                 ';
  261.     WITH_KEY := 'WITH                                ';
  262.     WITHLOW := 'with                                ';
  263.     N := 0;
  264.     M := 0;
  265.     LLIN := LLINMAX;
  266.     LLOUT := LLOUTMAX;
  267.     PROCORFUNC := TRUE;
  268.     LPPG := LPPG6;
  269.     LTPG := LTPG6;
  270.     NESTING := 0;
  271.     INBODY := FALSE;
  272.     (* CLASSIFY RESERVED WORD  *)
  273.  PROCEDURE CLASSIFY;
  274.    VAR I,J,K: INTEGER;
  275.  BEGIN I := 1; J := NK;   (*BINARY SEARCH*)
  276.    KEYINDEX := 0;
  277.    REPEAT K := (I+J) DIV 2;
  278.      IF KEY[K].K <= ID.A THEN I := K+1 ELSE J := K-1
  279.    UNTIL I > J;
  280.    IF KEY[J].K = ID.A THEN KEYINDEX := J
  281.  END (*CLASSIFY*) ;
  282.  
  283.  
  284.  
  285.  
  286.  PROCEDURE BEGINLINE;
  287.   VAR I: INTEGER;
  288.  BEGIN
  289.    IF PAGINATING THEN
  290.      BEGIN
  291.        IF M >= LPPG THEN
  292.          BEGIN WRITE(' ');
  293.            FOR I := 1 TO LTPG DO WRITELN;
  294.            M := LTPG
  295.          END;
  296.        M := M + 1
  297.      END
  298.  END (*BEGINLINE*) ;
  299.  
  300.  
  301.  
  302.  
  303.    (* GET NEXT CHARACTER  *)
  304.  PROCEDURE ADVANCE;
  305.  BEGIN
  306.    IF NOT EOLN THEN
  307.      BEGIN WRITE(INPUT^); GET(INPUT);
  308.        CCOUNT := CCOUNT + 1;
  309.        IF CCOUNT = LLIN THEN
  310.          WHILE NOT EOLN(INPUT) DO
  311.            BEGIN WRITE(INPUT^); GET(INPUT); CCOUNT := CCOUNT + 1 END
  312.      END
  313.  END (*ADVANCE*);
  314.  
  315.  
  316.  
  317.  
  318.  PROCEDURE SKIP(J: INTEGER);
  319.  BEGIN
  320.    IF M+J >= LPPG THEN M := LPPG
  321.    ELSE
  322.      FOR J := 1 TO J DO BEGIN BEGINLINE; WRITELN END
  323.  END (*SKIP*) ;
  324.  
  325.  
  326.  
  327. PROCEDURE NEWLINE;
  328.  
  329.  
  330.   
  331.  BEGIN CCOUNT := 0;
  332.    NESTCOUNT := 1; NEST[1] := NESTING;
  333.    IF N < MAXN THEN
  334.    BEGIN BEGINLINE;  N := N + 1;
  335.        LN := N;  WRITE(LN:6, ' ')
  336.      END
  337.    ELSE BEGIN
  338.      WRITELN(STARS, ' TEXT TOO LONG', STARS);
  339.      GOTO 99
  340.      END
  341.  END (*NEWLINE*) ;
  342.  
  343.  
  344.  
  345.  
  346.    (* IF NOT RESERVED WORD,PUT IN TABLE T VIA MODULO P HASHING
  347.    ALGORITM BASED ON ORDINAL VALUE OF WORD TO BE STORED *)
  348.  PROCEDURE SEARCH;   (*MODULO P HASH SEARCH*)
  349.    VAR H,D: INDEX;
  350.        X,Y: REF; F: BOOLEAN;
  351.  BEGIN
  352.     H:= (ABS(ID.ORD) DIV 1024) MOD P;
  353.    F := FALSE; D := 1;
  354.    NEW(X); X^.LNO := LN;
  355.    REPEAT
  356.      IF T[H].KEY = ID.A THEN
  357.      BEGIN (*FOUND*) F := TRUE;
  358.        Y := T[H].LAST; X^.NEXT := Y^.NEXT;
  359.        Y^.NEXT := X; T[H].LAST := X
  360.      END ELSE
  361.      IF T[H].KEY = EMPTY THEN
  362.      BEGIN (*NEW ENTRY*) F := TRUE;
  363.        T[H].KEY := ID.A;
  364.        T[H].LAST := X; X^.NEXT := X
  365.      END ELSE
  366.      BEGIN (*COLLISION*) H := H+D; D := D+2;
  367.        IF H >= P THEN H := H-P;
  368.        IF D = P THEN
  369.          BEGIN WRITELN; WRITELN(STARS,' TABLE FULL',STARS); GOTO 99
  370.          END
  371.      END
  372.    UNTIL F
  373.  END (*SEARCH*) ;
  374.  
  375.  
  376.  
  377.  
  378.  PROCEDURE SORT(MIN, MAX: INTEGER);
  379.     (* ALPHABETIZE CROSS REFERENCE TABLE (T) VIA QUICK SORT*)
  380.    (* TABLE T HAS BEEN COMPRESSED  *)
  381.  
  382.  
  383.  
  384.  
  385.  (* QUICKSORT WITH BOUNDED RECURSION DEPTH *)
  386.  (* REQUIRES MIN <= MAX *)
  387.  
  388.  
  389.  
  390.  
  391.     VAR
  392.           LOW,
  393.          HIGH: INDEX1;
  394.        MIDKEY: ALFA;
  395.          TEMP: WORD;
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.     BEGIN
  403.  
  404.  
  405.  
  406.  
  407.    (*                                      *)
  408.        REPEAT (*PICK SPLIT POINT*)
  409.           MIDKEY := T[(MIN + MAX) DIV 2].KEY;
  410.           LOW := MIN;
  411.           HIGH := MAX;
  412.           REPEAT (*PARTITION*)
  413.              WHILE T[LOW].KEY < MIDKEY DO
  414.                 LOW := LOW + 1;
  415.              WHILE T[HIGH].KEY > MIDKEY DO
  416.                 HIGH := HIGH - 1;
  417.             IF LOW <= HIGH THEN
  418.                 BEGIN
  419.                    TEMP := T[LOW];
  420.                    T[LOW] := T[HIGH];
  421.                    T[HIGH] := TEMP;
  422.                    LOW := LOW + 1;
  423.                    HIGH := HIGH - 1
  424.                 END;
  425.           UNTIL LOW > HIGH;
  426.  
  427.  
  428.  
  429.  
  430.           (*RECURSIVELY SORT SHORTER SUB-SEGMENT*)
  431.           IF HIGH - MIN < MAX - LOW
  432.           THEN
  433.              BEGIN
  434.                 IF MIN < HIGH THEN
  435.                    SORT(MIN, HIGH);
  436.                 MIN := LOW
  437.              END
  438.           ELSE
  439.              BEGIN
  440.                 IF LOW < MAX THEN
  441.                    SORT(LOW, MAX);
  442.                 MAX := HIGH
  443.              END
  444.        UNTIL MAX <= MIN
  445.     END (*SORT*);
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  PROCEDURE NOTEPROC;   (*NOTE INSTANCE OF PROCEDURE OR FUNCTION*)
  455.    VAR P: PROCREF;
  456.  BEGIN PROCORFUNC := FALSE;
  457.    NEW(P); PROCPTR^.NEXT := P;
  458.    P^.NAME := ID.A; P^.LNO := LN; P^.NEXT := NIL;
  459.    PROCPTR := P
  460.  END (*NOTEPROC*) ;
  461.  
  462.  
  463.  
  464.  
  465.  PROCEDURE PRINTWORD(W: WORD);
  466.    VAR L: INTEGER; X,Y: REF;
  467.        K: ALFA;
  468.  BEGIN K := W.KEY; L := KLN;
  469.    BEGINLINE; WRITE(' ', K);
  470.    X := W.LAST^.NEXT; Y := X;
  471.    L := 0;
  472.    REPEAT
  473.      IF L = NOPL THEN
  474.        BEGIN L := 0; WRITELN; BEGINLINE; WRITE(' ':KLN+1)
  475.        END;
  476.      L := L+1; WRITE(X^.LNO: DGPN); X := X^.NEXT
  477.    UNTIL X = Y;
  478.    WRITELN
  479.  END (*PRINTWORD*) ;
  480.  
  481.  
  482.  
  483.  
  484.  PROCEDURE PRINTTABLE;
  485.    (* COMPRESS HASH TABLE T AND GO TO SORT TO ALPHABETIZE *)
  486.    VAR I,M: INDEX;
  487.  
  488.  
  489.  BEGIN M := 0;    (*COMPRESS TABLE*)
  490.    FOR I := 0 TO P-1 DO
  491.      IF T[I].KEY <> EMPTY THEN
  492.        BEGIN T[M] := T[I]; M := M+1
  493.        END ;
  494.  
  495.  
  496.  
  497.  
  498.    IF M > 0 THEN SORT(0,M-1);
  499.    NOPL := (LLOUT-KLN-1) DIV DGPN;
  500.    SKIP(2);
  501.    BEGINLINE;
  502.    WRITELN(' CROSS REFERENCE OF IDENTIFIERS,',
  503.            ' AND LABEL DECLARATIONS:');
  504.    SKIP(1);
  505.    FOR I := 0 TO M-1 DO PRINTWORD(T[I])
  506.  END (*PRINTTABLE*) ;
  507.  
  508.  
  509.  
  510.  
  511.  PROCEDURE PRINTPROCS;
  512.    VAR N: ALFA; L: INTEGER;
  513.  BEGIN SKIP(2); BEGINLINE;
  514.    WRITELN(' LIST OF PROCEDURES, FUNCTIONS, TASKS, AND PACKAGES USED:');
  515.    SKIP(1);
  516.    PROCPTR := FIRSTPROC^.NEXT;
  517.    WHILE PROCPTR <> NIL DO
  518.      WITH PROCPTR^ DO
  519.        BEGIN BEGINLINE;
  520.          N := NAME; L := KLN;
  521.          WRITELN(' ',N:KLN+3, LNO:10);
  522.          PROCPTR := NEXT
  523.        END
  524.  END (*PRINTPROCS*) ;
  525.  
  526.  
  527.  
  528.  
  529.  PROCEDURE INITIALIZE;
  530.  
  531.  
  532.  BEGIN
  533.    NEW(PROCPTR); FIRSTPROC := PROCPTR; PROCPTR^.NEXT := NIL;
  534.      PROCPTR^.NEXT := NIL
  535.  END (*INITIALIZE*) ;
  536.  
  537.  
  538.  
  539.  
  540.  PROCEDURE SCANANDLISTINPUT;
  541.   (*  EVALUATE CHARACTERS VIA CASE STATEMENT *)
  542.    VAR I,N,NLAST,QUOTECT:INTEGER;
  543.  BEGIN
  544.    WHILE NOT EOF(INPUT) DO
  545.    BEGIN NEWLINE;
  546.      WHILE NOT EOLN(INPUT) DO
  547.    (* VARIABLE, ATTRIBUTE, RESERVED WORD *)
  548.      CASE INPUT^ OF
  549.       'A','B','C','D','E','F','G','H','I','J','K','L','M',
  550.       'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
  551.       'a','b','c','d','e','f','g','h','i','j','k','l','m',
  552.       'n','o','p','q','r','s','t','u','v','w','x','y','z': 
  553.        BEGIN K := 0; ID.A := EMPTY;
  554.          REPEAT
  555.            IF K < KLN THEN
  556.              BEGIN K := K+1; ID.A[K] := INPUT^
  557.              END;
  558.            ADVANCE
  559.           UNTIL NOT(INPUT^ IN['A'..'Z','a'..'z','0'..'9','_','''']);
  560.          CLASSIFY;
  561.          IF KEYINDEX = 0 THEN
  562.            BEGIN SEARCH;
  563.              IF PROCORFUNC THEN NOTEPROC
  564.            END
  565.          ELSE
  566.            (*IF  A RESERVED WORD THEN CHECK FOR NESTING LEVEL*)
  567.            (*OR THE OCCURANCE OF A PROCEDURE OR FUNCTION*)
  568.            IF (ID.A = PROCKEY) OR (ID.A = FUNCKEY) OR (ID.A = TASKKEY)
  569.            OR (ID.A = USE_KEY)  OR (ID.A = WITH_KEY) OR (ID.A = PROCLOW)
  570.            OR (ID.A = FUNCLOW) OR (ID.A = TASKLOW) OR (ID.A = USELOW)
  571.            OR (ID.A = WITHLOW) THEN
  572.              BEGIN PROCORFUNC := TRUE;
  573.                IF NESTCOUNT > 1 THEN NESTCOUNT := NESTCOUNT + 1;
  574.                NEST[NESTCOUNT] := -1
  575.              END
  576.            ELSE
  577.              BEGIN IF (ID.A=BEGINKEY) OR (ID.A=BEGINLOW) THEN INBODY:=TRUE
  578.                ELSE IF (ID.A=ACCEPT_KEY) OR (ID.A=ACCEPTLOW) THEN INBODY:=TRUE
  579.                ELSE IF (ID.A=CASEKEY) OR (ID.A=CASELOW) THEN INBODY:=TRUE
  580.                ELSE IF (ID.A=IFKEY) OR (ID.A=IFLOW) THEN INBODY:=TRUE
  581.                ELSE IF (ID.A=LOOPKEY) OR (ID.A=LOOPLOW) THEN INBODY:=TRUE
  582.                ELSE IF (ID.A=PACKKEY) OR (ID.A=PACKLOW) THEN INBODY:=TRUE
  583.                ELSE IF (ID.A=RECKEY) OR (ID.A=RECLOW) THEN INBODY:=TRUE
  584.                ELSE IF (ID.A=SELECT_KEY) OR (ID.A=SELECTLOW) THEN INBODY:=TRUE;
  585.                IF INBODY THEN
  586.                  BEGIN N := NESTING;
  587.                    NESTING := NESTING + KEY[KEYINDEX].N;
  588.                    IF NESTING <> N THEN
  589.                      BEGIN IF NESTING < 0 THEN NESTING := 0;
  590.                        NESTCOUNT := NESTCOUNT + 1;
  591.                        IF NESTING > N THEN NEST[NESTCOUNT] := NESTING
  592.                        ELSE
  593.                          BEGIN NEST[NESTCOUNT] := N;
  594.                            ADVANCE;
  595.                            WHILE NOT(EOLN(INPUT)) DO
  596.                             ADVANCE;
  597.                         END
  598.                      END
  599.                  END
  600.              END
  601.        END;
  602.    (* NUMBER *)
  603.       '0','1','2','3','4','5','6','7','8','9': 
  604.          REPEAT ADVANCE;
  605.        UNTIL NOT (INPUT^ IN ['A','B','C','D','E','F',
  606.            '#','-','+','0'..'9','_']);
  607.   (* STRING OR STRING LITERAL FUNCTION NAME *)
  608.           '"': 
  609.     BEGIN
  610.       IF PROCORFUNC THEN
  611.         BEGIN (* STRING LITERAL FUNCTION NAME *)
  612.           K:=0; ID.A:=EMPTY;
  613.           QUOTECT:=1;
  614.           REPEAT
  615.             IF K<KLN THEN
  616.               BEGIN K:=K+1;
  617.                 ID.A[K]:=INPUT^;
  618.                 ADVANCE;
  619.                 IF INPUT^='"' THEN
  620.                   QUOTECT:=QUOTECT+1;
  621.               END;
  622.           UNTIL (QUOTECT MOD 2=0) AND (INPUT^<>'"');
  623.                 SEARCH;
  624.                 NOTEPROC
  625.         END
  626.       ELSE
  627.         BEGIN
  628.          REPEAT ADVANCE;
  629.            UNTIL(INPUT^= '"') OR EOLN (INPUT);
  630.          IF NOT EOLN(INPUT) THEN
  631.            ADVANCE
  632.         END
  633.     END;
  634.   (*CHARACTER LITERAL*)
  635.      '''': 
  636.      BEGIN  ID.A:=EMPTY;
  637.        FOR K:=1 TO 3 DO
  638.           BEGIN
  639.            ID.A[K]:=INPUT^;
  640.            ADVANCE;
  641.           END;
  642.         SEARCH;
  643.      END;
  644.   (*COMMENT*)
  645.       '-': 
  646.       BEGIN ADVANCE;
  647.         IF INPUT^='-' THEN
  648.           BEGIN ADVANCE;
  649.             WHILE NOT(EOLN(INPUT))DO
  650.               ADVANCE;
  651.           END;
  652.         END;
  653.   (*SPECIAL CHARACTER*)
  654.        '%',
  655.       '+','*','/',')','$','=',' ',',','.','[',']','(',
  656.       '|',':','!','&','#','?','<','>','@','\','^',';': 
  657.       ADVANCE
  658.      END (*CASE*) ;
  659.   (*OUTPUT NESTING LEVEL*)
  660.     IF (LLOUT = LLOUTMAX) AND (NESTCOUNT > 1) THEN
  661.        BEGIN
  662.          IF CCOUNT >= 100 THEN WRITE('  ')
  663.          ELSE WRITE(' ':100-CCOUNT);
  664.          NLAST := NEST[1];
  665.          IF NEST[1] = NEST[2] THEN WRITE(' ');
  666.          FOR I := 2 TO NESTCOUNT DO
  667.            BEGIN N := NEST[I];
  668.              IF N < 0 THEN WRITE(' . ')
  669.              ELSE
  670.                BEGIN
  671.                  IF N > NLAST THEN WRITE('[');
  672.                  IF (N <> NLAST) OR (I = 2) OR (N = 0) THEN
  673.                    IF N > 0 THEN WRITE(N:1)
  674.                    ELSE WRITE('*');
  675.                  IF N <= NLAST THEN WRITE(']')
  676.                END;
  677.              NLAST := N
  678.            END
  679.        END;
  680.      WRITELN; READLN
  681.    END ;
  682.  END (*SCANANDLISTINPUT*) ;
  683.  
  684.  
  685.  
  686.  
  687.  BEGIN (*CROSSREF*)
  688.    IF NOT EOF(INPUT) THEN
  689.    BEGIN LINELIMIT(OUTPUT, MAXN); INITIALIZE;
  690.      SCANANDLISTINPUT; LINELIMIT(OUTPUT, MAXN);
  691.      IF NOT PAGINATING THEN
  692.        BEGIN PAGINATING := TRUE; M := LPPG END;
  693.      PRINTTABLE; PRINTPROCS
  694.    END ELSE WRITELN(STARS,' NO PROGRAM FOUND TO CROSS REFERENCE',STARS);
  695.  99:END .
  696.