#f# #lexer
#f# #lexer
Вопрос:
Я использую fslex, и в одном из моих правил tokenizer мне нужно найти следующий символ, чтобы я мог решить, продолжать ли использовать токены или остановиться, размотать и позволить предыдущему правилу использовать его.
Я потратил некоторое время на проверку его исходного кода, и, похоже, единственным способом было бы скомпилировать версию, которая предоставляет некоторые внутренние методы. Может быть, у кого-то здесь есть лучшее решение?
Комментарии:
1. Не знаю, далеко ли вы зашли, чтобы изменить инструмент, но вы думали об использовании FsParsec вместо этого? У меня ограниченный опыт работы как с fslex, так и с fsparsec, но из того, что я видел, fsparsec намного лучше. Не уверен, поддерживает ли fsparsec именно то, что вы хотите, но там сказано, что он поддерживает предварительные граммы, поэтому я чувствую, что есть хороший шанс.
2. Если вы действительно хотите использовать FsLex / FsYacc (которые довольно удобны), небольшая «измена» кажется хорошим решением. Но сначала вам следует рассмотреть возможность использования FsParsec (который был разработан специально для этого, но он не так прост в использовании).
3. Один из способов, которым я справлялся с этим в прошлом с другими лексерами и анализаторами без предварительного просмотра, — это реализовать пользовательскую оболочку перечислителя, которая поддерживает «возврат». Затем исключительный граничный элемент можно поместить обратно и повторно проанализировать.
Ответ №1:
Возможно, просмотр исходного кода LexBuffer может помочь. Хотя существуют свойства ( BufferScanStart
и BufferScanLength
) для установки положения лексера во входном потоке, они являются внутренними. Я не уверен, что потребуется, чтобы предоставить их безопасным способом.
Существует также вопрос о HubFS, который касается возврата. Вывод, похоже, тот же: fslex в настоящее время его не поддерживает.