![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Refactoring ParsersBoost , ,
В настоящее время реализованы три типа парсеров рефакторинга, которые помогают абстрагировать общие задачи рефакторинга парсера. Рефакторинг парсера означает, что бетонная парсерная конструкция заменяется (рефакторируется) другой очень похожей парсерной конструкцией.Refactor_unary_parserиrefactor_action_parserвводятся для обеспечения простой и более выразительной записи при использованииConfix ParsersиСписок парсеров. Третий Рефакторирующий Парсер (attach_action_parser)реализован для абстрагирования некоторых функций, необходимых для группового анализатора. Тем не менее, эти парсеры могут помочь в решении других сложных задач анализа. Refactoring unary parsersГенератор парсераrefactor_unary_d, который должен использоваться для генерации унарного рефакторирующего парсера, преобразует конструкцию следующего типа:
то
Генератор парсераrefactor_unary_dгенерирует новый парсер, как показано выше, только если исходная конструкция представляет собой вспомогательный бинарный парсер (здесь разностный парсер), а левый операнд этого двойного парсера представляет собой вспомогательный унарный парсер (здесь оператор кленовой звезды). Если исходный парсер не является бинарным парсером, компиляция потерпит неудачу. Если левый операнд не является унарным парсером, рефакторинга не будет. Refactoring action parsersГенератор парсераrefactor_action_d, который должен использоваться для генерации парсера рефакторинга действия, преобразует конструкцию следующего типа:
то
Генератор парсераrefactor_action_dгенерирует новый парсер, как показано выше, только если исходная конструкция представляет собой вспомогательный бинарный парсер (здесь разностный парсер), а левый операнд этого двойного парсера представляет собой вспомогательный парсер, генерируемый присоединенным семантическим действием. Если исходный парсер не является бинарным парсером, компиляция потерпит неудачу. Если левый операнд не является парсером действий, то никакого рефакторинга не будет. Attach action refactoringГенератор парсераattach_action_d, который должен использоваться для генерации парсера рефакторинга прикрепленного действия, преобразует конструкцию следующего типа:
то
Генератор парсераattach_action_dгенерирует новый парсер, как показано выше, только если исходная конструкция является парсером вспомогательного действия, а парсер к нему прикреплено это действие, является парсером вспомогательного двоичного действия (здесь парсер последовательности). Если исходный парсер не является парсером действий, компиляция будет неудачной. Если парсер, к которому прикреплено действие, не является двоичным парсером, рефакторинга не будет. Nested refactoringИногда требуется гнездить различные типы рефакторинга, т.е. трансформировать конструкции.
то
Чтобы упростить конструкцию таких вложенных парсеров рефакторинга,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); Теперь мы можем использовать его следующим образом, чтобы получить требуемый результат:
Пустой параметр шаблона означает не вкладывать этот конкретный рефакторирующий парсер. Параметр шаблона по умолчаниюnon_nesting_refactoring, предопределенная вспомогательная структура для ингибирования гнездования. Иногда требуется вложить в себя конкретный рефакторирующий парсер. Это достигается путем предоставления предварительно определенной вспомогательной структурыself_nested_refactoringв качестве параметра шаблона соответствующему шаблону генератора парсера рефакторинга.
Copyright © 2001-2003 Hartmut Kaiser
Статья Refactoring Parsers раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |