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

Confix Parsers

Boost , ,

  Confix Parsers

Confix Parsers

Парсеры Confix распознают последовательность из трех независимых элементов: открытие, выражение и закрытие. Примером может служить комментарий C:

    /* This is a C comment */

которые можно разобрать с помощью следующего определения правила:< >

    rule<> c_comment_rule
        =   confix_p("/*", *anychar_p, "*/")
        ;

Confix_pГенератор парсера должен использоваться для генерации требуемого Confix Parser. Три параметра дляconfix_pмогут быть одиночные символы (как указано выше), строки или, если требуется более сложная логика разбора, вспомогательные парсеры, каждый из которых автоматически преобразуется в соответствующий тип парсера, необходимый для успешного разбора.

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

    open >> (expr - close) >> close

Если expr parser являетсяaction_parser_categoryтипа parser (парсер с прилагаемым семантическим действием), мы должны сделать что-то особенное. Это происходит, если пользователь написал что-то вроде:

    confix_p(open, expr[func], close)

где<expr>- парсер, соответствующий экспру конфиксной последовательности, и<func>- функтор, который должен быть вызван после сопоставления<expr>. Если мы ничего не будем делать, полученный код разберет последовательность следующим образом:

    open >> (expr[func] - close) >> close

В большинстве случаев это не то, что ожидает пользователь. (Если этото, что вы ожидали, то, пожалуйста, используйтеconfix_pфункцию генератораdirect()), который будет препятствовать парсерному рефакторингу. Чтобы приставка-парсер вела себя так, как ожидалось:

    open >> (expr - close)[func] >> close

Прикрепленный к парсеру<expr>актер должен быть повторно прикреплен к конструкции парсера<(expr - close)>, что заставит результирующий конфикс-парсер «делать правильные вещи». Это делается с помощьюпарсеров. Кроме того, следует соблюдать особую осторожность, если парсер expr являетсяunary_parser_categoryтипа парсера.

    confix_p(open, *anychar_p, close)

которые без какого-либо рефакторинга привели бы к

    open >> (*anychar_p - close) >> close

и не даст ожидаемого результата (*anychar_p съест весь вход до конца входного потока). Поэтому мы должны переделать это в:<

   open>> *(anychar_p-close) >>close
>

то, что даст правильный результат.

Случай, когда expr parser является комбинацией двух упомянутых проблем (т.е. expr parser является унарным парсером с прилагаемым действием), обрабатывается соответствующим образом, поэтому:

    confix_p(open, (*anychar_p)[func], close)

Будут разобраны, как и ожидалось:

    open >> (*(anychar_p - end))[func] >> close

Необходимый рефакторинг осуществляется здесь с помощьюРефакторинговых парсеров.

Summary of Confix Parser refactorings
You write it as: It is refactored to:
confix_p(open, expr, close)

<open>> (expr-close) >>close>

confix_p(open, expr[func], close)

<open>> (expr-close)[func] >>close>

confix_p(open, *expr, close)

<open>> *(expr -close) >>close>

confix_p(open, (*expr)[func], close)

<open>> (*(expr- close))[func]>> close>

Комментарий Парсерса

Шаблон генератора комментариев Parsercomment_pпомогает создать правильныйConfix Parserиз вспомогательных параметров, который способен анализировать конструкции комментариев следующим образом:

    StartCommentToken >> Comment text >> EndCommentToken

В качестве параметров поддерживаются следующие типы: парсеры, одиночные символы и строки (см. as_parser). Если он используется с одним параметром, то сопоставляется комментарий, начинающийся с заданного первого параметра парсера до конца строки. Например, следующий парсер соответствует комментариям в стиле C++:

    comment_p("//")

Если он используется с двумя параметрами, то сопоставляется комментарий, начинающийся с первого парсерного параметра до второго парсерного параметра. Например, парсер комментариев в стиле C может быть сокращен как:

    comment_p("/*", "*/")

Генератор парсераcomment_pпозволяет генерировать парсеры для сопоставления невложенных комментариев (как для комментариев C/C++). Иногда необходимо разбирать вложенные комментарии, как, например, разрешено в Паскале.

    { This is a { nested } PASCAL-comment }

Такие вложенные комментарии можно разбирать с помощью парсеров, генерируемых функтором шаблона шаблонаcomment_nest_p. В следующем примере показан парсер, который можно использовать для разбора двух различных (нестабильных) стилей комментариев Паскаля:

    rule<> pascal_comment
        =   comment_nest_p("(*", "*)")
        |   comment_nest_p('{', '}')
        ;

Обратите внимание, что комментарий анализируется неявно, как если бы веськомментарий_p(...)Заявление было встроено вlexeme_d[]директива, то есть во время разбора комментария не произойдет пропуска токена, даже если вы определили пропуск парсера для всего процесса разбора.

comments.cppдемонстрирует различные схемы парсинга комментариев:

  1. Парсинг различных стилей комментариев
    • Разбор комментариев в стиле C/C++
    • Разбор комментариев в стиле C++
    • PASCAL-стиль комментария
  2. Парсинг тегированных данных с помощью confix_parser
  3. Парсинг помеченных данных с помощью confix_parser, но семантическое
    действие непосредственно прикрепляется к парсеру последовательности тела

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



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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 14:03:27/0.004368782043457/0