По поводу конечных автоматов. Возможны САМЫЕ РАЗНООБРАЗНЫЕ реализации.
Вот вам конечный автомат для перевода целых чисел из строки в двоичый вид.
## Код:
```
// автомат-преобразователь для целых чисел
// генерирует исключение
// с установкой кода ошибки разбипается вызывающая функция!
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;
}
```

Состояний всего 3. Переводит числа: десятичные хх...хх, шестнадцатеричные 0хХХ..ХХ, двоичные 0bxx...xx
Сами функции являются состояниями. Основной цикл смены состояний выродился в одну строку - никаких переключателей.