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