Архив 2008 года

Boost::Spirit: Грамматики, функции и замыкания

В этой заметке я продолжу рассказывать о библиотеке Boost::Spirit, предназначенной для написания на C++ различных парсеров. В прошлой заметке я описал базовые возможности Spirit, a в этой хочу затронуть несколько возможностей, которые по моему мнению практически необходимы в случае написания сколько-нибудь сложных парсеров. Итак, эти возможности:

Читать дальше »

Boost::Xpressive - Альтернатива Boost::Regex

Не так давно я писал об использовании библиотеки Boost::Regex для регулярных выражений в C++. В этой заметке, я опять затрону эту тему, только теперь рассмотрю другой компонент Boost, предназначенный для обработки регулярных выражений: Boost::Xpresive.

Итак, во-первых, чем же он отличается от Boost::Regex:


  • Xpressive не требует линковки никаких дополнительных библиотек;

  • Утверждается, что Xpressive в среднем работает быстрее;

  • В Xpressive реглярные выражения могут описываться не только динамически (в виде строки, передаваемой в некую функцию), но и статически в виде C++ кода.

  • Регулярные выражения Xpressive могут ссылаться друг на друга, образуя целые грамматики

Читать дальше »

Регулярные выражения в С++: использование Boost::Regex

В этой заметке я рассмотрю такую достаточно популярную тему, как использование регулярных выражений. Причем, рассматривать я буду применительно к C++ с использованием библиотеки Boost, которая содержит замечательные средства для их поддержки.

Используемый синтаксис реглярных выражений совпадает с широко известным PCRE (Perl-Compatible Regular Expressions).

Для использования библиотеки необходимо включить заголовочный файл boost/regex.hpp:

#include <boost/regex.hpp>

Читать дальше »

Создание парсеров на C++ с помощью Boost::Spirit

Иногда в проектах на C++, (у кого-то чаще, у кого-то реже) возникает задача разбора какого-либо структурированного текста. То есть по сути, создание парсера того или иного языка. Обычно, к этой задаче подходят одним из следующих способов:


  • Написание парсера вручную, анализируя строку средствами C++, возможно, используя регулярные выражения.

  • Генерация парсера с использованием соответствующих утилит, например, Antlr, lex/yacc и т.п.

Несколько иной подход предоставляется библиотекой Spirit в составе Boost. О нем я расскажу ниже.

Boost::Spirit – библиотека, предназначенная для описания текста грамматики вместе с семантическими действиями прямо в C++ коде. Грамматика буквально конструируется из примитивных парсеров путем использования соответствующим образом перегруженных операторов C++. Таким образом, описание грамматики выглядит достаточно близко к классическому описанию, как например БНФ.

Читать дальше »

Создание плазмоидов: One-Line Calculator

Недавно я написал свой первый апплет для KDE4, в связи с чем хочу поделиться опытом разработки.

Итак, мой апплет: Plasma One-Line Calculator. Крайне простая и вместе с тем необходимая мне вещь. Работает он следующим образом: на рабочем столе отображается текстовое поле, в которое можно ввести выражение. При нажатии Enter это выражение вычисляется и в поле отображается результат вычисления. Вот и все.

Для того, чтобы реализовать вычисление, я использовал возможности скриптового движка в KDE4.

Исходный код

Исходный код плагина состоит из трех файлов:

Читать дальше »

Производительность RSS парсеров для Ruby

Не так давно, изучал возможность использования различных RSS парсеров для Ruby. В связи с этим, провел небольшое сравнение производительности различных парсеров. В сравнении участвовали:

  • RSS парсер из стандартной библиотеки
  • SimpleRSS
  • FeedTools
  • Syndication
  • FeedNormalizer
Для тестов я использовал две ленты:

Читать дальше »

Получение всех Java классов из ClassPath

Уже не первый раз наталкиваюсь на достаточно общую задачу: найти все классы в classpath приложения. Каждый раз гуглю, пишу код, а потом он где-то теряется. Поэтому, выкладываю код своего решения, может быть кому-нибудь пригодится. А если не пригодится напрямую, здесь видно как читать Jar-файлы))) Короче, говоря, гугл рассудит) Краткое описание подхода, чтобы лучше понимался код:

  • Разделяем строку classpath на записи, ссылающиеся на конкретные директории и jar-файлы. В линуксе разделитель между ними - двоеточие, в винде - точка с запятой. Дальше, для каждой записи:
  • Если запись ссылается на директорию - рекурсивно сканируем ее, считая директорию, откуда начали сканирование соответствующей корневому пакету.
  • Если запись ссылается на файл, пытаемся анализировать его как Jar-файл, используя инструментарий из пакета java.util.jar
Чтобы использовать нижеприведенный класс необходимо получить саму строку classpath. Это осуществляется простым вызовом System.getProperty ("java.class.path")

Читать дальше »

Преимущества Maven

Около полутора недель назад открыл для себя Maven. Пришлось с ним играться в связи с тем, что исходники одной библиотеки на Java, с которой я работал, собирались с его помощью. Сначала было несколько непривычно, сейчас уже не представляю как я раньше жил без него. Наверное, если все просуммировать, основными особенностями, которые меня в нем привлекают будут:

  • Контроль внешних зависимостей. Потрясающе удобно, когда всякие мелкие библиотечки не надо качать отовсюду и искать им место в структуре проекта, а достаточно указать в xml-файле. и они автоматически скачиваются по мере необходимости.
  • Модули и зависимости между ними. Один проект легко разбивается на подпроекты, междукоторыми устанавливаются зависимости.
  • Плагины, которые автоматически скачиваются по мере необходимости.
  • Генерация проектов Eclipse, не надо делать одно и то же дважды.
  • Простота - то, что все проекты имеют более-менее зафиксированную структуру значительно упрощает работу с ними.
Несколько ссылок по теме:

Читать дальше »

Динамика Groovy

В этой заметке я расскажу о некоторых возможностях Groovy, которые обеспечивают его динамичность. В частности:

Читать дальше »

Мультиметоды в Groovy

Мультиметоды – это механизм выбора метода на основе не только динамического типа его получателя, как при использовании виртуальных методов, но и динамических типов его аргументов. По сути, этот механизм обобщает виртуальные функции и перегрузку.

При правильном использовании этот механизм позволяет писать более компактный и читабельный код, однако, как обычно и бывает, ценой потери производительности. Хотя вопрос о значительности этих потерь остается открытым, и, я думаю, схож с вопросом о производительности в случае с виртуальных функций.

В Groovy выбор метода для вызова осуществляется на основе динамических типов аргументов, а не статических, как, например, в Java. В частности, рассмотрим два следующих участка кода.

Читать дальше »