|
|||||||
Полезные утилиты из STL и Boost для фронтенда компилятора
Время создания: 13.05.2021 11:36
Раздел: Компьютер - Программирование - Теория программирования - Теория компиляции
Запись: xintrea/mytetra_syncro/master/base/1620894970bn34z7uydw/text.html на raw.github.com
|
|||||||
|
|||||||
Простейшая токенизацияАлгоритмы для строк, заданные в заголовочном файле <boost/algorithm/string.hpp>, предоставляют готовые шаблонные функции «replace_all» для поиска и замены подстроки, «trim» для обрезания пробелов слева и справа, «split» для разделения строки на массив подстрок, разделённых символом-разделителем и другие. Для разбиения текста на слова подходит boost::split. Рассмотрим пример ниже: vector<string> SplitWords(string const& text) { std::string trimmed = boost::trim_copy(text); vector<string> words; boost::split(words, trimmed, boost::is_space(), boost::token_compress_on); return words; }
Токенизация на основе регулярных выраженийСтандартная библиотека регулярных выражений, которая появилась в C++ 2011 в виде заголовка . Он поддерживает поиск по регулярному выражению как на диапазоне итераторов, так и на объекте типа «std::basic_string». Несколько примеров использования regex для задач лексического анализа есть в репозитории github.com/ps-group/compiler-theory-samples (подкаталог std-regex) Разбор с возвратом (backtracking parssing) в старом стилеКлассы строк языка C++ обеспечивают простые и безопасные ввод, вывод, копирование и конкатенацию строк. Но для многих задач, таких как рекурсивный спуск или любой другой способ разбора грамматик, нужен доступ к произвольным символам (random access) и возможность переместить позицию сканнера. Есть два хороших и один сомнительный способ реализации random access:
Разбор с возвратом (backtracking parssing) на основе string_viewПроще всего сделать парсер, работающий с объектами string_view — невладеющими ссылками на строку. Реализацию string_view можно раздобыть несколькими способами:
По сути string_view — это удобная замена такой структуры для чтения строки слева направо: struct StringScanState { std::string text; size_t position; }; Ссылка на строку не выделяет память, не освобождает память и никак не влияет на время жизни последовательности символов, размещённой в куче. Задача класса – всего лишь предоставить программный интерфейс, аналогичный «std::string», более безопасный и простой, чем итераторы. Кроме интерфейса строки, у ссылки на строку есть методы «remove_prefix(size_t count)» и «remove_suffix(size_t count)», позволяющие сузить область сканирования строки, или отрезать уже просканированную левую/праву часть. Также есть метод «str()», копирующий и возвращающий владеющую памятью строку. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|