есть ли способ выполнить предварительный просмотр с помощью fslex / Lexing.LexBuffer

#f# #lexer

#f# #lexer

Вопрос:

Я использую fslex, и в одном из моих правил tokenizer мне нужно найти следующий символ, чтобы я мог решить, продолжать ли использовать токены или остановиться, размотать и позволить предыдущему правилу использовать его.

Я потратил некоторое время на проверку его исходного кода, и, похоже, единственным способом было бы скомпилировать версию, которая предоставляет некоторые внутренние методы. Может быть, у кого-то здесь есть лучшее решение?

Комментарии:

1. Не знаю, далеко ли вы зашли, чтобы изменить инструмент, но вы думали об использовании FsParsec вместо этого? У меня ограниченный опыт работы как с fslex, так и с fsparsec, но из того, что я видел, fsparsec намного лучше. Не уверен, поддерживает ли fsparsec именно то, что вы хотите, но там сказано, что он поддерживает предварительные граммы, поэтому я чувствую, что есть хороший шанс.

2. Если вы действительно хотите использовать FsLex / FsYacc (которые довольно удобны), небольшая «измена» кажется хорошим решением. Но сначала вам следует рассмотреть возможность использования FsParsec (который был разработан специально для этого, но он не так прост в использовании).

3. Один из способов, которым я справлялся с этим в прошлом с другими лексерами и анализаторами без предварительного просмотра, — это реализовать пользовательскую оболочку перечислителя, которая поддерживает «возврат». Затем исключительный граничный элемент можно поместить обратно и повторно проанализировать.

Ответ №1:

Возможно, просмотр исходного кода LexBuffer может помочь. Хотя существуют свойства ( BufferScanStart и BufferScanLength ) для установки положения лексера во входном потоке, они являются внутренними. Я не уверен, что потребуется, чтобы предоставить их безопасным способом.

Существует также вопрос о HubFS, который касается возврата. Вывод, похоже, тот же: fslex в настоящее время его не поддерживает.