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

Primitives

Boost , ,

Primitives

Рамка предопределяет некоторые парсерные примитивы. Это самые основные строительные блоки, которые клиент использует для создания более сложных парсеров. Эти примитивные парсеры являются шаблонными классами, что делает их очень гибкими.

Эти примитивные парсеры могут быть инстанцированы непосредственно или через временную функцию помощника. Как правило, с функцией помощника гораздо проще справиться, поскольку она включает в себя меньше набора текста.

До этого мы видели буквальный парсер символов через функцию генератораch_p.Это не парсер, а генератор парсера. Классchlitявляется фактическим классом шаблонов за буквальным парсером символа. Чтобы создать объектchlit, вы должны явно указать тип символаCharT., как шаблонный параметр, определяющий тип символа. Этот тип обычно соответствует типу ввода, обычноcharилиwchar_t.. Следующее выражение создает временный парсерный объект, который распознает единственную букву'X'.

    chlit<char>('X');

Использование функции генератораchlitch_pупрощает использование классаchlit< >(это верно для большинства классов парсеров Spirit, поскольку большинство из них имеют соответствующие функции генератора). Функцию удобно называть, потому что компилятор выведет для нас тип шаблона посредством аргументного вывода. Приведенный выше пример можно выразить менее многословно, используя функцию помощникаch_p.

    ch_p('X')  // equivalent to chlit<char>('X') object
Parser generators

Whenever you see an invocation of the parser generator function, it is equivalent to the parser itself. Therefore, we often call ch_p a character parser, even if, technically speaking, it is a function that generates a character parser.

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

    // a rule can "store" a parser object.  They're covered
// later, but for now just consider a rule as an opaque type
rule<> r1, r2, r3;

chlit<char> x('X'); // declare a parser named x

r1 = chlit<char>('X'); // explicit declaration
r2 = x; // using x
r3 = ch_p('X') // using the generator

chlit and ch_p

Соответствует одному персонажу буквально.chlitимеет один параметр типа шаблона, который по умолчанию равенchar(т.е.chlit<>эквивалентенchlit). Этот параметр типа — тип символа, которыйchlitраспознает при разборе. Версия генератора функций выводит параметры типа шаблона из фактических аргументов функции. Конструктор классаchlitпринимает один параметр: символ, с которым он будет соответствовать входу. Примеры:

    r1 = chlit<>('X');
r2 = chlit<wchar_t>(L'X');
r3 = ch_p('X');

Вернемся к нашему первоначальному примеру:

    group = '(' >> expr >> ')';
expr1 = integer | group;
expr2 = expr1 >> *(('*' >> expr1) | ('/' >> expr1));
expr = expr2 >> *(('+' >> expr2) | ('-' >> expr2));

Буквальные буквы,,«+»,«-»,«*»и«/»в грамматическом декларировании являютсяобъектами, которые неявно создаются за кулисами.

char operands

The reason this works is from two special templatized overloads of operator>> that takes a (char, ParserT), or (ParserT, char). These functions convert the character into a chlit object.

Можно предпочесть прямо заявить об этом как:

    chlit<> plus('+');
chlit<> minus('-');
chlit<> times('*');
chlit<> divide('/');
chlit<> oppar('(');
chlit<> clpar(')');

range and range_p

диапазонсимволов создается из пары низких/высоких символов. Такой парсер соответствует одному персонажу, который находится в диапазоне, включая обе конечные точки. Подобноchlit,диапазонимеет один параметр типа шаблона, который по умолчанию равенchar. Конструктор классадиапазонапринимает два параметра: диапазон символовотидовключительно. Версия генератора функций —range_p. Примеры:

    range<>('A','Z')    // matches 'A'..'Z'
range_p('a','z') // matches 'a'..'z'

Обратите внимание, что первый символ должен быть «до» второго, в соответствии с кодирующими символами. Диапазон, как и хлит, представляет собой одиночный парсер персонажей.

