Nano Hash - криптовалюты, майнинг, программирование

Изменение/фильтрация yytext перед вызовом yymore()

Предположим, что у меня есть следующее:

pattern { /* Фильтровать/обрабатывать здесь, затем вызывать */ yymore(); }

Что я хотел бы сделать, так это отфильтровать/обработать некоторые вещи в yytext перед вызовом yymore(). yytext никогда не будет увеличиваться в длину, возможно, только укорачивается при обработке. Для этого потребуется возможность сократить yytext. В качестве отправной точки я попытался выяснить, есть ли простой способ, например. удалить последний символ yytext, но сделать что-то наивное, например

yytext[yyleng-1] = '\0'; ййленг —;

не будет работать. yymore(), кажется, добавляет материал после символа NIL, что указывает на то, что внутри кода, сгенерированного flex, есть некоторый указатель, указывающий на текущий конец yytext. Есть ли какой-то идиоматический способ сделать это без необходимости писать более сложный набор правил?

Такие вещи, как yyless, возвращают вещи во входной поток, а это не то, что мне нужно.

20.03.2014

Ответы:


1

Вы не можете сделать это в C-версии 'flex', так как yytext указывает прямо на входной буфер. Это не копия. Если вы измените входной буфер, вы сильно испортите ситуацию. flex уделяет особое внимание обработке каждого символа один раз и только один раз и не выполняет никакой дополнительной буферизации, кроме того, что делает источник, который вы ему предоставили. Я считаю, что он временно помещает NUL в буфер при выполнении действия и снова извлекает его, когда действие возвращается, поэтому для этой цели он должен иметь указатель на то, где был NUL.

Я бы переместил эту обработку в грамматику в соответствующих точках, где вы, должно быть, уже берете копию yytext.

20.03.2014
  • Есть ли какой-нибудь хороший источник о том, как flex внутренне управляет своим буфером, или мне просто нужно прочитать источник того, что он генерирует? Я предполагал, что flex будет одновременно считывать много материала из файлов для эффективности, поэтому у него будет входной буфер, который содержит больше материала, чем то, что было прочитано в yytext. В этом случае yytext не может указывать на этот буфер, так как это строка с нулевым завершением, поэтому yytext[yyleng] не может содержать как следующий символ для чтения из входного потока, так и nil. 20.03.2014
  • Я узнал все это, внимательно прочитав исходный код много (много) лет назад, когда я писал 8-битный код, а также в процессе переписки с Верном Пакссоном. Вся мотивация flex заключалась в том, что Верн работал над «самыми быстрыми программами сбора данных в мире», и ничто — ничего — не могло ему помешать. Спустя годы он даже не допустил виртуальную функцию в версию на C++. 20.03.2014
  • @EdvardFagerholm: yytext[yyleng] не может одновременно содержать как NUL, так и следующий символ (если, конечно, следующий символ не является NUL), но ответ EJP на 100% правильный: flex сохраняет следующий символ, перезаписывает 0, выполняет действие, а затем восстанавливает входной буфер. Обычная стратегия для достижения того, что вы ищете, заключается в постепенном копировании отфильтрованных текстовых значений в аккумулятор; Программное обеспечение GNU обычно использует для этой цели obstack, что сводит к минимуму копирование перераспределения. (gnu.org/software/libc/manual/html_node/Obstacks.html ) 20.03.2014
  • Спасибо, парни. Это именно то, что я хотел знать, и я просто прочитаю источник. Я пытался избежать использования внешнего буфера в качестве аккумулятора для сохранения памяти и копирования. 20.03.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..