Форма реализации конечных автоматов может быть самая разная. Большой переключатель - 'nnj только один из вариантов, самый простой и самый громоздский. Посмотрите на следующий вариант. Перевод целых констант вида 12345 (десятичные), 0xabcd (шестнадцатеричные), 0b1010010 (двоичные)
> -- Цитата:
> Определим состояния автомата. В стартовом состоянии может появиться любая цифра, однако нам нужно различать цифру 0 и остальные цифры, так как с нуля не начинаются десятичные константы. Если в стартовом состоянии был ноль, то далее может быть только символ «x» или «b» (или ноль — единственная цифра). После этого действия для десятичных, шестнадцатеричных и двоичных констант фактически повторяются до тех пор, пока не будет выбран символ, недопустимый для целого числа. Это может быть либо знак операции, либо знак пунктуации (например, запятая). Таким образом, обрабатываемые символы можно разбить на следующие классы: ноль, цифра, x, b, другой.Рассмотрим действия, которые должен выполнять автомат при переводе константы. Пусть результат перевода сохраняется в переменной N. Первоначальное значение N равно 0. Если очередной символ-цифра содержится в переменной ch, то добавить ее в число можно так:N = N * B + digit(ch);B — это основание системы счисления (2, 10 или 16), а digit() — это функция, которая выдает цифру, соответствующую символу ch. Таким образом, правила перехода для преобразователя можно записать так:start: ноль -> s1;start: цифра -> s2; 	B = 10; N = digit(ch);s1:	x -> s2; 	B = 16;s1:	b -> s2; 	B = 2;s2:	ноль -> s2; 	N = N * B;s2:	цифра -> s2; 	N = N * B + digit(ch);s2: 	другая -> finish В стартовом состоянии выполняется проверка первого символа; в состоянии s1 — устанавливается не десятичное основание системы счисления; преобразование символьной константы в число выполняется в состоянии s2. В этом состоянии автомат остается до тех пор, пока входными символами являются цифры. Если же очередной символ — не цифра, то либо это суффикс «u», либо ошибка. Суффикс не является ошибкой только тогда, когда основание системы счисления B равно 10.Действия в состоянии ошибки очевидны. Если в стартовом состоянии вместо цифры или нуля выбран недопустимый символ, то автомат заканчивает работу, устанавливая флаг ошибки в error; аналогичные действия выполняются и в состояниях s1 и s2.
И программа:
## Код:
```
// автомат-преобразователь для целых чисел
// генерирует исключение
// с установкой кода ошибки разбипается вызывающая функция!
struct Data
{   int N;         // число
    int sign;
    byte B;         // основание системы счисления
};
const int notDigit = -1;
int digit(char ch, byte B = 10)
{ string digits = "0123456789abcdef";
  int d;            // возвращаемая цифра 
  for(d = 0; d < B; ++d)
    if(ch == digits[d]) return d;
  string xdigits = "ABCDEF";      // если большая шестнадцатеричная
  for(d = 0; d < 6; ++d)
    if(ch == xdigits[d]) return d+10;
  return notDigit;         // символ - не цифра
}
// класс-преобразователь типа
class State;
typedef State (*function) (char ch, Data &D);
class State
{ public:
    State(function f = NULL): F(f) {}
    operator function() { return F; }
  private:
    function F;
};
// состояние – поступила очередная цифра
State s2(char ch, Data &D)
{   int d = digit(ch, D.B);
    if(d == notDigit)         // ОШИБКА - неправильный символ
   throw IllegalInteger();   // генерируется исключение
    else            // накапливаем
    { D.N = D.N * D.B + d; 
      return s2;          // в состояние s2
    }
}
// состояние – после первого нуля!
State s1(char ch, Data &D)
{ if     ((ch == 'x')||(ch == 'X')) D.B = 16;
  else if((ch == 'b')||(ch == 'B')) D.B = 2;
  else                              // ОШИБКА - неправильный символ
    throw IllegalInteger();
  D.sign = +1;            // не десятичные - беззнаковые
  return s2;            // в состояние s2
}
// состояние – первый символ
State start(char ch, Data &D)
{ if(ch == '0')     return s1;   // в состояние s1 
               // первый символ - знак
  else if (ch == '-') { D.sign = -1; D.B = 10; }           
  else if (ch == '+') { D.sign = +1; D.B = 10; }
  else               // первая цифра - десятичная
  { D.sign = +1;         // число положительное
    int d = digit(ch);
    if (d == notDigit)      // ОШИБКА - неправильный символ
       throw IllegalInteger();
    else            // если-таки десятичная цифра
    { D.B = 10; D.N = d; }
  }
  return s2;             // в состояние s2
}
// основная программа автомата
int Integer(const string &str)
{ Data D = {0};
  State s = start;
  typedef basic_string<char>::const_iterator Iterator;
  Iterator it = str.begin();
  while(it != str.end())      // основной цикл по сотстояниям
  { 
   s = s(*it++, D);      // переходы по состояниям
  }
  return D.N * D.sign;
}
```
