home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / turbopas / tlist11.lbr / PARSER.PQS / parser.pas
Pascal/Delphi Source File  |  1985-11-08  |  3KB  |  68 lines

  1. PROCEDURE Replace_Symbols_In_Line(VAR Line : Line_Type);
  2. {
  3. This routine parses the given line for "legal" symbols composed of alphanumeric
  4. characters or underlines only; as it finds each symbol, it determines if the
  5. symbol is one of the three kinds in the symbol tables: reserved words, standard
  6. identifiers, or dedicated identifiers.  When a tabulated symbol is found, it is
  7. replaced with its accented version; the accent depends on the type of symbol.
  8. }
  9.  
  10. VAR
  11.  X : CHAR;
  12.  
  13. BEGIN
  14.  I := 1;
  15.  Symbol[0] := CHR(0);          {Set Symbol to a null string}
  16.  WHILE I <= LENGTH(Line) DO
  17.   BEGIN
  18.    X := Line[I];
  19.    IF ((X = '{') OR ((X = '(') AND (I < LENGTH(Line)) AND
  20.     (Line[I + 1] = '*'))) AND (NOT Strng) THEN Comment := TRUE;
  21.    IF ((X = '}') OR ((X = ')') AND (I > 1) AND
  22.     (Line[I - 1] = '*'))) AND (NOT Strng) THEN Comment := FALSE;
  23.    IF (X = '''') AND (NOT Comment) THEN Strng := NOT Strng;
  24.    IF (Page_number >= Starting_page_number) AND NOT (Comment OR Strng) THEN
  25.     BEGIN
  26.      IF (X >= 'a') AND (X <= 'z') THEN X := UPCASE(Line[I]);
  27.      IF  ((X >= 'A') AND (X <= 'Z'))
  28.       OR  (X = '_')
  29.       OR ((X >= '0') AND (X <= '9')) THEN
  30.       Symbol := CONCAT(Symbol, X)
  31.      ELSE
  32.       IF LENGTH(Symbol) <> 0 THEN
  33.        BEGIN
  34.         Search_Replace(Symbol, Reserved_Word_Accent_begin,
  35.          Reserved_Word_Accent_end, Reserved_Word_HT, Reserved_Word_CT,
  36.          Reserved_Word_ST, Res_Word_Hsh_size, Reserved_Word_Upper_Case, Line,
  37.          I);
  38.         Search_Replace(Symbol, Standard_Identifier_Accent_begin,
  39.          Standard_Identifier_Accent_end, Standard_Identifier_HT,
  40.          Standard_Identifier_CT, Standard_Identifier_ST, Stan_Ident_Hsh_size,
  41.          Standard_Identifier_Upper_Case, Line, I);
  42.         Search_Replace(Symbol, Dedicated_Identifier_Accent_begin,
  43.          Dedicated_Identifier_Accent_end, Dedicated_Identifier_HT,
  44.          Dedicated_Identifier_CT, Dedicated_Identifier_ST,
  45.          Ded_Ident_Hsh_size, Dedicated_Identifier_Upper_Case, Line, I);
  46.         Symbol[0] := CHR(0);
  47.        END;
  48.     END
  49.    ELSE
  50.     Symbol[0] := CHR(0);
  51.    I := I + 1;
  52.   END;
  53.  IF LENGTH(Symbol) <> 0 THEN
  54.   BEGIN
  55.    Search_Replace(Symbol, Reserved_Word_Accent_begin,
  56.     Reserved_Word_Accent_end, Reserved_Word_HT, Reserved_Word_CT,
  57.     Reserved_Word_ST, Res_Word_Hsh_size, Reserved_Word_Upper_Case, Line, I);
  58.    Search_Replace(Symbol, Standard_Identifier_Accent_begin,
  59.     Standard_Identifier_Accent_end, Standard_Identifier_HT,
  60.     Standard_Identifier_CT, Standard_Identifier_ST, Stan_Ident_Hsh_size,
  61.     Standard_Identifier_Upper_Case, Line, I);
  62.    Search_Replace(Symbol, Dedicated_Identifier_Accent_begin,
  63.     Dedicated_Identifier_Accent_end, Dedicated_Identifier_HT,
  64.     Dedicated_Identifier_CT, Dedicated_Identifier_ST,
  65.     Ded_Ident_Hsh_size, Dedicated_Identifier_Upper_Case, Line, I);
  66.   END;
  67. END;
  68.