J.V. Noble из Университета Вирджинии объясняет, как строить детерминированные и недетерминированные конечные автоматы (FSM) на Forth. Лучший приём — прямая таблица состояний, которая один в один повторяет определение автомата, и никаких медленных вложенных IF. Обычный способ с кучей IF/ELSE/THEN и историческими флагами вроде PREVIOUS.MINUS? и PREVIOUS.DP? трудно читать, отлаживать и проверять. Пример — ввод числа с клавиатуры: процедурная версия Getafix с семафорами выглядит «ужасной», хотя вроде бы работает.
Вместо флагов берут одну переменную состояния и таблицу. Для чисел с фиксированной точкой нужны состояния 0, 1, 2 и категории входа other?, digit?, minus?, dp?. После первого символа минус запрещён, после первой точки ещё одна точка не принимается. Действие E означает «вывести символ», X — «игнорировать». Такую таблицу можно превратить в Forth-код несколькими способами. Самый грубый — через CASE: ... ;CASE из HS/FORTH: на каждое состояние заводится слово (0), (1), (2), и внутри всё ещё есть IF. Лучше определяющее слово FSM: строит матрицу из execution tokens. На входе слово cat->col# переводит символ в номер колонки, а DOES> по номеру колонки и текущему состоянию выбирает нужное действие и выполняет его. Дальше FSM: дорабатывают: переходы задают прямо в таблице словами >0, >1, >2 — это просто CONSTANT, так что определение становится читаемым. Наконец, состояние хранят не в глобальной переменной, а в самой структуре FSM — это позволяет вкладывать автоматы друг в друга и даже использовать RECURSE. Для временного хранения промежуточных значений используют return stack.
Вторая часть — недетерминированные FSM. Переход может вести не в одно, а в несколько состояний; выбор зависит от дополнительных данных. Например, для распознавания FORTRAN-идентификаторов (буква, потом до семи букв или цифр) слово >1? смотрит на счётчик длины и переводит либо в состояние «продолжаем», либо в завершающее. Это сокращает число состояний. Аналогично устроен автомат для чисел с плавающей точкой: декодеры на 128 ASCII-символов, состояния для мантиссы, знака, десятичной точки и экспоненты, обработчик ошибок #err. Часть деталей — слова +mant, +exp и другие — оставлена как упражнение читателю.