| [/============================================================================== |
| Copyright (C) 2001-2010 Joel de Guzman |
| Copyright (C) 2001-2010 Hartmut Kaiser |
| |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| ===============================================================================/] |
| |
| This quick reference section is provided for convenience. You can use |
| this section as sort of a "cheat-sheet" on the most commonly used Karma |
| components. It is not intended to be complete, but should give you an |
| easy way to recall a particular component without having to dig up on |
| pages upon pages of reference documentation. |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section Common Notation] |
| |
| [variablelist Notation |
| [[`G`] [Generator type]] |
| [[`g, a, b, c, d`] [Generator objects]] |
| [[`A, B, C, D`] [Attribute types of generators `a`, `b`, `c`, and `d`]] |
| [[`I`] [The iterator type used for generation]] |
| [[`Unused`] [An `unused_type`]] |
| [[`Context`] [The enclosing rule's `Context` type]] |
| [[`attrib`] [An attribute value]] |
| [[`Attrib`] [An attribute type]] |
| [[`b`] [A boolean expression]] |
| [[`B`] [A type to be interpreted in boolean expressions]] |
| [[`fg`] [A (lazy generator) function with signature `G(Unused, Context)`]] |
| [[`fa`] [A (semantic action) function with signature `void(Attrib&, Context, bool&)`. |
| The third parameter is a boolean flag that can be set to false to |
| force the generator to fail. Both `Context` and the boolean flag are |
| optional.]] |
| [[`outiter`] [An output iterator to receive the generated output]] |
| [[`Ch`] [Character-class specific character type (See __char_class_types__)]] |
| [[`ch, ch2`] [Character-class specific character (See __char_class_types__)]] |
| [[`charset`] [Character-set specifier string (example: `"a-z0-9"`)]] |
| [[`str`] [Character-class specific string (See __char_class_types__)]] |
| [[`Str`] [Attribute of `str`: `std::basic_string<T>` where `T` is the underlying character type of `str`]] |
| [[`num`] [Numeric literal, any integer or real number type]] |
| [[`Num`] [Attribute of `num`: any integer or real number type]] |
| [[`tuple<>`] [Used as a placeholder for a fusion sequence]] |
| [[`vector<>`] [Used as a placeholder for an STL container]] |
| [[`variant<>`] [Used as a placeholder for a boost::variant]] |
| [[`optional<>`] [Used as a placeholder for a boost::optional]] |
| ] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:primitive_generators Karma Generators] |
| |
| [section:char Character Generators] |
| |
| See here for more information about __karma_char__. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[karma_char `ch`]] [`Unused`] [Generate `ch`]] |
| [[[karma_char `lit(ch)`]] [`Unused`] [Generate `ch`]] |
| |
| [[[karma_char `char_`]] [`Ch`] [Generate character supplied as the attribute]] |
| [[[karma_char `char_(ch)`]] [`Ch`] [Generate `ch`, |
| if an attribute is supplied it must match]] |
| [[[karma_char `char_("c")`]] [`Ch`] [Generate a single char string literal, `c`, |
| if an attribute is supplied it must match]] |
| [[[karma_char `char_(ch, ch2)`]][`Ch`] [Generate the character supplied as the attribute, |
| if it belongs to the character range from |
| `ch` to `ch2`]] |
| [[[karma_char `char_(charset)`]][`Ch`] [Generate the character supplied as the attribute, |
| if it belongs to the character set `charset`]] |
| |
| [[[karma_char_class `alnum`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isalnum` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `alpha`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isalpha` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `blank`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isblank` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `cntrl`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::iscntrl` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `digit`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isdigit` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `graph`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isgraph` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `print`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isprint` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `punct`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::ispunct` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `space`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isspace`, or |
| a single space character in the character set |
| defined by `NS`]] |
| [[[karma_char_class `xdigit`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isxdigit` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `lower`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::islower` in |
| the character set defined by `NS`]] |
| [[[karma_char_class `upper`]] [`Ch`] [Generate the character supplied as the attribute |
| if it satisfies the concept of `std::isupper` in |
| the character set defined by `NS`]] |
| ] |
| |
| [endsect] |
| |
| [section:string String Generators] |
| |
| See here for more information about [karma_string String Generators]. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[karma_string `str`]] [`Unused`] [Generate `str`]] |
| [[[karma_string `lit(str)`]] [`Unused`] [Generate `str`]] |
| [[[karma_string `string`]] [`Str`] [Generate string supplied as the attribute]] |
| [[[karma_string `string(str)`]] [`Str`] [Generate `str`, |
| if an attribute is supplied it must match]] |
| |
| [[__karma_symbols__`<Attr, T>`] [`Attr`] [Declare a symbol table, `sym`. `Attr` is the |
| The type of the original attribute to be used |
| as the key into the symbol generator. |
| `T` is the data type associated with each key.]] |
| [[ |
| `` |
| sym.add |
| (attr1, val1) |
| (attr2, val2) |
| /*...more...*/ |
| ; |
| `` |
| ] |
| [N/A] [Add symbols into a symbol table, `sym`. |
| val1 and val2 are optional data of type `T`, |
| the data type associated with each key.]] |
| [[`sym`] [`T`] [Emits entries in the symbol table, `sym`. If |
| attribute is found in the symbol table, |
| the corresponding value is emitted. If `sym` |
| does not store values, the original attribute |
| is emitted.]] |
| ] |
| |
| [endsect] |
| |
| [section:real_number Real Number Generators] |
| |
| See here for more information about __karma_numeric__. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[real_number `lit(num)`]] [`Unused`] [Generate `num`]] |
| [[[real_number `float_`]] [`float`] [Generate a real number from a `float`]] |
| [[[real_number `float_(num)`]] [`float`] [Generate `num` as a real number from a `float`, |
| if an attribute is supplied it must match]] |
| [[[real_number `double_`]] [`double`] [Generate a real number from a `double`]] |
| [[[real_number `double_(num)`]] [`double`] [Generate a `num` as a real number from a `double`, |
| if an attribute is supplied it must match]] |
| [[[real_number `long_double`]] [`long double`] [Generate a real number from a `long double`]] |
| [[[real_number `long_double(num)`]] [`long double`] [Generate `num` as a real number from a `long double`, |
| if an attribute is supplied it must match]] |
| |
| [[[real_number ``real_generator< |
| Num, Policies |
| >()``]] |
| [`Num`] [Generate a real number `Num` using |
| the supplied real number formatting policies]] |
| [[[real_number ``real_generator< |
| Num, Policies |
| >()(num)``]] |
| [`Num`] [Generate real number `num` as a `Num` |
| using the supplied real number formatting |
| policies, if an attribute is supplied it must |
| match]] |
| ] |
| |
| [endsect] |
| |
| [section:signed_int Integer Generators] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[signed_int `lit(num)`]] [`Unused`] [Generate `num`]] |
| [[[signed_int `short_`]] [`short`] [Generate a short integer]] |
| [[[signed_int `short_(num)`]] [`short`] [Generate `num` as a short integer, |
| if an attribute is supplied it must match]] |
| [[[signed_int `int_`]] [`int`] [Generate an int]] |
| [[[signed_int `int_(num)`]] [`int`] [Generate `num` as an int, |
| if an attribute is supplied it must match]] |
| [[[signed_int `long_`]] [`long`] [Generate a long integer]] |
| [[[signed_int `long_(num)`]] [`long`] [Generate `num` as long integer, |
| if an attribute is supplied it must match]] |
| [[[signed_int `long_long`]] [`long long`] [Generate a long long]] |
| [[[signed_int `long_long(num)`]] [`long long`] [Generate `num` as a long long, |
| if an attribute is supplied it must match]] |
| |
| [[[signed_int ``int_generator< |
| Num, Radix, force_sign |
| >()``]] |
| [`Num`] [Generate a `Num`]] |
| [[[signed_int ``int_generator< |
| Num, Radix, force_sign |
| >()(num)``]] |
| [`Num`] [Generate a `num` as a `Num`, |
| if an attribute is supplied it must match]] |
| ] |
| |
| [endsect] |
| |
| [section:unsigned_int Unsigned Integer Generators] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[unsigned_int `lit(num)`]] [`Unused`] [Generate `num`]] |
| [[[unsigned_int `ushort_`]] [`unsigned short`] [Generate an unsigned short integer]] |
| [[[unsigned_int `ushort_(num)`]] [`unsigned short`] [Generate `num` as an unsigned short integer, |
| if an attribute is supplied it must match]] |
| [[[unsigned_int `uint_`]] [`unsigned int`] [Generate an unsigned int]] |
| [[[unsigned_int `uint_(num)`]] [`unsigned int`] [Generate `num` as an unsigned int, |
| if an attribute is supplied it must match]] |
| [[[unsigned_int `ulong_`]] [`unsigned long`] [Generate an unsigned long integer]] |
| [[[unsigned_int `ulong_(num)`]] [`unsigned long`] [Generate `num` as an unsigned long integer, |
| if an attribute is supplied it must match]] |
| [[[unsigned_int `ulong_long`]] [`unsigned long long`] [Generate an unsigned long long]] |
| [[[unsigned_int `ulong_long(num)`]] [`unsigned long long`] [Generate `num` as an unsigned long long, |
| if an attribute is supplied it must match]] |
| [[[unsigned_int `bin`]] [`unsigned int`] [Generate a binary integer from an `unsigned int`]] |
| [[[unsigned_int `oct`]] [`unsigned int`] [Generate an octal integer from an `unsigned int`]] |
| [[[unsigned_int `hex`]] [`unsigned int`] [Generate a hexadecimal integer from an `unsigned int`]] |
| |
| [[[unsigned_int ``uint_generator< |
| Num, Radix |
| >()``]] |
| [`Num`] [Generate an unsigned `Num`]] |
| [[[unsigned_int ``uint_generator< |
| Num, Radix |
| >()(num)``]] |
| [`Num`] [Generate an unsigned `num` as a `Num`, |
| if an attribute is supplied it must match]] |
| ] |
| |
| [endsect] |
| |
| [section:boolean Boolean Generators] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[boolean `lit(num)`]] [`Unused`] [Generate `num`]] |
| [[[boolean `bool_`]] [`bool`] [Generate a boolean]] |
| [[[boolean `bool_(b)`]] [`bool`] [Generate `b` as a boolean, |
| if an attribute is supplied it must match]] |
| [[[boolean ``bool_generator< |
| B, Policies |
| >()``]] |
| [`B`] [Generate a boolean of type `B`]] |
| [[[boolean ``bool_generator< |
| B, Policies |
| >()(b)``]] |
| [`B`] [Generate a boolean `b` as a `B`, |
| if an attribute is supplied it must match]] |
| ] |
| |
| [endsect] |
| |
| [section:stream Stream Generators] |
| |
| See here for more information about [karma_stream Stream Generators]. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[karma_stream `stream`]] [`hold_any`] [Generate narrow character (`char`) based output |
| using the matching streaming `operator<<()`]] |
| [[[karma_stream `stream(s)`]] [`Unused`] [Generate narrow character (`char`) based output |
| from the immediate argument `s` using the matching |
| streaming `operator<<()`]] |
| [[[karma_stream `wstream`]] [`hold_any`] [Generate wide character (`wchar_t`) based output |
| using the matching streaming `operator<<()`]] |
| [[[karma_stream `wstream(s)`]] [`Unused`] [Generate wide character (`wchar_t`) based output |
| from the immediate argument `s` using the matching |
| streaming `operator<<()`]] |
| [ |
| [[karma_stream ``stream_generator< |
| Char |
| >()``]] [`hold_any`] [Generate output based on the given character type |
| (`Char`) using the matching streaming `operator<<()`]] |
| [ |
| [[karma_stream ``stream_generator< |
| Char |
| >()(s)``]] [`Unused`] [Generate output based on the given character type |
| `Char` from the immediate argument `s` using the |
| matching streaming `operator<<()`]] |
| ] |
| |
| [endsect] |
| |
| [section:binary Binary Generators] |
| |
| See here for more information about __karma_binary__. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[karma_native_binary `byte_`]] [8 bits native endian] [Generate an 8 bit binary]] |
| [[[karma_native_binary `word`]] [16 bits native endian] [Generate a 16 bit binary in native endian representation]] |
| [[[karma_big_binary `big_word`]] [16 bits big endian] [Generate a 16 bit binary in big endian representation]] |
| [[[karma_little_binary `little_word`]] [16 bits little endian] [Generate a 16 bit binary in little endian representation]] |
| [[[karma_native_binary `dword`]] [32 bits native endian] [Generate a 32 bit binary in native endian representation]] |
| [[[karma_big_binary `big_dword`]] [32 bits big endian] [Generate a 32 bit binary in big endian representation]] |
| [[[karma_little_binary `little_dword`]][32 bits little endian] [Generate a 32 bit binary in little endian representation]] |
| [[[karma_native_binary `qword`]] [64 bits native endian] [Generate a 64 bit binary in native endian representation]] |
| [[[karma_big_binary `big_qword`]] [64 bits big endian] [Generate a 64 bit binary in big endian representation]] |
| [[[karma_little_binary `little_qword`]][64 bits little endian] [Generate a 64 bit binary in little endian representation]] |
| [[`pad(num)`] [`Unused`] [Generate additional null bytes allowing to align generated |
| output with memory addresses divisible by `num`.]] |
| ] |
| |
| [endsect] |
| |
| [section:auxiliary Auxiliary Generators] |
| |
| See here for more information about __karma_auxiliary__. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[karma_attr_cast `attr_cast<Exposed>(a)`]] [`Exposed`] [Invoke `a` while supplying an attribute of type `Exposed`.]] |
| [[__karma_eol__] [`Unused`] [Generate the end of line (`\n`)]] |
| [[__karma_eps__] [`Unused`] [Generate an empty string]] |
| [[__karma_feps__] [`Unused`] [If `b` is true, generate an empty string]] |
| [[[karma_lazy `lazy(fg)`]] |
| [Attribute of `G` where `G` |
| is the return type of `fg`] [Invoke `fg` at generation time, returning a generator |
| `g` which is then called to generate.]] |
| [[[karma_lazy `fg`]] [see [karma_lazy `lazy(fg)`] above] [Equivalent to [karma_lazy `lazy(fg)`]]] |
| ] |
| |
| [endsect] |
| |
| [section:auto Auto Generators] |
| |
| See here for more information about [karma_auto Auto Generators]. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[karma_auto `auto_`]] [`hold_any`] [Generate output using a generator |
| created from the supplied attribute type |
| using the __create_generator__ API function.]] |
| ] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:operators Generator Operators] |
| |
| See here for more information about __karma_operator__. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[link spirit.karma.reference.operator.not_predicate `!a`]] |
| [`A`] [Not predicate. Ensure that `a` does not succeed |
| generating, but don't create any output]] |
| [[[link spirit.karma.reference.operator.not_predicate `&a`]] |
| [`A`] [And predicate. Ensure that `a` does succeed |
| generating, but don't create any output]] |
| [[[link spirit.karma.reference.operator.optional `-a`]] |
| [`optional<A>`] [Optional. Generate `a` zero or one time]] |
| [[[link spirit.karma.reference.operator.kleene `*a`]] |
| [`vector<A>`] [Kleene. Generate `a` zero or more times]] |
| [[[link spirit.karma.reference.operator.plus `+a`]] |
| [`vector<A>`] [Plus. Generate `a` one or more times]] |
| [[[link spirit.karma.reference.operator.alternative `a | b`]] |
| [`variant<A, B>`] [Alternative. Generate `a` or `b`]] |
| [[[link spirit.karma.reference.operator.sequence `a << b`]] |
| [`tuple<A, B>`] [Sequence. Generate `a` followed by `b`]] |
| [[[link spirit.karma.reference.operator.list `a % b`]] |
| [`vector<A>`] [List. Generate `a` delimited `b` one or more times]] |
| ] |
| |
| [:For more information about the attribute propagation rules implemented by the |
| compound generators please see __sec_karma_compound__.] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:directives Generator Directives] |
| |
| See here for more information about __karma_directive__. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[karma_upperlower `lower`]`[a]`] [`A`] [Generate `a` as lower case]] |
| [[[karma_upperlower `upper`]`[a]`] [`A`] [Generate `a` as upper case]] |
| |
| [[[karma_align `left_align`]`[a]`] [`A`] [Generate `a` left aligned in column of width |
| `BOOST_KARMA_DEFAULT_FIELD_LENGTH`]] |
| [[[karma_align `left_align`]`(num)[a]`] [`A`] [Generate `a` left aligned in column of width `num`]] |
| [[[karma_align `left_align`]`(g)[a]`] [`A`] [Generate `a` left aligned in column of width |
| `BOOST_KARMA_DEFAULT_FIELD_LENGTH` while using `g` to |
| generate the necessary padding]] |
| [[[karma_align `left_align`]`(num, g)[a]`][`A`] [Generate `a` left aligned in column of width `num` |
| while using `g` to generate the necessary |
| padding]] |
| |
| [[[karma_align `center`]`[a]`] [`A`] [Generate `a` centered in column of width |
| `BOOST_KARMA_DEFAULT_FIELD_LENGTH`]] |
| [[[karma_align `center`]`(num)[a]`] [`A`] [Generate `a` centered in column of width `num`]] |
| [[[karma_align `center`]`(g)[a]`] [`A`] [Generate `a` centered in column of width |
| `BOOST_KARMA_DEFAULT_FIELD_LENGTH` while using `g` to |
| generate the necessary padding]] |
| [[[karma_align `center`]`(num, g)[a]`] [`A`] [Generate `a` centered in column of width `num` |
| while using `g` to generate the necessary |
| padding]] |
| |
| [[[karma_align `right_align`]`[a]`] [`A`] [Generate `a` right aligned in column of width |
| `BOOST_KARMA_DEFAULT_FIELD_LENGTH`]] |
| [[[karma_align `right_align`]`(num)[a]`] [`A`] [Generate `a` right aligned in column of width `num`]] |
| [[[karma_align `right_align`]`(g)[a]`] [`A`] [Generate `a` right aligned in column of width |
| `BOOST_KARMA_DEFAULT_FIELD_LENGTH` while using `g` to |
| generate the necessary padding]] |
| [[[karma_align `right_align`]`(num, g)[a]`][`A`][Generate `a` right aligned in column of width `num` |
| while using `g` to generate the necessary |
| padding]] |
| |
| [[[karma_maxwidth `maxwidth`]`[a]`] [`A`] [Generate `a` truncated to column of width |
| `BOOST_KARMA_DEFAULT_FIELD_MAXWIDTH`]] |
| [[[karma_maxwidth `maxwidth`]`(num)[a]`] [`A`] [Generate `a` truncated to column of width `num`]] |
| |
| [[[karma_repeat `repeat`]`[a]`] [`vector<A>`] [Repeat `a` zero or more times]] |
| [[[karma_repeat `repeat`]`(num)[a]`] [`vector<A>`] [Repeat `a` `num` times]] |
| [[[karma_repeat `repeat`]`(num1, num2)[a]`] [`vector<A>`] [Repeat `a` `num1` to `num2` times]] |
| [[[karma_repeat `repeat`]`(num, inf)[a]`] [`vector<A>`] [Repeat `a` `num` or more times]] |
| |
| [[__karma_verbatim__`[a]`][`A`] [Disable delimited generation for `a`. Performs post delimiting.]] |
| [[[karma_delimit `delimit`]`[a]`] [`A`] [Reestablish the delimiter that got inhibited by verbatim]] |
| [[[karma_delimit `delimit`]`(d)[a]`] [`A`] [Use `d` as a delimiter for generating `a`]] |
| [[[karma_no_delimit `no_delimit`]`[a]`] [`A`] [Disable delimited generation for `a`. No post-delimiting step performed.]] |
| |
| [[__karma_omit__`[a]`] [`A`] [Consume the attribute type of `a` without generating anything. |
| The embedded generator will be always executed.]] |
| [[__karma_skip__`[a]`] [`A`] [Consume the attribute type of `a` without generating anything. |
| The embedded generator will never be executed.]] |
| |
| [[__karma_duplicate__`[a]`] [`A`] [The supplied attribute will be duplicated and passed unchanged to |
| all embedded elements of a sequence.]] |
| |
| [[__karma_buffer__`[a]`][`A`] [Temporarily intercept the output generated by `a`, |
| flushing it only after `a` succeeded]] |
| |
| [[[karma_columns `columns`]`[a]`] [`A`] [Generate `a` split into |
| `BOOST_KARMA_DEFAULT_COLUMNS` number of columns using |
| `karma::eol` as column delimiter]] |
| [[[karma_columns `columns`]`(num)[a]`] [`A`] [Generate `a` split into |
| `num` number of columns using |
| `karma::eol` as column delimiter]] |
| [[[karma_columns `columns`]`(g)[a]`] [`A`] [Generate `a` split into |
| `BOOST_KARMA_DEFAULT_COLUMNS` number of columns using |
| `g` as column delimiter]] |
| [[[karma_columns `columns`]`(num, g)[a]`][`A`][Generate `a` split into |
| `num` number of columns using |
| `g` as column delimiter]] |
| ] |
| |
| [endsect] |
| |
| [section:action Generator Semantic Actions] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[`g[fa]`] [Attribute of `g`] [Call semantic action `fa` before invoking `g`]] |
| ] |
| |
| [endsect] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section Compound Attribute Rules] |
| |
| [heading Notation] |
| |
| The notation we use is of the form: |
| |
| a: A, b: B, ... --> composite-expression: composite-attribute |
| |
| `a`, `b`, etc. are the operands. `A`, `B`, etc. are the operand's |
| attribute types. `composite-expression` is the expression involving the |
| operands and `composite-attribute` is the resulting attribute type of |
| the composite expression. |
| |
| For instance: |
| |
| a: A, b: B --> (a << b): tuple<A, B> |
| |
| which reads as: given, `a` and `b` are generators, and `A` is the type |
| of the attribute of `a`, and `B` is the type of the attribute of `b`, then the |
| type of the attribute of `a << b` will be `tuple<A, B>`. |
| |
| [important In the attribute tables, we will use `vector<A>` and |
| `tuple<A, B...>` as placeholders only. The notation of `vector<A>` |
| stands for ['any __stl__ container] holding elements of type `A` and the |
| notation `tuple<A, B...>` stands for ['any __fusion__ sequence] holding |
| `A`, `B`, ... etc. elements. The notation of `variant<A, B, ...>` stands for |
| ['a __boost_variant__] capable of holding `A`, `B`, ... etc. elements. Finally, |
| `Unused` stands for __unused_type__. ] |
| |
| [heading Compound Generator Attribute Types] |
| |
| [table |
| [[Expression] [Attribute]] |
| |
| [[__karma_sequence__] |
| [``a: A, b: B --> (a << b): tuple<A, B> |
| a: A, b: Unused --> (a << b): A |
| a: Unused, b: B --> (a << b): B |
| a: Unused, b: Unused --> (a << b): Unused |
| |
| a: A, b: A --> (a << b): vector<A> |
| a: vector<A>, b: A --> (a << b): vector<A> |
| a: A, b: vector<A> --> (a << b): vector<A> |
| a: vector<A>, b: vector<A> --> (a << b): vector<A>``]] |
| |
| [[__karma_alternative__] |
| [``a: A, b: B --> (a | b): variant<A, B> |
| a: A, b: Unused --> (a | b): A |
| a: Unused, b: B --> (a | b): B |
| a: Unused, b: Unused --> (a | b): Unused |
| a: A, b: A --> (a | b): A``]] |
| |
| [[[karma_kleene Kleene (unary `*`)]] |
| [``a: A --> *a: vector<A> |
| a: Unused --> *a: Unused``]] |
| [[__karma_plus__] |
| [``a: A --> +a: vector<A> |
| a: Unused --> +a: Unused``]] |
| |
| [[__karma_list__] |
| [``a: A, b: B --> (a % b): vector<A> |
| a: Unused, b: B --> (a % b): Unused``]] |
| |
| [[[karma_repeat Repetition]] |
| [``a: A --> repeat(...,...)[a]: vector<A> |
| a: Unused --> repeat(...,...)[a]: Unused``]] |
| |
| [[__karma_optional__] |
| [``a: A --> -a: optional<A> |
| a: Unused --> -a: Unused``]] |
| |
| [[__karma_and_predicate__] [`a: A --> &a: A`]] |
| [[__karma_not_predicate__] [`a: A --> !a: A`]] |
| ] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:non_terminals Nonterminals] |
| |
| See here for more information about __karma_nonterminal__. |
| |
| [variablelist Notation |
| [[`RT`] [Synthesized attribute. The rule or grammar's return type.]] |
| [[`Arg1`, `Arg2`, `ArgN`] [Inherited attributes. Zero or more arguments.]] |
| [[`L1`, `L2`, `LN`] [Zero or more local variables.]] |
| [[`r, r2`] [Rules]] |
| [[`g`] [A grammar]] |
| [[`p`] [A generator expression]] |
| [[`my_grammar`] [A user defined grammar]] |
| ] |
| |
| [variablelist Terminology |
| [[Signature] [`RT(Arg1, Arg2, ... ,ArgN)`. The signature specifies |
| the synthesized (return value) and inherited (arguments) |
| attributes.]] |
| [[Locals] [`locals<L1, L2, ..., LN>`. The local variables.]] |
| [[Delimiter] [The delimit-generator type]] |
| ] |
| |
| [variablelist Template Arguments |
| [[`Iterator`] [The iterator type you will use for parsing.]] |
| [[`A1`, `A2`, `A3`] [Can be one of 1) Signature 2) Locals 3) Delimiter.]] |
| ] |
| |
| [table |
| [[Expression] [Description]] |
| [[`rule<OutputIterator, A1, A2, A3> r(name);`] [Rule declaration. `OutputIterator` is required. |
| `A1, A2, A3` are optional and can be specified in any order. |
| `name` is an optional string that gives the rule |
| its name, useful for debugging.]] |
| [[`rule<OutputIterator, A1, A2, A3> r(r2);`] [Copy construct rule `r` from rule `r2`.]] |
| [[`r = r2;`] [Assign rule `r2` to `r`. `boost::shared_ptr` semantics.]] |
| [[`r.alias()`] [Return an alias of `r`. The alias is a generator that |
| holds a reference to `r`. Reference semantics.]] |
| [[`r.copy()`] [Get a copy of `r`.]] |
| [[`r.name(name)`] [Set the name of a rule]] |
| [[`r.name()`] [Get the name of a rule]] |
| [[debug(r)] [Debug rule `r`]] |
| [[`r = g;`] [Rule definition]] |
| [[`r %= g;`] [Auto-rule definition. The attribute of `g` should be |
| compatible with the synthesized attribute of `r`. When `g` |
| is successful, its attribute is automatically propagated |
| to `r`'s synthesized attribute.]] |
| |
| [[ |
| `` |
| template <typename OutputIterator> |
| struct my_grammar : grammar<OutputIterator, A1, A2, A3> |
| { |
| my_grammar() : my_grammar::base_type(start, name) |
| { |
| // Rule definitions |
| start = /* ... */; |
| } |
| |
| rule<OutputIterator, A1, A2, A3> start; |
| // more rule declarations... |
| }; |
| `` |
| ] [Grammar definition. `name` is an optional string that gives the |
| grammar its name, useful for debugging.]] |
| [[my_grammar<OutputIterator> g] [Instantiate a grammar]] |
| [[`g.name(name)`] [Set the name of a grammar]] |
| [[`g.name()`] [Get the name of a grammar]] |
| ] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section Semantic Actions] |
| |
| Semantic Actions may be attached to any generator as follows: |
| |
| g[f] |
| |
| where `f` is a function with the signatures: |
| |
| void f(Attrib&); |
| void f(Attrib&, Context&); |
| void f(Attrib&, Context&, bool&); |
| |
| You can use __boost_bind__ to bind member functions. For function |
| objects, the allowed signatures are: |
| |
| void operator()(Attrib&, unused_type, unused_type) const; |
| void operator()(Attrib&, Context&, unused_type) const; |
| void operator()(Attrib&, Context&, bool&) const; |
| |
| The `unused_type` is used in the signatures above to signify 'don't |
| care'. |
| |
| For more information see __karma_actions__. |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section Phoenix] |
| |
| __boost_phoenix__ makes it easier to attach semantic actions. You just |
| inline your lambda expressions: |
| |
| g[phoenix-lambda-expression] |
| |
| __karma__ provides some __boost_phoenix__ placeholders to access important |
| information from the `Attrib` and `Context` that are otherwise fiddly to extract. |
| |
| [variablelist Spirit.Karma specific Phoenix placeholders |
| [[`_1, _2, ... , _N`] [Nth attribute of `g`]] |
| [[`_val`] [The enclosing rule's synthesized attribute.]] |
| [[`_r1, _r2, ... , _rN`] [The enclosing rule's Nth inherited attribute.]] |
| [[`_a, _b, ... , _j`] [The enclosing rule's local variables (`_a` refers to the first).]] |
| [[`_pass`] [Assign `false` to `_pass` to force a generator failure.]] |
| ] |
| |
| [important All placeholders mentioned above are defined in the namespace |
| `boost::spirit` and, for your convenience, are available in the |
| namespace `boost::spirit::karma` as well.] |
| |
| For more information see __karma_actions__. |
| |
| [endsect] |
| |
| |