home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / LITERALS.ZIP / LITERALS.PAS
Encoding:
Pascal/Delphi Source File  |  1985-10-11  |  4.2 KB  |  297 lines

  1.  
  2.  
  3.  
  4. (*
  5.  * literals - filter to pass only the literal strings in a pascal source file
  6.  *
  7.  * 11-oct-85 shs - derived from pp.pas
  8.  *
  9.  *)
  10. {$p5120,g512,c-,d-}
  11.  
  12.  
  13. program paspp (input,
  14.                output);
  15. const
  16.    linelen =      128;        {longest line length}
  17.  
  18.    newline =      ^J;
  19.  
  20. type
  21.    anystring =    string [linelen];
  22.  
  23.    toktypes =     (number,
  24.                    identifier,
  25.                    strng,
  26.                    comment,
  27.                    unknown);
  28.  
  29. var
  30.    ltok:          anystring;
  31.    tok:           anystring;
  32.    toktype:       toktypes;
  33.    unchrflag:     char;
  34.    line:          integer;
  35.  
  36.  
  37.  
  38. (*
  39.  * pascal lexical scanner
  40.  *
  41.  *)
  42.  
  43. function getchar: char;
  44. var
  45.    c:             char;
  46.  
  47. begin
  48.  
  49.    if unchrflag <> chr (0) then
  50.    begin
  51.       getchar := unchrflag;
  52.       unchrflag := chr (0);
  53.    end
  54.    else
  55.    begin
  56.  
  57.       if eof (input) then
  58.       begin
  59.          writeln(con, ' input lines');
  60.          halt;
  61.       end
  62.       else
  63.          read(input, c);
  64.  
  65.       if c = newline then
  66.       begin
  67.          line := line + 1;
  68.  
  69.          if (line mod 16)= 1 then
  70.             write(con, #13, line : 5);
  71.       end;
  72.  
  73.       getchar := c;
  74.    end;
  75. end;
  76.  
  77. procedure ungetchar (c:             char);
  78. begin
  79.    unchrflag := c;
  80. end;
  81.  
  82. procedure scanident;
  83. var
  84.    c:             char;
  85.  
  86. begin
  87.    toktype := unknown;
  88.  
  89.    repeat
  90.       c := getchar;
  91.  
  92.       case c of
  93.          'a'..'z', 'A'..'Z', '0'..'9', '_':
  94.             ltok := ltok + c;
  95.  
  96.          else           toktype := identifier;
  97.       end;
  98.  
  99.    until toktype = identifier;
  100.  
  101.    ungetchar(c);
  102. end;
  103.  
  104.  
  105. procedure scannumber;
  106. var
  107.    c:             char;
  108.  
  109. begin
  110.    toktype := unknown;
  111.  
  112.    repeat
  113.       c := getchar;
  114.  
  115.       case c of
  116.          '0'..'9', '.': ltok := ltok + c;
  117.  
  118.          else           toktype := number;
  119.       end;
  120.  
  121.    until toktype = number;
  122.  
  123.    ungetchar(c);
  124. end;
  125.  
  126.  
  127. procedure scanstring;
  128. var
  129.    c:             char;
  130.  
  131. begin
  132.    toktype := unknown;
  133.  
  134.    repeat
  135.       c := getchar;
  136.       ltok := ltok + c;
  137.  
  138.       if c = '''' then
  139.       begin
  140.          c := getchar;
  141.  
  142.          if c = '''' then
  143.             ltok := ltok + c
  144.          else
  145.          begin
  146.             ungetchar(c);
  147.             toktype := strng;
  148.          end;
  149.       end;
  150.  
  151.    until toktype = strng;
  152. end;
  153.  
  154.  
  155.  
  156. procedure scanhex;
  157. var
  158.    c:             char;
  159.  
  160. begin
  161.    c := getchar;
  162.  
  163.    while c in ['0'..'9', 'A'..'F', 'a'..'f'] do
  164.    begin
  165.       ltok := ltok + c;
  166.       c := getchar;
  167.    end;
  168.  
  169.    ungetchar(c);
  170.    toktype := number;
  171. end;
  172.  
  173.  
  174. procedure scantok;
  175. var
  176.    c:             char;
  177.  
  178. begin
  179.  
  180.    repeat
  181.       c := getchar;
  182.  
  183.       case c of
  184.          ' ',^I,^M,^J,^@,^L:
  185.             c := newline;
  186.       end;
  187.    until c <> newline;
  188.  
  189.    ltok := c;
  190.  
  191.    case c of
  192.       'a'..'z', '_', 'A'..'Z':
  193.          scanident;
  194.  
  195.       '0'..'9', '#': scannumber;
  196.  
  197.       '''':          scanstring;
  198.  
  199.       '$':           scanhex;
  200.  
  201.       else           toktype := unknown;
  202.    end;
  203. end;
  204.  
  205.  
  206. procedure gettok; forward;
  207.  
  208. procedure skipcurlycomment;
  209. var
  210.    c:             char;
  211.  
  212. begin
  213.  
  214.    c := getchar;
  215.    while c <> '}' do
  216.    begin
  217.       c := getchar;
  218.    end;
  219.  
  220.    toktype := comment;
  221.  
  222. end;
  223.  
  224.  
  225. procedure skipparencomment;
  226. var
  227.    c:             char;
  228.  
  229. begin
  230.  
  231.    repeat
  232.       c := getchar;
  233.  
  234.       if c = '*' then
  235.       begin
  236.          c := getchar;
  237.  
  238.          if c = ')' then
  239.             toktype := comment
  240.          else
  241.             ungetchar(c);
  242.       end;
  243.  
  244.    until toktype = comment;
  245.  
  246. end;
  247.  
  248.  
  249. procedure gettok;
  250. var
  251.    i:             integer;
  252.    c:             char;
  253.  
  254. begin
  255.       repeat
  256.          scantok;
  257.  
  258.          if ltok = '{' then
  259.             skipcurlycomment;
  260.  
  261.          if ltok = '(' then
  262.          begin
  263.             c := getchar;
  264.  
  265.             if c = '*' then
  266.                skipparencomment
  267.             else
  268.                ungetchar(c);
  269.          end;
  270.  
  271.       until toktype <> comment;
  272.  
  273.       tok := ltok;
  274. end;
  275.  
  276.  
  277. procedure scaninit;
  278. begin
  279.    ltok := '';
  280.    tok := '';
  281.    toktype := unknown;
  282.    line := 0;
  283. end;
  284.  
  285.  
  286. begin
  287.    scaninit;
  288.  
  289.    repeat
  290.       gettok;
  291.  
  292.       if toktype = strng then
  293.          writeln(tok);
  294.  
  295.    until eof(input);
  296. end.
  297.