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