Я пытаюсь написать XML-сканер на C ++. В идеале я хотел бы использовать библиотеку регулярных выражений, так как это было бы намного проще.
Тем не менее, я немного озадачен тем, как это сделать. Итак, сначала мне нужно создать регулярные выражения для каждого токена в языке. Я мог бы использовать карту для хранения пар этих регулярных выражений в дополнение к имени токена.
Затем я бы открыл входной файл и хотел бы использовать итератор для итерации строк в моем файле и сопоставления их с регулярным выражением. Однако в XML у вас нет пробелов для разделения строк.
Так что мой вопрос, будет ли этот метод вообще работать? Кроме того, как именно библиотека регулярных выражений будет соответствовать моим потребностям? Достаточно ли regex_match, чтобы соответствовать моим потребностям безошибочным способом, чтобы мой сканер не был обманут?
Я просто пытаюсь создать скелет процесса в своей голове, чтобы я мог начать работать над этим. Я хотел, чтобы кто-то высказал свое мнение, чтобы понять, правильно ли я думаю о проблеме.
Буду признателен за любые мысли по этому поводу. Спасибо!
Лексический анализ обычно выполняется путем последовательного сопоставления токенов, где каждый токен соответствует максимально длинному совпадению из набора возможных регулярных выражений. Поскольку каждое совпадение привязывается в том месте, где заканчивался предыдущий токен, поиск не выполняется.
Здесь я использую слово «токен» немного свободно; Пробелы и комментарии также считаются токенами, но в большинстве языков программирования они просто игнорируются после распознавания. Однако совместимый токенайзер XML должен будет распознавать их как токены, поэтому его использование будет точным для вашей проблемной области.
Вместо того, чтобы погружаться в море раздражающих деталей, вы можете захотеть узнать о (f) lex, который эффективно реализует этот алгоритм с учетом набора регулярных выражений. Он также заботится об обработке буфера и некоторых других деталях, которые позволят вам сосредоточиться на понимании природы процесса лексического анализа.
Для этого есть инструмент под названием RE / flex, который генерирует сканеры:
https://sourceforge.net/projects/re-flex
Сгенерированные сканеры используют движки регулярных выражений, такие как Boost.Regex. Boost.Regex используется через API для обработки различных типов ввода, поэтому существует некоторый дополнительный код C ++. Не те вызовы API Boost.Regex, которые вам нужны.
Примеры, включенные в RE / flex, включают в себя сканер XML на C ++, который может помочь вам начать работу. RE / flex также поддерживает кодировку UTF-8, которая вам потребуется для правильного сканирования XML.