Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

In-depth The Scanner

Boost , ,

In-depth: The Scanner

Basic Scanner API

class scanner
value_t typedef: The value type of the scanner's iterator
ref_t typedef: The reference type of the scanner's iterator
bool at_end() const Returns true if the input is exhausted
value_t operator*() const Dereference/get a value_t from the input
scanner const& operator++() move the scanner forward
IteratorT& first The iterator pointing to the current input position. Held by reference
IteratorT const last The iterator pointing to the end of the input. Held by value

Основное поведение сканера регулируется политикой. Фактическое выполнение функций публичных членов сканера, перечисленных в таблице выше, осуществляется политиками сканера.

Три набора политик регулируют поведение сканера. Эта политика позволяет ненавязчиво распространять Дух. Политика сканирования позволяет расширить ядро, не требуя каких-либо потенциально дестабилизирующих изменений в коде. Писательница библиотеки может предложить свою собственную политику, которая отменяет те, которые уже существуют, чтобы точно настроить процесс анализа в соответствии с ее собственными потребностями. Слои выше ядра, возможно, также захотят воспользоваться этим механизмом, основанным на политике. На ум приходят абстрактные синтаксические генерации деревьев, отладчики и лексеры.

Существует три набора политик, которые регулируют:

  • Итерация и фильтрация
  • Признание и сопоставление
  • Обработка семантических действий

iteration_policy

Вот политики по умолчанию, которые регулируют итерацию и фильтрацию:

    struct iteration_policy
    {
        template <typename ScannerT>
        void
        advance(ScannerT const& scan) const
        { ++scan.first; }
        template <typename ScannerT>
        bool at_end(ScannerT const& scan) const
        { return scan.first == scan.last; }
        template <typename T>
        T filter(T ch) const
        { return ch; }
        template <typename ScannerT>
        typename ScannerT::ref_t
        get(ScannerT const& scan) const
        { return *scan.first; }
    };
Iteration and filtering policies
advance Move the iterator forward
at_end Return true if the input is exhausted
filter Filter a character read from the input
get Read a character from the input

Следующий фрагмент кода демонстрирует простую политику, которая преобразует все символы в нижний регистр:

    struct inhibit_case_iteration_policy : public iteration_policy
    {
        template <typename CharT>
        CharT filter(CharT ch) const
        { 
            return std::tolower(ch); 
        }
    };

match_policy

Вот политики по умолчанию, которые регулируют распознавание и сопоставление:

    struct match_policy
    {
        template <typename T>
        struct result 
        { 
            typedef match<T> type; 
        };
        const match<nil_t>
        no_match() const
        { 
            return match<nil_t>(); 
        }
        const match<nil_t>
        empty_match() const
        { 
            return match<nil_t>(0, nil_t()); 
        }
        template <typename AttrT, typename IteratorT>
        match<AttrT>
        create_match(
            std::size_t         length,
            AttrT const&        val,
            IteratorT const&    /*first*/,
            IteratorT const&    /*last*/) const
        { 
            return match<AttrT>(length, val); 
        }
        template <typename MatchT, typename IteratorT>
        void
        group_match(
            MatchT&             /*m*/,
            parser_id const&    /*id*/,
            IteratorT const&    /*first*/,
            IteratorT const&    /*last*/) const {}
        template <typename Match1T, typename Match2T>
        void
        concat_match(Match1T& l, Match2T const& r) const
        { 
            l.concat(r); 
        }
    };
Recognition and matching
result A metafunction that returns a match type given an attribute type (see In-depth: The Parser)
no_match Create a failed match
empty_match Create an empty match. An empty match is a successful epsilon match (matching length == 0)
create_match Create a match given the matching length, an attribute and the iterator pair pointing to the matching portion of the input
group_match For non terminals such as rules, this is called after a successful match has been made to allow post processing
concat_match Concatenate two match objects

action_policy

Политика действий имеет только одну функцию для обработки семантических действий:

    struct action_policy
    {
        template <typename ActorT, typename AttrT, typename IteratorT>
        void
        do_action(
            ActorT const&       actor,
            AttrT const&        val,
            IteratorT const&    first,
            IteratorT const&    last) const;
    };

Политика действий по умолчанию направлена на:

    actor(first, last);

Еслиvalимеет тип nil_t. В противном случае:

    actor(val);

scanner_policies mixer

Классscanner_policiesСочетает три класса политики сканера выше в один:

    template <
        typename IterationPolicyT   = iteration_policy,
        typename MatchPolicyT       = match_policy,
        typename ActionPolicyT      = action_policy>
    struct scanner_policies;

Этотмикшеркласс наследует от всех трех полисов. Этот класс «Сканнер_Политика» используется для параметризации сканера:

    template <
        typename IteratorT = char const*,
        typename PoliciesT = scanner_policies<> >
    class scanner;

Сканер, в свою очередь, наследуется от PoliciesT.

Rebinding Policies

Сканер может быть сделан, чтобы перестроиться на другой набор политик в любое время. Он имеет членскую функциюchange_policies(new_policies). Учитывая новый набор политик, эта функция создает новый сканер с новым набором политик. Тип результатаотскокасканера можно получить, назвав метафункцию:

    rebind_scanner_policies<ScannerT, PoliciesT>::type

Rebinding Iterators

Сканер также может быть выполнен для перебиндинга на другой тип итератора в любое время. Имеет функцию участникаchange_iterator (первый, последний). Учитывая, что новая пара итераторов типа отличается от тех, которые удерживаются сканером, эта функция создает новый сканер с новой парой итераторов. Тип результатаотскокасканера можно получить, назвав метафункцию:

    rebind_scanner_iterator<ScannerT, IteratorT>::type


Статья In-depth The Scanner раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:12:54/0.0062308311462402/1