Есть два этапа анализа потока ввода текста для разбора:
Лексический анализ: Здесь ваш входной поток разбивается на лексические единицы. Он просматривает последовательность символов и генерирует токены (аналогичные слову в устной или письменной речи). Конечные автоматы очень хороши в лексическом анализе, если вы приняли правильное проектное решение о лексической структуре. Исходя из ваших данных выше, индивидуальными лексемами будут такие вещи, как ваши ключевые слова (например, «global»), идентификаторы (например, «bitwise», «SOURCES»), символические tokesn (например, «{" "}", ".", "/" ), числовые значения, escape-значения (например, "\ n") и т. д.
Синтаксический / грамматический анализ: После генерации последовательности токенов (или, возможно, во время выполнения) вам необходимо иметь возможность проанализировать структуру, чтобы определить, соответствует ли последовательность токенов вашей языковой дизайн. Обычно для этого вам нужен какой-то синтаксический анализатор, хотя если структура языка не очень сложна, вы можете вместо этого сделать это с помощью конечного автомата. В общем (и поскольку вы хотите вложить структуры в вашем конкретном случае), вам нужно будет использовать один из методов, описанных Кеном Блумом.
Итак, в ответ на ваши вопросы:
Должен ли я использовать перечисление или абстрактный класс + производные для моих состояний?
Я обнаружил, что для небольших токенизаторов подходит матрица значений состояния / перехода, что-то вроде next_state = state_transitions[current_state][current_input_char]
. В этом случае next_state
и current_state
являются некоторыми целочисленными типами (включая, возможно, перечислимый тип). Ошибки ввода обнаруживаются при переходе в недопустимое состояние. Конец токена идентифицируется на основе идентификации состояния действительных конечных состояний без действительного перехода, доступного в другое состояние с учетом следующего входного символа. Если вы беспокоитесь о космосе, вы можете вместо этого использовать вектор карт. Создание классов состояний возможно, но я думаю, что это, вероятно, усложнит вам задачу.
При чтении списка мне НЕ нужно игнорировать \ n.
Вы можете создать токен с именем \ n или более обобщенный escape-токен (идентификатор, которому предшествует обратная косая черта. Если вы говорите об идентификации разрывов строк в источнике, то это просто символы, которые вам нужно создавать переходы для матрицы переходов состояний (однако следует помнить о различиях между переносами строк в Unix и Windows; вы можете создать FSM, работающий на любом из них).
Хватит ли простых перечисляемых состояний для многоуровневого синтаксического анализа (области в пределах областей {... {...} ...}) или для этого потребуются хакерские реализации?
Здесь вам понадобится грамматика или автомат, если вы не можете гарантировать, что вложенность не превысит определенного уровня. Даже тогда это, вероятно, сделает ваш FSM очень сложным.
Вот проекты состояний, которые я имею в виду: ...
См. Мои комментарии по лексическому и грамматическому анализу выше.