home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / d / djdev108.zip / SAMPLES / HEXCALC / SCAN.L < prev   
Text File  |  1991-09-02  |  3KB  |  174 lines

  1. %{
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include "lang.h"
  7. #include "hc.h"
  8.  
  9. %}
  10.  
  11. REAL    [0-9]+[.][0-9]*([Ee][+-]*[0-9]+)?
  12. REAL2    [0-9]+[Ee][+-]*[0-9]+
  13. RHEX    0x[0-9a-fA-F]*[.][0-9a-fA-F]*
  14. DEC    [1-9][0-9]*
  15. OCT    0[0-9]*
  16. HEX    0x[0-9A-Fa-f]+
  17. BIN    0b[0-1]*
  18.  
  19. ID    [a-zA-Z_][a-zA-Z0-9_]*
  20.  
  21. %%
  22.  
  23. {REAL}            return do_real();
  24. {REAL2}            return do_real();
  25. {RHEX}            return do_rhex();
  26. {DEC}            return do_dec();
  27. {HEX}            return do_hex();
  28. {OCT}            return do_oct();
  29. {BIN}            return do_bin();
  30.  
  31. !!            { yylval.i = 1; return LAST_RESULT; }
  32. !{DEC}            {
  33.               yylval.i = atoi(yytext+1);
  34.               return LAST_RESULT;
  35.             }
  36.  
  37. e            { yylval.d = M_E; return INUM; }
  38. pi            { yylval.d = M_PI; return INUM; }
  39.  
  40. {ID}            return do_id();
  41.  
  42. [ \t]+
  43.  
  44. [\r\n]            return '\n';
  45.  
  46. \>\>            return '>';
  47. \<\<            return '<';
  48. \004            return 0;
  49.  
  50. \*\*            return POWER;
  51.  
  52. .            return yytext[0];
  53.  
  54. %%
  55.  
  56. int do_real()
  57. {
  58.   sscanf(yytext, "%lf", &yylval.d);
  59.   return INUM;
  60. }
  61.  
  62. static int hex2dec(char c)
  63. {
  64.   switch (c)
  65.   {
  66.     case '0':
  67.     case '1':
  68.     case '2':
  69.     case '3':
  70.     case '4':
  71.     case '5':
  72.     case '6':
  73.     case '7':
  74.     case '8':
  75.     case '9':
  76.       return c-'0';
  77.     case 'a':
  78.     case 'b':
  79.     case 'c':
  80.     case 'd':
  81.     case 'e':
  82.     case 'f':
  83.       return c-'a'+10;
  84.     case 'A':
  85.     case 'B':
  86.     case 'C':
  87.     case 'D':
  88.     case 'E':
  89.     case 'F':
  90.       return c-'A'+10;
  91.   }
  92.   return 0;
  93. }
  94.  
  95. int do_rhex()
  96. {
  97.   double scale;
  98.   char *cp = yytext + 2;
  99.   yylval.d = 0.0;
  100.   while (*cp != '.')
  101.   {
  102.     yylval.d *= 10.0;
  103.     yylval.d += hex2dec(*cp);
  104.     cp++;
  105.   }
  106.   cp++;
  107.   scale = 1.0 / 16.0;
  108.   while (*cp)
  109.   {
  110.     yylval.d += scale * hex2dec(*cp);
  111.     scale /= 16.0;
  112.     cp++;
  113.   }
  114.   return INUM;
  115. }
  116.  
  117. int do_dec()
  118. {
  119.   int tmp;
  120.   sscanf(yytext, "%d", &tmp);
  121.   yylval.d = tmp;
  122.   return INUM;
  123. }
  124.  
  125. int do_hex()
  126. {
  127.   unsigned tmp;
  128.   sscanf(yytext+2, "%x", &tmp);
  129.   yylval.d = tmp;
  130.   return INUM;
  131. }
  132.  
  133. int do_oct()
  134. {
  135.   unsigned tmp;
  136.   sscanf(yytext, "%o", &tmp);
  137.   yylval.d = tmp;
  138.   return INUM;
  139. }
  140.  
  141. int do_bin()
  142. {
  143.   int rv=0;
  144.   char *yp;
  145.   for (yp = yytext+2; *yp; yp++)
  146.   {
  147.     rv <<= 1;
  148.     rv += *yp - '0';
  149.   }
  150.   yylval.d = rv;
  151.   return INUM;
  152. }
  153.  
  154. int do_id()
  155. {
  156.   int i;
  157.   for (i=0; i<MAX_ID; i++)
  158.   {
  159.     if (id_name[i] == 0)
  160.     {
  161.       id_name[i] = strdup(yytext);
  162.       yylval.i = i;
  163.       return ID;
  164.     }
  165.     if (strcmp(id_name[i], yytext) == 0)
  166.     {
  167.       yylval.i = i;
  168.       return ID;
  169.     }
  170.   }
  171.   printf("Too many ID's (max=%d)\n", MAX_ID);
  172.   return 1; /* forced error */
  173. }
  174.