home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / tex / texsrc2 / Src / web2c / L / web2c
Encoding:
Text File  |  1993-05-01  |  4.5 KB  |  184 lines

  1. %{
  2. /* web2c.lex -- lexical analysis for Tangle output.  */
  3.  
  4. #include "web2c.h"
  5. #ifdef RISCOS
  6. #include "Y_tab.h"
  7. #else
  8. #include "y.tab.h"
  9. #endif
  10.  
  11. /* For some reason flex wants to do a system call, so we must lose the
  12.    definition of the Pascal read that is in `pascal.h'.  */
  13. #undef read
  14.  
  15. char conditional[20], negbuf[2], temp[20];
  16. extern boolean doing_statements;
  17. %}
  18. DIGIT        [0-9]
  19. ALPHA        [a-zA-Z]
  20. ALPHANUM    ({DIGIT}|{ALPHA})
  21. IDENTIFIER    ({ALPHA}{ALPHANUM}*)
  22. NUMBER        ({DIGIT}+)
  23. SIGN        ("+"|"-")
  24. SIGNED        ({SIGN}?{NUMBER})
  25. WHITE        [ \n\t]+
  26. REAL        ({NUMBER}"."{NUMBER}("e"{SIGNED})?)|({NUMBER}"e"{SIGNED})
  27. COMMENT        (("{"[^}]*"}")|("(*"([^*]|"*"[^)])*"*)"))
  28. W        ({WHITE}|"packed ")+
  29. WW        ({WHITE}|{COMMENT}|"packed ")*
  30. HHB0        ("hh"{WW}"."{WW}"b0")
  31. HHB1        ("hh"{WW}"."{WW}"b1")
  32.  
  33. %%
  34. {W}                ;
  35. "{"        {while (input() != '}') ;}
  36.  
  37. "#"        {
  38.             register int c;
  39.             (void) putc('#', std);
  40.             while ((c = input()) && c != ';')
  41.             (void) putc(c, std);
  42.             (void) putc('\n', std);
  43.         }
  44.  
  45. "ifdef("    {register int c;
  46.          extern char my_routine[];
  47.          register char *cp=conditional;
  48.          new_line();
  49.          (void) input();
  50.          while ((c = input()) != '\'')
  51.             *cp++ = c;
  52.          *cp = '\0';
  53.          (void) input();
  54.          if (doing_statements) fputs("\t;\n", std);
  55.          (void) fprintf(std,
  56.             "#ifdef %s\n", conditional);
  57.         }
  58.  
  59. "endif("    {register int c;
  60.          new_line();
  61.          fputs("#endif /* ", std);
  62.          (void) input();
  63.          while ((c = input()) != '\'')
  64.             (void) putc(c, std);
  65.          (void) input();
  66.          conditional[0] = '\0';
  67.          fputs(" */\n", std);
  68.         }
  69.  
  70. "procedure "[a-z]+";"[ \n\t]*"forward;"    ;
  71.  
  72. "function "[(),:a-z]+";"[ \n\t]*"forward;"    ;
  73.  
  74. "@define"    return last_tok=define_tok;
  75. "@field"    return last_tok=field_tok;
  76. "and"        return last_tok=and_tok;
  77. "array"        return last_tok=array_tok;
  78. "begin"        return last_tok=begin_tok;
  79. "case"        return last_tok=case_tok;
  80. "const"        return last_tok=const_tok;
  81. "div"        return last_tok=div_tok;
  82. "break"        return last_tok=break_tok;
  83. "do"        return last_tok=do_tok;
  84. "downto"    return last_tok=downto_tok;
  85. "else"        return last_tok=else_tok;
  86. "end"        return last_tok=end_tok;
  87. "file"        return last_tok=file_tok;
  88. "for"        return last_tok=for_tok;
  89. "function"    return last_tok=function_tok;
  90. "goto"        return last_tok=goto_tok;
  91. "if"        return last_tok=if_tok;
  92. "label"        return last_tok=label_tok;
  93. "mod"        return last_tok=mod_tok;
  94. "not"        return last_tok=not_tok;
  95. "of"        return last_tok=of_tok;
  96. "or"        return last_tok=or_tok;
  97. "procedure"    return last_tok=procedure_tok;
  98. "program"    return last_tok=program_tok;
  99. "record"    return last_tok=record_tok;
  100. "repeat"    return last_tok=repeat_tok;
  101. {HHB0}        return last_tok=hhb0_tok;
  102. {HHB1}        return last_tok=hhb1_tok;
  103. "then"        return last_tok=then_tok;
  104. "to"        return last_tok=to_tok;
  105. "type"        return last_tok=type_tok;
  106. "until"        return last_tok=until_tok;
  107. "var"        return last_tok=var_tok;
  108. "while"        return last_tok=while_tok;
  109. "others"    return last_tok=others_tok;
  110.  
  111. {REAL}        {        
  112.           (void) sprintf(temp, "%s%s", negbuf, yytext);
  113.           negbuf[0] = '\0';
  114.           return last_tok=r_num_tok;
  115.         }
  116.  
  117. {NUMBER}    {
  118.           (void) sprintf(temp, "%s%s", negbuf, yytext);
  119.           negbuf[0] = '\0';
  120.           return last_tok=i_num_tok;
  121.         }
  122.  
  123. ("'"([^']|"''")"'")        return last_tok=single_char_tok;
  124.  
  125. ("'"([^']|"''")*"'")        return last_tok=string_literal_tok;
  126.  
  127. "+"        { if ((last_tok>=undef_id_tok &&
  128.               last_tok<=field_id_tok) ||
  129.               last_tok==i_num_tok ||
  130.               last_tok==r_num_tok ||
  131.               last_tok==')' ||
  132.               last_tok==']')
  133.            return last_tok='+';
  134.         else return last_tok=unary_plus_tok; }
  135.  
  136. "-"        { if ((last_tok>=undef_id_tok &&
  137.               last_tok<=field_id_tok) ||
  138.               last_tok==i_num_tok ||
  139.               last_tok==r_num_tok ||
  140.               last_tok==')' ||
  141.               last_tok==']')
  142.            return last_tok='-';
  143.         else {
  144.           int c;
  145.           while ((c = input()) == ' ' || c == '\t')
  146.                     ;
  147.             unput(c);
  148.           if (c < '0' || c > '9') {
  149.             return last_tok = unary_minus_tok;
  150.           }
  151.           negbuf[0] = '-';
  152.         }}
  153.  
  154. "*"        return last_tok='*';
  155. "/"        return last_tok='/';
  156. "="        return last_tok='=';
  157. "<>"        return last_tok=not_eq_tok;
  158. "<"        return last_tok='<';
  159. ">"        return last_tok='>';
  160. "<="        return last_tok=less_eq_tok;
  161. ">="        return last_tok=great_eq_tok;
  162. "("        return last_tok='(';
  163. ")"        return last_tok=')';
  164. "["        return last_tok='[';
  165. "]"        return last_tok=']';
  166. ":="        return last_tok=assign_tok;
  167. ".."        return last_tok=two_dots_tok;
  168. "."        return last_tok='.';
  169. ","        return last_tok=',';
  170. ";"        return last_tok=';';
  171. ":"        return last_tok=':';
  172. "^"        return last_tok='^';
  173.  
  174. {IDENTIFIER}    { (void) strcpy (last_id, yytext);
  175.           l_s = search_table (last_id);
  176.           return
  177.                     last_tok = (l_s == -1 ? undef_id_tok : sym_table[l_s].typ);
  178.         }
  179.  
  180.  
  181. .        { /* Any bizarre token will do.  */
  182.           return last_tok = two_dots_tok; }
  183. %%
  184.