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

Refactoring Parsers

Boost , ,

  Refactoring Parsers

В настоящее время реализованы три типа парсеров рефакторинга, которые помогают абстрагировать общие задачи рефакторинга парсера. Рефакторинг парсера означает, что бетонная парсерная конструкция заменяется (рефакторируется) другой очень похожей парсерной конструкцией.Refactor_unary_parserиrefactor_action_parserвводятся для обеспечения простой и более выразительной записи при использованииConfix ParsersиСписок парсеров. Третий Рефакторирующий Парсер (attach_action_parser)реализован для абстрагирования некоторых функций, необходимых для группового анализатора. Тем не менее, эти парсеры могут помочь в решении других сложных задач анализа.

Refactoring unary parsers

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

    refactor_unary_d[*some_parser - another_parser]

то

    *(some_parser - another_parser)

гдеrefactor_unary_dявляется заданным объектом структуры генератора парсераrefactor_unary_gen<>

Генератор парсераrefactor_unary_dгенерирует новый парсер, как показано выше, только если исходная конструкция представляет собой вспомогательный бинарный парсер (здесь разностный парсер), а левый операнд этого двойного парсера представляет собой вспомогательный унарный парсер (здесь оператор кленовой звезды). Если исходный парсер не является бинарным парсером, компиляция потерпит неудачу. Если левый операнд не является унарным парсером, рефакторинга не будет.

Refactoring action parsers

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

    refactor_action_d[some_parser[some_actor] - another_parser]

то

    (some_parser - another_parser)[some_actor]

гдеrefactor_action_dявляется заданным объектом структуры генератора парсераrefactor_action_gen<>

Генератор парсераrefactor_action_dгенерирует новый парсер, как показано выше, только если исходная конструкция представляет собой вспомогательный бинарный парсер (здесь разностный парсер), а левый операнд этого двойного парсера представляет собой вспомогательный парсер, генерируемый присоединенным семантическим действием. Если исходный парсер не является бинарным парсером, компиляция потерпит неудачу. Если левый операнд не является парсером действий, то никакого рефакторинга не будет.

Attach action refactoring

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

    attach_action_d[(some_parser >> another_parser)[some_actor]]

то

    some_parser[some_actor] >> another_parser[some_actor]

гдеattach_action_dявляется заданным объектом структуры генератора парсераattach_action_gen<>

Генератор парсераattach_action_dгенерирует новый парсер, как показано выше, только если исходная конструкция является парсером вспомогательного действия, а парсер к нему прикреплено это действие, является парсером вспомогательного двоичного действия (здесь парсер последовательности). Если исходный парсер не является парсером действий, компиляция будет неудачной. Если парсер, к которому прикреплено действие, не является двоичным парсером, рефакторинга не будет.

Nested refactoring

Иногда требуется гнездить различные типы рефакторинга, т.е. трансформировать конструкции.

    (*some_parser)[some_actor] - another_parser

то

    (*(some_parser - another_parser))[some_actor]

Чтобы упростить конструкцию таких вложенных парсеров рефакторинга,refactor_unary_gen<>иrefactor_action_gen<>оба могут использовать другой тип генератора рефакторирующего парсера в качестве соответствующего шаблонного параметра. Например, чтобы построить генератор рефакторингового парсера для упомянутого вложенного преобразования, мы должны написать:

    typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
    const refactor_t refactor_nested_d = refactor_t(refactor_unary_d);

Теперь мы можем использовать его следующим образом, чтобы получить требуемый результат:

    refactor_nested_d[(*some_parser)[some_actor] - another_parser]

Пустой параметр шаблона означает не вкладывать этот конкретный рефакторирующий парсер. Параметр шаблона по умолчаниюnon_nesting_refactoring, предопределенная вспомогательная структура для ингибирования гнездования. Иногда требуется вложить в себя конкретный рефакторирующий парсер. Это достигается путем предоставления предварительно определенной вспомогательной структурыself_nested_refactoringв качестве параметра шаблона соответствующему шаблону генератора парсера рефакторинга.

См.refactoring.cppдля подходящего примера. Это часть духовного распределения.



 

Статья Refactoring Parsers раздела может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 08:42:01/0.006187915802002/0