Contributor: SWAG SUPPORT TEAM 
LARRY HADLEY
 Errata: include an "info" Pointer field in the SYMTAB_NODE
 structure in the previous post.
 USING THE SYMBOL TABLE - A CROSS REFERENCER
 A cross-reference is a listing of a Programs identifiers in
 alphabetical order:
Page 1 hello.pas April 08 1993 19:03
 1 0: Program hello (output);
 2 0: Var i:Integer;
 3 0: begin
 4 0: For i := 1 to 10 do
 5 0: begin
 6 0: WriteLn('Hello world.');
 7 0: end;
 8 0: end.
Cross Reference
---------------
hello 1
i 2 4
Integer 2
ouput 1
Writeln 6
 As shown above, alongside each identifier's name are the source
 line numbers that contain the identifier. (This is useful for
 tracking where they're used)
 A cross-referencer reads the source File and looks for
 identifiers, using the scanner you've built previously. The first
 time a particular identifier is found, it is inserted in the
 symbol tree along With it's line number. Subsequent appearances of
 the same identifier update the symbol tree With an additional line
 number appended to the list of line numbers.
 As soon as the Program is completely scanned, all the identifier
 names and their line numbers are printed.
 Use the INFO field of SYMTAB_NODE to point to a LINKED LIST of
 line numbers.
 The main loop should scan For tokens Until it finds a period, or
 Exits With an "Unexpected end of File" error. For each identifier,
 search the symbol table to see if their were any previous
 instances of the identifier. If it is not found, then this must be
 the first time it is used so we can call the "enter" Function to
 create a new node.
 Then, whether a new node was actually created or not, we call a
 Function to add the line number to the queue of line numbers
 attached to the node's "info" field. Finally, when the scanner
 loop terminates, we call a printing Function which traverses the
 tree from left to right to print the sorted tree - and all the
 line numbers in the linked list attached to each node.
 Note that a recursive call to itself is probably the easiest way
 to do this, since _all_ the nodes of the tree are being accessed,
 not just one.
 Types you will need:
Type
 pLINENUMS = ^LINENUM_NODE;
 LINENUM_NODE = Record
 next :pLINENUMS;
 line :Integer;
 end;
 pLINE_HEADER = ^LINENUM_HDR;
 LINENUM_HDR = Record
 first, last :pLINENUMS;
 end;
 EXCERCISE #1
 Write a cross referencer, as above. Text it With an assortment of
 pascal sourceFiles.
 ADVANCED EXCERCISE
 Note that the symbol table above converts all identifier names to
 lower case. What would be needed to reWrite the scanner/xref
 Program to preserve case? ReWrite the xref Program to do so. (note
 that Pascal compilers are Case insensitive, so the symbol table -
 For compatibility - must compare lower case)
 "BRAIN TEASERS"
 1. What would be necessary to reWrite the symbol table as a hash
 table?
 2. If an identifier appears more than once in a line, line
 numbers will appear more than once in the listing. Fix xref to
 recognize duplicate occurences of line numbers in node-lists.
 -----------------------------------------------------------------
 Next: Pascal source cruncher.
 

AltStyle によって変換されたページ (->オリジナル) /