| [/============================================================================== |
| 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 a sort of a "cheat-sheet" on the most commonly used Qi |
| 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 and pages of reference documentation. |
| |
| [section Common Notation] |
| |
| [variablelist Notation |
| [[`P`] [Parser type]] |
| [[`p, a, b, c`] [Parser objects]] |
| [[`A, B, C`] [Attribute types of parsers `a`, `b` and `c`]] |
| [[`I`] [The iterator type used for parsing]] |
| [[`Unused`] [An `unused_type`]] |
| [[`Context`] [The enclosing rule's `Context` type]] |
| [[`attrib`] [An attribute value]] |
| [[`Attrib`] [An attribute type]] |
| [[`b`] [A boolean expression]] |
| [[`fp`] [A (lazy parser) function with signature `P(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 parse to fail. Both `Context` and the boolean flag are |
| optional.]] |
| [[`first`] [An iterator pointing to the start of input]] |
| [[`last`] [An iterator pointing to the end of input]] |
| [[`Ch`] [Character-class specific character type (See __char_class_types__)]] |
| [[`ch`] [Character-class specific character (See __char_class_types__)]] |
| [[`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`]] |
| [[`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:qi_parsers Qi Parsers] |
| |
| [section:char Character Parsers] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[qi_lit_string `ch`]] [`Unused`] [Matches `ch`]] |
| [[[qi_lit_string `lit(ch)`]][`Unused`] [Matches `ch`]] |
| [[`char_`] [`Ch`] [Matches any character]] |
| [[`char_(ch)`] [`Ch`] [Matches `ch`]] |
| [[`char_("c")`] [`Ch`] [Matches a single char string literal, `c`]] |
| [[`char_(ch, ch2)`] [`Ch`] [Matches a range of chars from `ch` to `ch2` (inclusive)]] |
| [[`char_(charset)`] [`Ch`] [Matches a character set `charset`]] |
| |
| [[`alnum`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isalnum` in the current character set]] |
| [[`alpha`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isalpha` in the current character set]] |
| [[`blank`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isblank` in the current character set]] |
| [[`cntrl`] [`Ch`] [Matches a character based on the equivalent of |
| `std::iscntrl` in the current character set]] |
| [[`digit`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isdigit` in the current character set]] |
| [[`graph`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isgraph` in the current character set]] |
| [[`print`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isprint` in the current character set]] |
| [[`punct`] [`Ch`] [Matches a character based on the equivalent of |
| `std::ispunct` in the current character set]] |
| [[`space`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isspace` in the current character set]] |
| [[`xdigit`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isxdigit` in the current character set]] |
| [[`lower`] [`Ch`] [Matches a character based on the equivalent of |
| `std::islower` in the current character set]] |
| [[`upper`] [`Ch`] [Matches a character based on the equivalent of |
| `std::isupper` in the current character set]] |
| ] |
| |
| [endsect] |
| [section:numeric Numeric Parsers] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[`float_`] [`float`] [Parse a floating point number into a `float`]] |
| [[`double_`] [`double`] [Parse a floating point number into a `double`]] |
| [[`long_double`] [`long double`] [Parse a floating point number into a `long double`]] |
| |
| [[`bin`] [`unsigned`] [Parse a binary integer into an `unsigned`]] |
| [[`oct`] [`unsigned`] [Parse an octal integer into an `unsigned`]] |
| [[`hex`] [`unsigned`] [Parse a hexadecimal integer into an `unsigned`]] |
| [[`ushort_`] [`unsigned short`] [Parse an unsigned short integer]] |
| [[`ulong_`] [`unsigned long`] [Parse an unsigned long integer]] |
| [[`uint_`] [`unsigned int`] [Parse an unsigned int]] |
| [[`ulong_long`] [`unsigned long long`] [Parse an unsigned long long]] |
| [[`short_`] [`short`] [Parse a short integer]] |
| [[`long_`] [`long`] [Parse a long integer]] |
| [[`int_`] [`int`] [Parse an int]] |
| [[`long_long`] [`long long`] [Parse a long long]] |
| ] |
| |
| [endsect] |
| [section:string String Parsers] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[qi_lit_string `str`]] [`Unused`] [Matches `str`]] |
| [[[qi_lit_string `lit(str)`]] [`Unused`] [Matches `str`]] |
| [[[qi_lit_string `string(str)`]] [`Str`] [Matches `str`]] |
| |
| [[__qi_symbols__] [N/A] [Declare a symbol table, `sym`. `Ch` is the |
| underlying char type of the symbol table keys. |
| `T` is the data type associated with each key.]] |
| [[ |
| `` |
| sym.add |
| (str1, val1) |
| (str2, 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`] [Matches entries in the symbol table, `sym`. If |
| successful, returns the data associated with |
| the key]] |
| ] |
| |
| [endsect] |
| [section:auxiliary Auxiliary Parsers] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[__qi_eol__] [`Unused`] [Matches the end of line (`\r` or `\n` or `\r\n`)]] |
| [[__qi_eoi__] [`Unused`] [Matches the end of input (first == last)]] |
| [[__qi_eps__] [`Unused`] [Match an empty string]] |
| [[__qi_eps__`(b)`] [`Unused`] [If `b` is true, match an empty string]] |
| [[__qi_lazy__`(fp)`] [Attribute of `P` where `P` |
| is the return type of `fp`] [Invoke `fp` at parse time, returning a parser |
| `p` which is then called to parse.]] |
| [[`fp`] [see `lazy(fp)` above] [Equivalent to `lazy(fp)`]] |
| [[__qi_attr__] [`Attrib`] [Doesn't consume/parse any input, but exposes the |
| argument `attrib` as its attribute.]] |
| ] |
| |
| [endsect] |
| [section:binary Binary Parsers] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[`byte_`] [8 bits native endian] [Matches an 8 bit binary]] |
| [[`word`] [16 bits native endian] [Matches a 16 bit binary]] |
| [[`big_word`] [16 bits big endian] [Matches a 16 bit binary]] |
| [[`little_word`] [16 bits little endian] [Matches a 16 bit binary]] |
| [[`dword`] [32 bits native endian] [Matches a 32 bit binary]] |
| [[`big_dword`] [32 bits big endian] [Matches a 32 bit binary]] |
| [[`little_dword`] [32 bits little endian] [Matches a 32 bit binary]] |
| [[`qword`] [64 bits native endian] [Matches a 64 bit binary]] |
| [[`big_qword`] [64 bits big endian] [Matches a 64 bit binary]] |
| [[`little_qword`] [64 bits little endian] [Matches a 64 bit binary]] |
| ] |
| |
| [endsect] |
| |
| [section:auto Auto Parsers] |
| |
| See here for more information about [qi_auto Auto Parsers]. |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[[qi_auto `auto_`]] [`hold_any`] [Parse input using a parser |
| created from the supplied attribute type |
| using the __create_parser__ API function.]] |
| ] |
| |
| [endsect] |
| |
| [section:directive Parser Directives] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[__qi_lexeme__`[a]`] [`A`] [Disable skip parsing for `a`, does pre-skipping]] |
| [[[qi_no_skip `no_skip[a]`]] [`A`] [Disable skip parsing for `a`, no pre-skipping]] |
| [[__qi_no_case__`[a]`] [`A`] [Inhibits case-sensitivity for `a`]] |
| [[__qi_omit__`[a]`] [`Unused`] [Ignores the attribute type of `a`]] |
| [[__qi_matches__`[a]`] [`bool`] [Return if the embedded parser `a` matched its input]] |
| |
| [[__qi_raw__`[a]`] [__boost_iterator_range__`<I>`] [Presents the transduction of `a` as an iterator range]] |
| |
| [[[qi_repeat `repeat[a]`]] [`vector<A>`] [Repeat `a` zero or more times]] |
| [[[qi_repeat `repeat(N)[a]`]] [`vector<A>`] [Repeat `a` `N` times]] |
| [[[qi_repeat `repeat(N, M)[a]`]] [`vector<A>`] [Repeat `a` `N` to `M` times]] |
| [[[qi_repeat `repeat(N, inf)[a]`]] [`vector<A>`] [Repeat `a` `N` or more times]] |
| |
| [[__qi_skip__`[a]`] [`A`] [Re-establish the skipper that got inhibited by lexeme or no_skip.]] |
| [[__qi_skip__`(p)[a]`] [`A`] [Use `p` as a skipper for parsing `a`]] |
| ] |
| |
| [endsect] |
| [section:operator Parser Operators] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[`!a`] [`Unused`] [Not predicate. If the predicate `a` matches, |
| fail. Otherwise, return a zero length match.]] |
| [[`&a`] [`Unused`] [And predicate. If the predicate `a` matches, |
| return a zero length match. Otherwise, fail.]] |
| [[`-a`] [`optional<A>`] [Optional. Parse `a` zero or one time]] |
| [[`*a`] [`vector<A>`] [Kleene. Parse `a` zero or more times]] |
| [[`+a`] [`vector<A>`] [Plus. Parse `a` one or more times]] |
| [[`a | b`] [`variant<A, B>`] [Alternative. Parse `a` or `b`]] |
| [[`a >> b`] [`tuple<A, B>`] [Sequence. Parse `a` followed by `b`]] |
| [[`a > b`] [`tuple<A, B>`] [Expect. Parse `a` followed by `b`. `b` is |
| expected to match when `a` matches, otherwise, |
| an `expectation_failure` is thrown.]] |
| [[`a - b`] [`A`] [Difference. Parse `a` but not `b`]] |
| [[`a || b`] [`tuple<` |
| `optional<A>,` |
| `optional<B> >` |
| ] [Sequential Or. Parse `a` or `b` or `a` followed by `b`]] |
| [[`a % b`] [`vector<A>`] [List. Parse `a` delimited `b` one or more times]] |
| [[`a ^ b`] [`tuple<` |
| `optional<A>,` |
| `optional<B> >` |
| ] [Permutation. Parse `a` or `b` or `a` followed by `b` or `b` followed by `a`.]] |
| ] |
| |
| [endsect] |
| [section:action Parser Semantic Actions] |
| |
| [table |
| [[Expression] [Attribute] [Description]] |
| [[`p[fa]`] [Attribute of `p`] [Call semantic action, `fa` if p succeeds.]] |
| ] |
| |
| [endsect] |
| [endsect] |
| [section Compound Attribute Rules] |
| |
| [heading Notation] |
| |
| The notation we will use will be 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> |
| |
| reads as: given, `a` and `b` are parsers, 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. Finally, `Unused` stands for |
| __unused_type__. ] |
| |
| [heading Compound Parser Attribute Types] |
| |
| [table |
| [[Expression] [Attribute]] |
| |
| [[`a >> b`] |
| [``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>``]] |
| |
| [[`a > b`] |
| [``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>``]] |
| |
| [[`a | b`] |
| [``a: A, b: B --> (a | b): variant<A, B> |
| a: A, b: Unused --> (a | b): optional<A> |
| a: A, b: B, c: Unused --> (a | b | c): optional<variant<A, B> > |
| a: Unused, b: B --> (a | b): optional<B> |
| a: Unused, b: Unused --> (a | b): Unused |
| a: A, b: A --> (a | b): A``]] |
| |
| [[`a - b`] |
| [``a: A, b: B --> (a - b): A |
| a: Unused, b: B --> (a - b): Unused``]] |
| |
| [[`*a`] |
| [``a: A --> *a: vector<A> |
| a: Unused --> *a: Unused``]] |
| [[`+a`] |
| [``a: A --> +a: vector<A> |
| a: Unused --> +a: Unused``]] |
| |
| [[`a % b`] |
| [``a: A, b: B --> (a % b): vector<A> |
| a: Unused, b: B --> (a % b): Unused``]] |
| |
| [[`repeat(...,...)[a]`] |
| [``a: A --> repeat(...,...)[a]: vector<A> |
| a: Unused --> repeat(...,...)[a]: Unused``]] |
| |
| [[`a || b`] |
| [``a: A, b: B --> (a || b): tuple<optional<A>, optional<B> > |
| a: A, b: Unused --> (a || b): optional<A> |
| a: Unused, b: B --> (a || b): optional<B> |
| a: Unused, b: Unused --> (a || b): Unused |
| |
| a: A, b: A --> (a || b): vector<optional<A> >``]] |
| |
| [[`-a`] |
| [``a: A --> -a: optional<A> |
| a: Unused --> -a: Unused``]] |
| |
| [[`&a`] [`a: A --> &a: Unused`]] |
| [[`!b`] [`a: A --> !a: Unused`]] |
| |
| [[`a ^ b`] |
| [``a: A, b: B --> (a ^ b): tuple<optional<A>, optional<B> > |
| a: A, b: Unused --> (a ^ b): optional<A> |
| a: Unused, b: B --> (a ^ b): optional<B> |
| a: Unused, b: Unused --> (a ^ b): Unused``]] |
| |
| ] |
| |
| [endsect] |
| |
| [section:non_terminals Nonterminals] |
| |
| [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 parser 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.]] |
| [[Skipper] [The skip-parser 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) Skipper.]] |
| ] |
| |
| [table |
| [[Expression] [Description]] |
| [[`rule<Iterator, A1, A2, A3> r(name);`] [Rule declaration. `Iterator` 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 and error handling.]] |
| [[`rule<Iterator, A1, A2, A3> r(r2);`] [Copy construct rule `r` from rule `r2`.]] |
| [[`r = r2;`] [Assign rule `r2` to `r`.]] |
| [[`r.alias()`] [return an alias of `r`. The alias is a parser that |
| holds a reference to `r`. Reference semantics.]] |
| [[`r.copy()`] [Get a copy of `r`.]] |
| [[`r.name(name)`] [Naming a rule]] |
| [[`r.name()`] [Getting the name of a rule]] |
| [[debug(r)] [Debug rule `r`]] |
| [[`r = p;`] [Rule definition]] |
| [[`r %= p;`] [Auto-rule definition. The attribute of `p` should be |
| compatible with the synthesized attribute of `r`. When `p` |
| is successful, its attribute is automatically propagated |
| to `r`'s synthesized attribute.]] |
| |
| [[ |
| `` |
| template <typename Iterator> |
| struct my_grammar : grammar<Iterator, A1, A2, A3> |
| { |
| my_grammar() : my_grammar::base_type(start, name) |
| { |
| // Rule definitions |
| start = /* ... */; |
| } |
| |
| rule<Iterator, A1, A2, A3> start; |
| // more rule declarations... |
| }; |
| `` |
| ] [Grammar definition. `name` is an optional string that gives the |
| grammar its name, useful for debugging and error handling.]] |
| [[`g.name(name)`] [Naming a grammar]] |
| [[`g.name()`] [Getting the name of a grammar]] |
| ] |
| |
| [endsect] |
| [section Semantic Actions] |
| |
| Has the form: |
| |
| p[f] |
| |
| where `f` is a function with the signatures: |
| |
| void f(Attrib const&); |
| void f(Attrib const&, Context&); |
| void f(Attrib const&, Context&, bool&); |
| |
| You can use __boost_bind__ to bind member functions. For function |
| objects, the allowed signatures are: |
| |
| void operator()(Attrib const&, unused_type, unused_type) const; |
| void operator()(Attrib const&, Context&, unused_type) const; |
| void operator()(Attrib const&, Context&, bool&) const; |
| |
| The `unused_type` is used in the signatures above to signify 'don't |
| care'. |
| |
| For more detailed information about semantic actions see: |
| [link spirit.qi.tutorials.semantic_actions here]. |
| |
| [endsect] |
| [section Phoenix] |
| |
| __boost_phoenix__ makes it easier to attach semantic actions. You just |
| inline your lambda expressions: |
| |
| p[phoenix-lambda-expression] |
| |
| Spirit.Qi provides some __boost_phoenix__ placeholders to important |
| information from the `Attrib` and `Context` that are otherwise fiddly to extract. |
| |
| [variablelist Spirit.Qi specific Phoenix placeholders |
| [[`_1, _2... , _N`] [Nth attribute of `p`]] |
| [[`_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 parser failure.]] |
| ] |
| |
| [important All placeholders mentioned above are defined in the namespace |
| `boost::spirit` and, for your convenience, are available in the |
| namespace `boost::spirit::qi` as well.] |
| |
| For more detailed information about semantic actions see: |
| [link spirit.qi.tutorials.semantic_actions here]. |
| |
| [endsect] |