| [/============================================================================== |
| 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) |
| ===============================================================================/] |
| |
| [section Nonterminal] |
| |
| [heading Module Headers] |
| |
| // forwards to <boost/spirit/home/qi/nonterminal.hpp> |
| #include <boost/spirit/include/qi_nonterminal.hpp> |
| |
| Also, see __include_structure__. |
| |
| [/------------------------------------------------------------------------------] |
| [section Rule] |
| |
| [heading Description] |
| |
| The rule is a polymorphic parser that acts as a named placeholder |
| capturing the behavior of a __peg__ expression assigned to it. Naming a |
| __peg__ expression allows it to be referenced later and makes it |
| possible for the rule to call itself. This is one of the most important |
| mechanisms and the reason behind the word "recursive" in recursive |
| descent parsing. |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/qi/nonterminal/rule.hpp> |
| #include <boost/spirit/include/qi_rule.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::qi::rule`]] |
| ] |
| |
| [heading Synopsis] |
| |
| template <typename Iterator, typename A1, typename A2, typename A3> |
| struct rule; |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Iterator`] [The underlying iterator |
| type that the rule is |
| expected to work on.] [none]] |
| [[`A1`, `A2`, `A3`] [Either `Signature`, |
| `Skipper` or `Locals` in |
| any order. See table below.] [See table below.]] |
| ] |
| |
| Here is more information about the template parameters: |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Signature`] [Specifies the rule's synthesized |
| (return value) and inherited |
| attributes (arguments). More on |
| this here: __qi_nonterminal__.] [__unused_type__. |
| When `Signature` defaults |
| to __unused_type__, the effect |
| is the same as specifying a signature |
| of `void()` which is also equivalent |
| to `unused_type()`]] |
| [[`Skipper`] [Specifies the rule's skipper |
| parser. Specify this if you |
| want the rule to skip white |
| spaces. If this is not specified, |
| the rule is an "implicit lexeme" |
| and will not skip spaces. |
| "implicit lexeme" rules can |
| still be called with a skipper. |
| In such a case, the rule does a |
| pre-skip just as all lexemes |
| and primitives do.] [__unused_type__]] |
| [[`Locals`] [Specifies the rule's local |
| variables. |
| See __qi_nonterminal__.] [__unused_type__]] |
| ] |
| |
| [heading Model of] |
| |
| [:__qi_nonterminal__] |
| |
| [variablelist Notation |
| [[`r, r2`] [Rules]] |
| [[`p`] [A parser expression]] |
| [[`Iterator`] [The underlying iterator type that the rule is |
| expected to work on.]] |
| [[`A1`, `A2`, `A3`] [Either `Signature`, `Skipper` or `Locals` in |
| any order.]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __qi_nonterminal__. |
| |
| [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`.]] |
| [[`r.copy()`] [Get a copy of `r`.]] |
| [[`r = p;`] [Rule definition. This is equivalent to `r %= p` |
| (see below) if there are no semantic actions attached |
| anywhere in `p`.]] |
| [[`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.]] |
| ] |
| |
| [heading Attributes] |
| |
| [:The parser attribute of the rule is `T`, its synthesized attribute. See |
| __qi_nonterminal_attribute__] |
| |
| [heading Complexity] |
| |
| [:The complexity is defined by the complexity of the RHS parser, `p`] |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __qi_basics_examples__ section.] |
| |
| [reference_rule] |
| |
| [endsect] [/ Rule] |
| |
| [/------------------------------------------------------------------------------] |
| [section Grammar] |
| |
| [heading Description] |
| |
| The grammar encapsulates a set of __qi_rules__ (as well as primitive |
| parsers (__primitive_parser_concept__) and sub-grammars). The grammar is |
| the main mechanism for modularization and composition. Grammars can be |
| composed to form more complex grammars. |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/qi/nonterminal/grammar.hpp> |
| #include <boost/spirit/include/qi_grammar.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::qi::grammar`]] |
| ] |
| |
| [heading Synopsis] |
| |
| template <typename Iterator, typename A1, typename A2, typename A3> |
| struct grammar; |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Iterator`] [The underlying iterator |
| type that the rule is |
| expected to work on.] [none]] |
| [[`A1`, `A2`, `A3`] [Either `Signature`, |
| `Skipper` or `Locals` in |
| any order. See table below.] [See table below.]] |
| ] |
| |
| Here is more information about the template parameters: |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Signature`] [Specifies the grammar's synthesized |
| (return value) and inherited |
| attributes (arguments). More on |
| this here: __qi_nonterminal__.] [__unused_type__. |
| When `Signature` defaults |
| to __unused_type__, the effect |
| is the same as specifying a signature |
| of `void()` which is also equivalent |
| to `unused_type()`]] |
| [[`Skipper`] [Specifies the grammar's skipper |
| parser. Specify this if you |
| want the grammar to skip white |
| spaces.] [__unused_type__]] |
| [[`Locals`] [Specifies the grammar's local |
| variables. See __qi_nonterminal__.] [__unused_type__]] |
| ] |
| |
| [heading Model of] |
| |
| [:__qi_nonterminal__] |
| |
| [variablelist Notation |
| [[`g`] [A grammar]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is not |
| defined in __qi_nonterminal__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[ |
| `` |
| 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.]] |
| ] |
| |
| [note The template parameters of a grammar and its start rule (the rule passed |
| to the grammar's base class constructor) must match, otherwise you will |
| see compilation errors.] |
| |
| [heading Attributes] |
| |
| [:The parser attribute of the grammar is `T`, its synthesized attribute. See |
| __qi_nonterminal_attribute__] |
| |
| [heading Complexity] |
| |
| [:The complexity is defined by the complexity of the its definition.] |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __qi_basics_examples__ section.] |
| |
| [reference_grammar_using] |
| |
| [reference_grammar_definition] |
| |
| [reference_grammar] |
| |
| [endsect] [/ Grammar] |
| |
| [endsect] [/ Nonterminal] |