Character mapping

Character mapping to is inherently platform dependent. It is not guaranteed in the standard for example that 'A' < 'Z', however, in many occasions, we are well aware of the character set we are using such as ASCII, ISO-8859-1 or Unicode. Take care though when porting to another platform.

strlit and str_p

Этот парсер соответствует строке буквально.Стритимеет один параметр шаблонного типа: тип итератора. ВнутриСтритсодержит пару итератора начала/конца, указывающую на строку или контейнер символов. Стритпытается сопоставить текущий входной поток с этой строкой. Параметр шаблонного типа по умолчаниюchar const*.strlitимеет два конструктора. Первый принимает нулевой указатель персонажа. Этот конструктор может быть использован для построенияполосиз цитируемых струнных букв. Второй конструктор принимает первую/последнюю пару итераторов. Версия генератора функцийstr_p. Примеры:

    strlit<>("Hello World")
str_p("Hello World")

std::string msg("Hello World");
strlit<std::string::const_iterator>(msg.begin(), msg.end());
Character and phrase level parsing

Typical parsers regard the processing of characters (symbols that form words or lexemes) and phrases (words that form sentences) as separate domains. Entities such as reserved words, operators, literal strings, numerical constants, etc., which constitute the terminals of a grammar are usually extracted first in a separate lexical analysis stage.

At this point, as evident in the examples we have so far, it is important to note that, contrary to standard practice, the Spirit framework handles parsing tasks at both the character level as well as the phrase level. One may consider that a lexical analyzer is seamlessly integrated in the Spirit framework.

Although the Spirit parser library does not need a separate lexical analyzer, there is no reason why we cannot have one. One can always have as many parser layers as needed. In theory, one may create a preprocessor, a lexical analyzer and a parser proper, all using the same framework.

chseq and chseq_p

Соответствует последовательности персонажей.chseqимеет те же параметры шаблонного типа и параметры конструктора, что и Стрит. Версия генератора функцийchseq_p. Примеры:

    chseq<>("ABCDEFG")
chseq_p("ABCDEFG")

strlit— неявная лексема. То есть работает исключительно на уровне персонажа.chseq,strlitблизнец, с другой стороны, может работать как на уровне персонажа, так и на уровне фразы. Это просто означает, что он может игнорировать белые пространства между струнными символами. Например:

    chseq<>("ABCDEFG")

Можно разобрать:

    ABCDEFG
A B C D E F G
AB CD EFG

More character parsers

Также фреймворк предопределяет полный репертуар односимвольных парсеров:

Single character parsers
anychar_p Matches any single character (including the null terminator: '\0')
alnum_p Matches alpha-numeric characters
alpha_p Matches alphabetic characters
blank_p Matches spaces or tabs
cntrl_p Matches control characters
digit_p Matches numeric digits
graph_p Matches non-space printing characters
lower_p Matches lower case letters
print_p Matches printable characters
punct_p Matches punctuation symbols
space_p Matches spaces, tabs, returns, and newlines
upper_p Matches upper case letters
xdigit_p Matches hexadecimal digits

negation ~

Одиночные парсеры символов, такие какchlit,range,anychar_p,alnum_pи т.д., могут быть отрицаемы. Например:

    ~ch_p('x')

Сравнение с любым персонажем, кроме'x'. Двойное отрицание парсера персонажа отменяет отрицание.~~alpha_pэквивалентноalpha_p.

eol_p

Соответствует концу строки (CR/LF и их комбинациям).

nothing_p

Никогда ничего не сравнится и всегда провалится.

end_p

Соответствует концу ввода (возвращает успешное совпадение с длиной 0, когда вход исчерпан)

eps_p

Epsilonepsilon_pиeps_p— многоцелевой парсер, возвращающий совпадение нулевой длины. См.Эпсилондля деталей.



 

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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 04:06:23/0.024374008178711/1