
            case 1: /* Operator found */
               switch ( lachar )
               {

                  case '[':
                  case '{':
                     lachar = '(';
                  case '(':
                     token = lachar;
                     break;

                  case ']':
                  case '}':
                     lachar = ')';
                  case ')':
                     token = lachar;
                     break;

                 default:
                     if (latran == 1)
                        token = EOS;
                     else
                        token = lachar;
               }
               break;

            case 2: /* Symbol found */
               {
                  int iii;

                  value = 0;
                  token = SYM;
                  for (iii = 0; symbol[iii] != '\0'; iii++ ) 
		     if (islower(symbol[iii]))
			symbol[iii] = toupper(symbol[iii]);
               }
               break;

            case 3: /* Number found */
	       if (radix == 10)
	       {
		  value = value * 10 + dignum;
		  evalue = evalue * 10 + dignum;
		  token = DECNUM;
	       }
	       else if (radix == 8)
	       {
		  token = OCTNUM;
		  if (dignum > 7)
		  {
		     Parse_Error (SCAN_ERROR, INVOCTNUM, defer);
		     *svalue = 0;
		     strcpy (toksym, "0");
		     return (0);
		  }
		  else
		     value = (value << 3) | dignum;
	       }
               break;

            case 4: /* PC symbol found */
	       value = pc;
	       token = ASTER;
	       relocatable++;
	       break;

            case 5: /* recognize exponent sign*/
               token = FLTNUM;
               break;

            case 6: /* recognize exponent */
               token = FLTNUM;
               sexp = sexp * 10 + dignum;
               break;

	    case 7: /* process exponent sign */
               token = FLTNUM;
               if (lachar == '-')
                  expsgn = -1;
	       break;

            case 8: /* process fraction */
               token = FLTNUM;
	       if (dignum == 0)
	       {
		  if (!digitfound)
		     leadingzero++;
	       }
	       else digitfound = TRUE;
               sfrc = sfrc * 10 + dignum;
	       break;

            case 9: /* build exponential form */
	       {
		  long exponent = 0200;
		  long fraction = 0;
		  long mantissa = 0;
		  long temp;
		  int  iii;

		  token = FLTNUM;
#ifdef DEBUG_FLOAT
		  printf ( " Float format: \n");
		  printf ("   evalue = %d, leadingzero = %d, sfrc = %d\n",
			      evalue, leadingzero, sfrc);
		  printf ("   sexp = %d, expsgn = %d\n",
			      sexp, expsgn);
		  printf ("   num = %d.",
			      evalue);
		  temp = leadingzero;
		  while (temp)
		  {
		     printf ("0");
		     temp--;
		  }
		  printf ("%dE%c%d sym=%s\n", 
			   sfrc, expsgn > 0 ? '+' : '-', sexp,
			   symbol);
#endif

		  if (evalue > 0)
		  {
		     temp = evalue;
		     while (temp)
		     {
			temp >>= 1;
			exponent++;
		     }
		  }
		  else
		  {
		     temp = leadingzero;
		     while (temp)
		     {
			fraction = (fraction * 10) + 1;
			temp--;
		     }
		     temp = sfrc;
		     while (temp)
		     {
			fraction = (fraction * 10) + 1;
			temp = temp / 10;
		     }
		     temp = fraction;
		     while (temp)
		     {
			temp >>= 1;
			exponent--;
		     }
		  }
		  if (sexp)
		  {
		     temp = sexp;
		     if (expsgn > 0)
			iii = 1;
		     else
			iii = evalue;
		     while (temp)
		     {
		        iii *= 10;
			temp--;
		     }
		     if (expsgn > 0)
		        iii >>= 1;
		     while (iii)
		     {
		        if (expsgn > 0)
			   exponent++;
			else
			   exponent--;
		        iii >>= 1;
		     }
		  }
#ifdef DEBUG_FLOAT
		  printf ("   exponent = %o \n", exponent);
#endif
		  mantissa = evalue;
		  if (sfrc)
		  {
		     while (leadingzero)
		     {
			mantissa = (mantissa * 10) + 0;
			leadingzero --;
		     }
		     temp = sfrc;
		     iii = 0;
		     while (temp)
		     {
			temp = temp / 10;
			iii++;
		     }
		     while (iii)
		     {
			mantissa = (mantissa * 10) + 0;
			iii --;
		     }
		     mantissa = mantissa + sfrc;
		  }
		  if (mantissa & 037000000000)
		  {
		     while ((mantissa & 037000000000) != 0)
		     {
			mantissa >>= 1;
		     }
		  }
		  else
		  {
		     while ((mantissa & 0400000000) == 0)
		     {
			mantissa <<= 1;
		     }
		  }
		  sprintf (symbol, "%o%o", exponent, mantissa);
#ifdef DEBUG_FLOAT
		  printf ("   mantissa = %o\n", mantissa);
		  printf ("   symbol = %s\n", symbol);
#endif
	       }
	       break;

            case 10: /* Comma found, end of expression */
	       token = EOS;
	       break;

            case 11: /* Operator found */
               switch ( lachar )
               {

                  case '[':
                  case '{':
                     lachar = '(';
                  case '(':
                     token = lachar;
                     break;

                  case ']':
                  case '}':
                     lachar = ')';
                  case ')':
                     token = lachar;
                     break;

                 default:
                     if (latran == 1)
                        token = EOS;
                     else
                        token = lachar;
               }
               break;

            case 12: /* Symbol found */
               {
                  int iii;

                  value = 0;
                  token = SYM;
                  for (iii = 0; symbol[iii] != '\0'; iii++ ) 
		     if (islower(symbol[iii]))
			symbol[iii] = toupper(symbol[iii]);
               }
               break;

            case 13: /* Number found */
	       if (radix == 10)
	       {
		  value = value * 10 + dignum;
		  evalue = evalue * 10 + dignum;
		  token = DECNUM;
	       }
	       else if (radix == 8)
	       {
		  token = OCTNUM;
		  if (dignum > 7)
		  {
		     Parse_Error (SCAN_ERROR, INVOCTNUM, defer);
		     *svalue = 0;
		     strcpy (toksym, "0");
		     return (0);
		  }
		  else
		     value = (value << 3) | dignum;
	       }
               break;

