home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / pascal / qparser.arc / PMACS.TXT < prev    next >
Text File  |  1985-10-02  |  3KB  |  89 lines

  1. { Sample macros for Pascal parsers. }
  2.  
  3. { This first group is not used much. }
  4. begin_comment = '{';
  5. char_quote = '''';            { for C, which makes a distinction }
  6. end_comment = '}';
  7. string_quote = '''';
  8. zero_origin = 'false';        { don't force zero origin for arrays }
  9.  
  10. { Apply cases:  Either a nop is generated (when there are 0 flags),
  11.   or a case for each flag.  #N stands for the flag name, and #P for
  12.   the whole production.  Note that there will be trouble if the
  13.   production has token(s) with a closing curly brace. }
  14. apply_case =
  15. "case pflag of#{
  16.   #N:  { #P }
  17.     begin
  18.       writeln(rfile, '#N applied.')
  19.     end#^;#}
  20.   end  { apply case };
  21. ";
  22. apply_nop =  "{ no tagged productions }
  23. ";
  24.  
  25. { Array inits (including token tables). }
  26. token_table_init =
  27.   { section which defines the tok table.  #N is the token name,
  28.     #V is the token value (which the same as the index), and #X is
  29.     the cumulative character count, plus one for a terminator. }
  30. "{ initialize the token tables. }#{
  31. puttok('#N', #V, #X);#}
  32. ";
  33. array_names =  { array names, in the traditional order. }
  34.   'STATEX, MAP, POPNO, STK_STATE, STK_TOSTATE,
  35.    TOKNUM, TOSTATE, INSYM, PRODX, PRODS';
  36. array_types =  { array type names, in the same order }
  37.   'state_array, reduce_array, pop_array, ss_array, ss_array,
  38.    token_array, tostate_array, insym_array, reduce_array, prod_array';
  39. array_line_break = '#-
  40.   { #3I: }  ';  { stuff to be inserted when the elt count overflows }
  41. array_static_init =
  42.   { template for Turbo Pascal typed consts.  translated starting
  43.     from the #{, it means start loop, print the line break string
  44.     if on the first or nth element, print the value, exit if none
  45.     left, print ", ", and terminate the loop. }
  46. '#N:  #T = (#{#10@#V#^, #});
  47. ';
  48. array_assignment_init =
  49.   { set of subscripted assignments for array initialization }
  50. "{ initialize the #N array }#{
  51. #N[#I] := #V;#}
  52. ";
  53.  
  54. { Symbol table initialization }
  55. symbol_table_init =
  56.   { section which defines reserved wds.  one putsym call per symbol;
  57.     #N is name, and #V is value (#I is also available). }
  58. "{ initialize keywords in the symbol table. }#{
  59. putsym('#N', #V);#}
  60. ";
  61.  
  62. { scanner stuff }
  63.  
  64. char_case =  { character case in the scanner }
  65. "'#C':  #S  { '#C' character case };
  66. ";
  67. char_next_char =
  68.   { start working on the next character position. }
  69. "begin
  70.   nextch;
  71.   #S
  72. end";
  73. char_assignment = "token := #V  { '#N' }";  { when the token is known }
  74. char_test =
  75.   { the character in the current position is ambiguous.  If the next
  76.     token starts with #C, then start working on the next character
  77.     position; else try the next possibility for this character
  78.     position.  this form is repeated until the ambiguity quits. }
  79. "if ch = '#C' then
  80.   #S
  81. else #~";
  82. char_error =
  83.   { when there is no token which matches the prefix scanned. }
  84. "
  85.   begin
  86.     error('Illegal character');
  87.     get_token;
  88.   end";
  89.