![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
DirectivesBoost , ,
Директивы Парсера имеют форму: направление [выражение] Директива модифицирует поведение своего замкнутого выражения, по существу декорации. Рамочная основа определяет несколько директив. Клиенты системы могут свободно определять свои собственные директивы по мере необходимости. Информация о том, как это делается, будет представлена позднее. Пока мы будем заниматься только предопределенными директивами. lexeme_dВыключает белое пространство. На уровне фраз парсер игнорирует белые пространства, возможно, включая комментарии. Используйте lexeme_d в ситуациях, когда мы хотим работать на уровне персонажа вместо уровня фразы. Парсеры могут быть сделаны для работы на уровне символов, включив соответствующие части в директиву lexeme_d. Например, заполните пример, представленный в Введение. Там мы пропустили определение правила целое число. Вот как он на самом деле определяется:
Директива lexeme_d предписывает парсеру работать на уровне символов. Без него правило integer позволило бы ввести ошибочные встроенные белые пространства в вводимые ресурсы, такие как "1 2 345", которые будут рассматриваться как "12345". as_lower_dЕсть моменты, когда мы хотим ингибировать чувствительность к делу. Директива as_lower_d преобразует все символы из входного в нижний.
Например, в Паскале ключевые слова и идентификаторы являются бесчувственными. Паскаль игнорирует случай букв в идентификаторах и ключевых словах. Идентификаторы Id, ID и id неразличимы в Паскале. Без директивы as_lower_d было бы неловко определить правило, которое признает это. Вот возможность:
Теперь попробуйте сделать это с случаем нечувствительного Pascal ключевого слова "BEGIN". Директива as_lower_d делает это простым:
no_actions_dЕсть случаи, когда вы хотите, чтобы семантические действия не запускались. Закрепив парсер в директиве no_actions_d, все семантические действия, прямо или косвенно связанные с парсером, не будут стрелять.
Tweaking the Scanner Type
lexeme_scanner, as_lower_scanner и no_actions_scanner являются вашими друзьями, если возникает необходимость обертывания правила внутри этих директив. Узнать об этих зверях в следующей главе на Сканнер и Парсинг. longest_dАльтернативы в компиляторе Spirit parser являются короткими (см. Operators). Иногда это не то, что нужно. Директива longest_d предписывает парсеру не использовать альтернативы короткого замыкания, содержащиеся в этой директиве, но вместо этого делает парсер попробовать все возможные альтернативы и выбрать один, соответствующий самой длинной части потока ввода. Рассмотрим выравнивание целых чисел и реальных чисел:
Число может быть реальным или целым. Эта грамматика неоднозначна. Вход "1234" потенциально должен соответствовать как реальному, так и целых чисел. Напомним, что альтернативы являются краткосрочными. Таким образом, для таких входов, как выше, реальная альтернатива всегда побеждает. Однако, если мы поменяем альтернативы:
у нас все еще проблема. Теперь вход "123.456" будет частично сопоставлен интегратором до десятичной точки. Мы не этого хотим. Решение здесь состоит либо в том, чтобы исправить двусмысленность путем учета общих префиксов реального и целого числа, либо, если это невозможно и не желательно, использовать директиву longest_d:
shortest_dНапротив директивы longest_d.
limit_dОбеспечивает, что результат парсера ограничен заданным диапазоном min..max (включая). Если нет, то парсер терпит неудачу и возвращает "нет-матч". Использование:
Эта директива особенно полезна в сочетании с парсерами, которые делят конкретные скалярные диапазоны (например, числовые парсеры). Вот пример. Хотя числовые парсеры могут быть настроены, чтобы принять только ограниченное количество цифр (скажем, 0..2), нет способа ограничить результат диапазоном (скажем -1.0.1.0). Эта конструкция преднамеренная. Это подорвало бы дизайнерское правило Духа, что " клиент не должен платить за функции, которые она не использует ". Мы бы сохранили значения min, max в самом числовом парке, используемом или неиспользуемом. Ну, мы могли бы пройти, используя статические константы, настроенные параметром шаблона нетипа, но это неприемлемо, потому что таким образом мы можем разместить только целые числа. Как насчет реальных чисел или пользовательских определенных чисел, таких как big-ints? Пример, время парза формы H:MM:SS:
min_limit_dИногда полезно отключить только максимальный предел. Это позволит установить интервал, который не связан в одном направлении. Директива min_limit_d гарантирует, что результат парсера не меньше, чем минимум. Если нет, то парсер терпит неудачу и возвращает "нет-матч". Использование:
Пример, убедитесь, что дата не менее 1900
max_limit_dНапротив min_limit_d. Обратите внимание, что limit_d [p] эквивалентен:
Copyright © 1998-2003 Joel de Guzman
Статья Directives раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |