Если вы строите конечные автоматы для идентификации лексем, то их терминальные состояния должны соответствовать лексемам языка.
Вы можете оставить ключевые слова вне FSA, и вы получите только одно состояние терминала для строк, которые выглядят как идентификаторы. Это распространенная реализация при ручном кодировании FSA. У вас будет проблема, которую вы имеете сейчас. На практике для таблицы символов, независимо от того, что вы делаете с ключевыми словами, вам понадобится чрезвычайно быстрый поиск идентификатора, который в значительной степени предполагает, что вам нужно решение для хеширования. Если у вас есть это, то вы можете быстро выполнить поиск и проверить свой бит «это должно быть ключевое слово». Существует множество хороших хеш-схем; Как обычно, Википедия по хеш-функциям - неплохое место для начала. Это практическое решение; Я использую его в моем компиляторе PARLANSE (см. Мою биографию), который обрабатывает файлы с миллионами строк за несколько десятков секунд.
Это не самое быстрое решение. Лучше включать ключевые слова в FSA (это способствует использованию генератора лексеров, поскольку добавление всех ключевых слов в FSA с ручным кодированием неудобно, но не сложно). Если вы сделаете это, и у вас есть ключевые слова, которые выглядят как идентификаторы, например, goto , будут конечные состояния, которые фактически указывают на то, что вы узнали идентификатор, который, как оказалось, записан как конкретное ключевое слово.
Как вы интерпретируете это конечное состояние, зависит от вас. Один очевидный выбор заключается в том, что такие конечные состояния указывают на то, что вы нашли ключевое слово. Поиск по хеш-таблице не требуется.