НУ если писать более детально - то это должно выглядеть примерно так.
1. Лексический анализатор.
Находится в одном из трех состояний:
- начальное (оно же рабочее) - состояние считывания начала очередной лексемы (интерпретируемой конструкции). Из этого сотояния происходят переходы в другие при следующих условиях:
- - При чтении знака операции - сообщается о прочитаном знаке операции и переход в это же состояние
- - При чтении n-ричной цифры - переход в состояние считывания n-ричного числа
- - При чтении любого другого символа - переход в состояние ошибки.
- считывание n-ричного числа - состояние считывания значения n-ричного числа. Переход из этого состояния происходит по следующим правилам.
- - Считывание очередного символа n-ричного числа - возврат в текущее состояние
- - Считывание знака операции - оповещение о считанном числе и переход в начальное состояние
- - Считывание другого символа - переход в состояние ошибки.
- состояние ошибки - состояние сообщения об ошибке и возможный отказ в интерпретации данных. В зависимости от типа интерпретатора, это состояние может вести себя по разному - или выходить из интерпретатора, или отменять часть интерпретируемых данных и продолжать интерпретацию.
2. Синтаксический анализатор - получает информацию от лексического о наборе входных лексем и строит в соответствии с ними конструкции языка. Его состояния расписывать долго, но тоже можно. Проще взять инфу по bison. Там, кстати, и есть пример построения простейшего калькулятора.
Результат синтаксического анализа - дерево исполнения выражения, которое выдается на исполнитель.
3. Исполнитель дерева выражения - производит обход дерева и исполнения выражения закодированного тим деревом.
Насчет flex-bison - это - GNU-тые утилиты для построения лексического и синтаксического анализаторов. Они пошли еще из UNIX, где имели название lex и yacc, соответственно.
Про бизона см.
http://www.gnu.org/directory/devel/specific/bison.html
Ну а про flex - надо искать отдельно. Но не думаю, что это будет сложно.