Я пишу лексер (с re2c) и синтаксический анализатор (с Lemon) для слегка запутанного формата данных: типа CSV, но с определенными типами строк в определенных местах (только буквенно-цифровые символы, буквенно-цифровые символы и знаки минуса, любые символы, кроме кавычки и запятые, но со сбалансированными фигурными скобками и т. д.), строки внутри фигурных скобок и строки, которые выглядят как вызовы функций с открывающими и закрывающими фигурными скобками, которые могут содержать параметры.
Моей первой попыткой в этой области был лексер с множеством состояний, каждое из которых обслуживает определенный строковый формат. Но после множества бесполезных «неожиданных входных» сообщений от лексера (который стал очень большим) я понял, что, возможно, он пытается выполнять работу парсера. Я отказался от своей первой попытки и выбрал лексер только с одним состоянием, множеством токенов символов и синтаксическим анализатором, который объединяет токены в разные типы строк. Это работает лучше, я получаю больше полезных синтаксических ошибок от парсера, когда что-то не работает, но это все равно кажется не совсем правильным. Я подумываю добавить одно или два состояния в лексер, но инициировать состояния из анализатора, который имеет гораздо лучший «обзор» того, какой тип строки требуется в данном экземпляре. В целом чувствую себя немного глупо :(
У меня нет формального опыта в компьютерной науке и я немного уклоняюсь от тяжелой математической теории. Но, возможно, где-то есть учебник или книга, в которых объясняется, что лексер должен (и не должен) делать и какую часть работы должен выполнять синтаксический анализатор. Как создавать хорошие шаблоны токенов, когда использовать состояния лексера, когда и как использовать рекурсивные правила (с анализатором LALR), как избежать неоднозначных правил. Прагматичная поваренная книга, которая учит основам. "Lex and YACC primer / HOWTO" был хорош, но недостаточно. Поскольку я просто хочу проанализировать формат данных, книги по созданию компиляторов (например, книга красного дракона) кажутся мне немного завышенными.
Или, может быть, кто-то может дать мне здесь простые правила.