Открыть сервисСервис

Парсер — программа синтаксического анализа

Парсер (от англ. parser, от to parse — «разбирать») — программа или алгоритм, выполняющий синтаксический (структурный) анализ входных данных и преобразующий их в формализованное представление, удобное для дальнейшей обработки. Парсеры применяются в компиляторах, интерпретаторах, обработке текстов, разборе файлов конфигурации, веб-скрапинге и многих других областях информатики.

Основные понятия

Входные данные для парсера — это последовательность символов (токенов), организованная по определённым правилам: грамматике, формату или протоколу. Результатом работы парсера обычно является абстрактное синтаксическое дерево (AST — Abstract Syntax Tree), таблица значений, объект в памяти или иная структура данных, отражающая внутреннюю структуру входной информации.

Различают два основных направления:

  • Лексический анализ (токенизация) — разбиение входного потока символов на лексемы (числа, идентификаторы, операторы, разделители). Инструмент, выполняющий эту задачу, называется лексером или токенизатором.
  • Синтаксический анализ — проверка последовательности токенов на соответствие грамматике и построение дерева разбора. Этим непосредственно занимается парсер.

Часто лексер и парсер работают совместно: лексер подаёт парсеру поток токенов, а парсер проверяет их порядок и строит структуру.

Типы парсеров

По способу разбора парсеры делятся на:

  • Рекурсивно-нисходящие (top-down) — начинают разбор от корневого символа грамматики и рекурсивно спускаются к лексемам. Просты в реализации, но требуют грамматик без левой рекурсии.
  • Восходящие (bottom-up) — начинают с лексем и постепенно сворачивают их в более сложные конструкции. К ним относятся LR-парсеры (SLR, LALR, CLR), считающиеся наиболее мощными для детерминированных контекстно-свободных грамматик.
  • Генерируемые автоматически — создаются из описания грамматики с помощью инструментов вроде ANTLR, Bison, Yacc, Lex/Flex,PLY (Python Lex-Yacc).

По типу обрабатываемых данных парсеры бывают:

  • Компиляторные — разбирают исходный код программ (C, Java, Python).
  • Документные — разбирают структурированные документы: XML, HTML, JSON, CSV.
  • Протокольные — разбирают сетевые протоколы и бинарные форматы.

Парсинг веб-страниц

Одно из самых распространённых применений парсеров в современной разработке — разбор HTML-документов. HTML — язык с нестрогой грамматикой, поэтому для него используются специализированные парсеры, устойчивые к ошибкам в разметке. Известные реализации:

  • BeautifulSoup (Python) — библиотека для навигации и поиска по дереву HTML/XML-документов.
  • lxml — привязка к библиотекам libxml2/libxslt, поддерживающая XPath и XSLT.
  • jsoup (Java) — парсер HTML с селекторами, похожими на CSS.
  • Cheerio (Node.js) — jQuery-подобный интерфейс для разбора HTML.

Парсинг HTML применяется в поисковых роботах, инструментах веб-скрапинга, тестировании веб-приложений и автоматизации.

Парсинг структурированных форматов

JSON

JSON (JavaScript Object Notation) — строго формализованный формат обмена данными. Парсеры JSON реализованы практически во всех языках программирования: json в Python, JSON.parse в JavaScript, System.Text.Json в .NET. Стандарт описан в RFC 8259.

XML

XML-парсеры делятся на два класса:

  • DOM-парсеры — загружают весь документ в память и строят дерево объектов.
  • SAX-парсеры — потоковые, обрабатывают документ по мере чтения, вызывая события при встрече открывающих и закрывающих тегов. Более экономичны по памяти.

CSV

Парсинг CSV看似 простым, но содержит подводные камни: разные соглашения о разделителях, экранирование кавычками, многострочные поля. В Python для этого используется модуль csv, в R — функции read.csv и readr.

Парсеры в компиляторах

В теории компиляции парсер — центральный компонент, преобразующий поток токенов в синтаксическое дерево. Современные компиляторы часто используют комбинированные подходы: например, парсер C++ от Clang построен на рекурсивно-нисходящем алгоритме с ручной оптимизацией, а парсер Rust — генерируется инструментом LALRPOP.

Грамматика языка формально описывается в нотации BNF или EBNF. На основе этого описания инструменты генерации парсеров (ANTLR, Bison, Yacc) автоматически строят код анализатора.

Парсинг естественного языка

В обработке естественных языков (NLP) парсер строит грамматическую структуру предложения: синтаксическое дерево, отражающее отношения между словами (подлежащее — сказуемое, дополнение, определение). Используются как rule-based подходы (например, парсеры на основе грамматик Stanford CoreNLP, MeCab для японского), так и статистические и нейросетевые модели (UDPipe, Stanza).

Инструменты генерации парсеров

ИнструментЯзыкПодход
ANTLRJava (генерация для многих языков)Рекурсивно-нисходящий
Bison / YaccCLR / LALR
Flex / LexCЛексический анализ
PLYPythonЛексический + LR-парсер
LALRPOPRustLALR
Tree-sitterC (биндинги для многих языков)Инкрементальный, LR

Применение

Парсеры используются повсеместно:

  • Компиляторы и интерпретаторы — разбор исходного кода.
  • Конфигурационные файлы — YAML, TOML, INI, JSON.
  • Логи и телеметрия — разбор строк логов для аналитики.
  • Файлы данных — FASTA/BioPython, PDB в биоинформатике, FITS в астрономии.
  • Сетевые протоколы — разбор пакетов (Wireshark использует парсеры протоколов).
  • Криптография и реверс-инжиниринг — разбор бинарных форматов.

Примечания

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

Источники

  • Ахо А., Лам М., Сети Р., Ульман Д. Компиляторы: принципы, технологии и инструменты. — М.: Вильямс, 2008.
  • Grune D., Jacobs C. Parsing Techniques: A Practical Guide. — Springer, 2008.
  • RFC 8259. The JavaScript Object Notation (JSON) Data Interchange Format. — IETF, 2017.
  • Documentation of Python standard library: модули json, csv, xml.etree.ElementTree.
  • Документация ANTLR (www.antlr.org).
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru