Update of /cvsroot/boost/boost/libs/spirit/doc
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv9824/libs/spirit/doc

Modified Files:
      Tag: SPIRIT_RC_1_8_5
        faq.html trees.html 
Log Message:
recent changes to HEAD revision


Index: faq.html
===================================================================
RCS file: /cvsroot/boost/boost/libs/spirit/doc/faq.html,v
retrieving revision 1.26
retrieving revision 1.26.4.1
diff -u -d -r1.26 -r1.26.4.1
--- faq.html    8 Dec 2005 04:19:10 -0000       1.26
+++ faq.html    31 Jan 2007 11:04:11 -0000      1.26.4.1
@@ -26,6 +26,7 @@
 <ul>
   <li><a href="#scanner_business">The Scanner Business</a></li>
   <li><a href="#left_recursion">Eliminating Left Recursion</a> </li>
+  <li><a href="#right_associativity">Implementing Right Associativity</a></li>
   <li><a href="#lexeme_and_rules">The lexeme_d directive and rules</a></li>
   <li><a href="#kleene_star">Kleene Star infinite loop</a></li>
   <li><a href="#CVS">Boost CVS and Spirit CVS</a></li>
@@ -147,6 +148,50 @@
 <pre>    <span class=identifier>a </span><span class=special>= </span><span 
class=identifier>b </span><span class=special>&gt;&gt; *(</span><span 
class=identifier>op </span><span class=special>&gt;&gt; </span><span 
class=identifier>b</span><span class=special>);</span></pre>
 <p><span class=special></span>in Spirit. What could be simpler? Look Ma, no 
recursion,
   just iteration.</p>
+<p><b> <a name="right_associativity" id="right_associativity"></a> 
Implementing Right Associativity </b></p>
+<p> <font color="#FF0000">Question:</font> I tried adding <tt>'^'</tt> as an 
operator to compute the power to a calculator grammer. The following code
+</p>
+<pre>    <span class=identifier>pow_expression 
+    </span><span class=special>= </span><span class=identifier>pow_operand 
</span><span class=special>&gt;&gt; </span><span class=special>*( </span><span 
class=literal>'^' </span><span class=special>&gt;&gt; </span><span 
class=identifier>pow_operand </span><span class=special>[ </span><span 
class=special>&amp; </span><span class=identifier>do_pow </span><span 
class=special>]
+                      </span><span class=special>)
+    </span><span class=special>;</span>
+</pre>
+<p>parses the input correctly, but I want the operator to be evalutated from 
right to left. In other words, the expression <tt>2^3^4</tt> is supposed to 
have the same semantics as <tt>2^(3^4)</tt> instead of <tt>(2^3)^4</tt>. How do 
I do it?
+</p>
+<p> The "textbook recipe" for Right Associativity is Right Recursion. In BNF 
that means:
+<pre>    &lt;pow_expression&gt; ::=  &lt;pow_operand&gt; '^' 
&lt;pow_expression&gt; | &lt;pow_operand&gt;
+</pre>
+<p>But we better don't take the theory too literally here, because if the 
first alternative fails, the semantic actions within <tt>pow_operand</tt> might 
have been executed already and will then be executed again when trying the 
second alternative. So let's apply Left Factorization to factor out 
<tt>pow_operand</tt>:
+<pre>    &lt;pow_expression&gt; ::=  &lt;pow_operand&gt; 
&lt;pow_expression_helper&gt;
+    &lt;pow_expression_helper&gt; ::= '^' &lt;pow_expression&gt; | 
<i>&#949;</i> 
+</pre>
+<p>The production <tt>pow_expression_helper</tt> matches the empty string 
<i>&#949;</i>, so we can replace the alternative with the optional operator in 
Spirit code.
+</p>
+<pre>    <span class=identifier>pow_expression 
+    </span><span class=special>= </span><span class=identifier>pow_operand 
</span><span class=special>&gt;&gt; </span><span class=special>!( </span><span 
class=literal>'^' </span><span class=special>&gt;&gt; </span><span 
class=identifier>pow_expression </span><span class=special>[ </span><span 
class=special>&amp; </span><span class=identifier>do_pow </span><span 
class=special>]
+                      </span><span class=special>)
+    </span><span class=special>;</span>
+</pre>
+<p>Now any semantic actions within <tt>pow_operand</tt> can safely be 
executed. For stack-based evaluation that means that each match of 
<tt>pow_operand</tt> will leave one value on the stack and the recursion makes 
sure there are (at least) two values on the stack when <tt>do_pow</tt> is fired 
to reduce these two values to their power.
+</p>
+<p>In cases where this technique isn't applicable, such as C-style assignment
+<pre>    <span class=identifier>assignment
+    </span><span class=special>= </span><span class=identifier>lvalue 
</span><span class=special>&gt;&gt; </span><span class=literal>'=' </span><span 
class=special>&gt;&gt; </span><span class=identifier>assignment 
+    </span><span class=special>| </span><span 
class=identifier>ternary_conditional 
+    </span><span class=special>;</span>
+</pre>
+<p>you can append <tt>| epsilon_p [ <i>action</i> ] &gt;&gt; nothing_p</tt> to 
a parser to correct the semantic context when backtracking occurs (in the 
example case that would be dropping the address pushed by <tt>lvalue</tt> off 
the evaluation stack):
+</p>
+<pre>    <span class=identifier>assignment
+    </span><span class=special>= </span><span class=identifier>lvalue 
</span><span class=special>&gt;&gt; </span><span class=special>( </span><span 
class=literal>'=' </span><span class=special>&gt;&gt; </span><span 
class=identifier>assignment    </span></span><span class=special>[ </span><span 
class=special>&amp; </span><span class=identifier>do_store </span><span 
class=special>]
+                </span><span class=special>| </span><span 
class=identifier>epsilon_p            </span><span class=special>[ </span><span 
class=special>&amp; </span><span class=identifier>do_drop  </span><span 
class=special>]
+                  </span><span class=special>&gt;&gt; </span><span 
class=identifier>nothing_p
+                </span><span class=special>) 
+    </span><span class=special>| </span><span 
class=identifier>ternary_conditional 
+    </span><span class=special>;</span>
+</pre>
+<p>However, this trick compromises the clear separation of syntax and 
semantics, so you also might want to consider using an <a 
href="trees.html">AST</a> instead of semantic actions so you can just go with 
the first definition of <tt>assignment</tt>.
+</p>
 <p><b> <a name="lexeme_and_rules" id="lexeme_and_rules"></a> The lexeme_d 
directive
   and rules</b></p>
 <p> <font color="#FF0000">Question:</font> Does lexeme_d not support 
expressions
@@ -451,6 +496,7 @@
 <hr size="1">
 <p class="copyright">Copyright &copy; 1998-2003 Joel de Guzman<br>
 <span class="copyright">Copyright &copy; 2002-2003 Hartmut Kaiser </span><br>
+<span class="copyright">Copyright &copy; 2006-2007 Tobias Schwinger </span><br>
   <br>
   <font size="2">Use, modification and distribution is subject to the Boost 
Software
       License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

Index: trees.html
===================================================================
RCS file: /cvsroot/boost/boost/libs/spirit/doc/trees.html,v
retrieving revision 1.9
retrieving revision 1.9.10.1
diff -u -d -r1.9 -r1.9.10.1
--- trees.html  23 Aug 2004 22:04:19 -0000      1.9
+++ trees.html  31 Jan 2007 11:04:11 -0000      1.9.10.1
@@ -41,13 +41,15 @@
   to use them and you can see how easy they are to use. So, following with 
tradition
   (and the rest of the documentation) we'll do a calculator. Here's the 
grammar:</p>
 <pre>    <code><span class="identifier">integer </span><span class="special">
-        =   </span><span class="identifier">lexeme_d</span><span 
class="special">[ </span><span class="identifier"><font 
color="#ff0000"><b>token_node_d</b></font></span><span class="special">[ 
(!</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span class="special">) 
&gt;&gt; +</span><span class="identifier">digit_p</span><span class="special">) 
] ]<br>        ;<br><br>    </span><span class="identifier">factor<br>        
</span><span class="special">=   </span><span class="identifier">integer<br>    
    </span><span class="special">|   </span><span class="literal">'(' 
</span><span class="special">&gt;&gt; </span><span 
class="identifier">expression </span><span class="special">&gt;&gt; 
</span><span class="literal">')'<br>        </span><span class="special">|   
(</span><span class="literal">'-' </span><span class="special">&gt;&gt; 
</span><span class="identifier">factor</span><span class="special">)<br>        
;<br><br
 >    </span><span class="identifier">term<br>        </span><span 
 > class="special">=   </span><span class="identifier">factor </span><span 
 > class="special">
+        =   </span><span class="identifier"><font 
color="#ff0000"><b>token_node_d</b></font></span><span class="special">[ 
(!</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span class="special">) 
&gt;&gt; +</span><span class="identifier">digit_p</span><span class="special">) 
]<br>        ;<br><br>    </span><span class="identifier">factor<br>        
</span><span class="special">=   </span><span class="identifier">integer<br>    
    </span><span class="special">|   </span><span class="literal">'(' 
</span><span class="special">&gt;&gt; </span><span 
class="identifier">expression </span><span class="special">&gt;&gt; 
</span><span class="literal">')'<br>        </span><span class="special">|   
(</span><span class="literal">'-' </span><span class="special">&gt;&gt; 
</span><span class="identifier">factor</span><span class="special">)<br>        
;<br><br>    </span><span class="identifier">term<br>        </span><span 
class="
 special">=   </span><span class="identifier">factor </span><span 
class="special">
             &gt;&gt; *(   (</span><span class="literal">'*' </span><span 
class="special">&gt;&gt; </span><span class="identifier">factor</span><span 
class="special">)<br>                |   (</span><span class="literal">'/' 
</span><span class="special">&gt;&gt; </span><span 
class="identifier">factor</span><span class="special">)<br>                
)<br>        ;<br><br>    </span><span class="identifier">expression<br>        
</span><span class="special">=   </span><span class="identifier">term<br>       
     </span><span class="special">&gt;&gt; *(   (</span><span 
class="literal">'+' </span><span class="special">&gt;&gt; </span><span 
class="identifier">term</span><span class="special">)<br>                |   
(</span><span class="literal">'-' </span><span class="special">&gt;&gt; 
</span><span class="identifier">term</span><span class="special">)<br>          
      )<br>        ;</span></code></pre>
 <p> Now, you'll notice the only thing different in this grammar is the 
<tt>token_node_d</tt>
-  directive. This causes the integer rule to group all the input into one node.
-  Without <tt>token_node_d</tt>, each character would get it's own node. As 
you'll
-  soon see, it's easier to convert the input into an int when all the 
characters
-  are in one node. Here is how the parse is done to create a tree:</p>
+  directive. This causes the match of the integer rule to end up in one node.
+  Without <tt>token_node_d</tt>, each character would get it's own node. 
+  Further note that <tt>token_node_d</tt> is an implicit lexeme (that means
+  no <tt>lexeme_d</tt> is needed to switch to character level parsing).
+  As you'll soon see, it's easier to convert the input into an int when all 
+  the characters are in one node. Here is how the parse is done to create a 
tree:</p>
 <pre>    <code><span class="identifier">tree_parse_info</span><span 
class="special">&lt;&gt; </span><span class="identifier">info </span><span 
class="special">= </span><span class="identifier"><font 
color="#ff0000"><b>pt_parse</b></font></span><span 
class="special">(</span><span class="identifier">first</span><span 
class="special">, </span><span class="identifier">expression</span><span 
class="special">);</span></code></pre>
 <p> <tt>pt_parse()</tt> is similar to <tt>parse()</tt>. There are four 
overloads:
   two for pairs of first and last iterators and two for character strings. Two
@@ -69,7 +71,7 @@
     hard to process? With a few more directives you can generate an abstract 
syntax
     tree (ast) and cut the amount of evaluation code by at least <b>50%</b>. So
     without any delay, here's the ast calculator grammar:</p>
-<pre>    <code><span class="identifier">integer<br>        </span><span 
class="special">=   </span><span class="identifier">leaf_node_d</span><span 
class="special">[ </span><span class="identifier">lexeme_d</span><span 
class="special">[ (!</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span class="special">) 
&gt;&gt; +</span><span class="identifier">digit_p</span><span class="special">) 
] ]<br>        ;<br><br>    </span><span class="identifier">factor<br>        
</span><span class="special">=   </span><span class="identifier">integer<br>    
    </span><span class="special">|   </span><span class="identifier"><font 
color="#ff0000"><b>inner_node_d</b></font></span><span 
class="special">[</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'('</span><span class="special">) 
&gt;&gt; </span><span class="identifier">expression </span><span 
class="special">&gt;&gt; </span><span clas
 s="identifier">ch_p</span><span class="special">(</span><span 
class="literal">')'</span><span class="special">)]<br>        |   (</span><span 
class="identifier"><font color="#ff0000"><b>root_node_d</b></font></span><span 
class="special">[</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span 
class="special">)] &gt;&gt; </span><span class="identifier">factor</span><span 
class="special">)<br>        ;<br><br>    </span><span 
class="identifier">term<br>        </span><span class="special">=   
</span><span class="identifier">factor </span><span class="special">
+<pre>    <code><span class="identifier">integer<br>        </span><span 
class="special">=   </span><span class="identifier"><font 
color="#ff0000"><b>leaf_node_d</b></font></span><span class="special">[ 
</span><span class="special">(!</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span class="special">) 
&gt;&gt; +</span><span class="identifier">digit_p</span><span class="special">) 
]<br>        ;<br><br>    </span><span class="identifier">factor<br>        
</span><span class="special">=   </span><span class="identifier">integer<br>    
    </span><span class="special">|   </span><span class="identifier"><font 
color="#ff0000"><b>inner_node_d</b></font></span><span 
class="special">[</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'('</span><span class="special">) 
&gt;&gt; </span><span class="identifier">expression </span><span 
class="special">&gt;&gt; </span><span class="ident
 ifier">ch_p</span><span class="special">(</span><span 
class="literal">')'</span><span class="special">)]<br>        |   (</span><span 
class="identifier"><font color="#ff0000"><b>root_node_d</b></font></span><span 
class="special">[</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span 
class="special">)] &gt;&gt; </span><span class="identifier">factor</span><span 
class="special">)<br>        ;<br><br>    </span><span 
class="identifier">term<br>        </span><span class="special">=   
</span><span class="identifier">factor </span><span class="special">
             &gt;&gt; *(  (</span><span class="identifier"><font 
color="#ff0000"><b>root_node_d</b></font></span><span 
class="special">[</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'*'</span><span 
class="special">)] &gt;&gt; </span><span class="identifier">factor</span><span 
class="special">)<br>                |  (</span><span class="identifier"><font 
color="#ff0000"><b>root_node_d</b></font></span><span 
class="special">[</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'/'</span><span 
class="special">)] &gt;&gt; </span><span class="identifier">factor</span><span 
class="special">)<br>                )<br>        ;<br><br>    </span><span 
class="identifier">expression<br>        </span><span class="special">=   
</span><span class="identifier">term<br>            </span><span 
class="special">&gt;&gt; *(  (</span><span class="identifier"><font 
color="#ff0000"><b>root_node_d</b></font>
 </span><span class="special">[</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'+'</span><span 
class="special">)] &gt;&gt; </span><span class="identifier">term</span><span 
class="special">)<br>                | (</span><span class="identifier"><font 
color="#ff0000"><b>root_node_d</b></font></span><span 
class="special">[</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span 
class="special">)] &gt;&gt; </span><span class="identifier">term</span><span 
class="special">)<br>                )<br>        ;</span></code></pre>
 <p> The differences from the parse tree grammar are hi-lighted in <b><font 
color="#ff0000">bold-red</font></b>.
   The <tt>inner_node_d</tt> directive causes the first and last nodes generated
@@ -273,18 +275,18 @@
   it.</p>
 <a name="leaf_node_d_token_node_d"></a>
 <h3>leaf_node_d/token_node_d</h3>
-<p> Both <tt>leaf_node_d</tt> and <tt>token_node_d</tt> work the same. They 
group 
-  together all the nodes generated by the enclosed parser. Note that a rule 
should 
-  not be used inside these directives.</p>
-<p> This rule:</p>
-<pre>    <code><span class="identifier">rule_t </span><span 
class="identifier">integer </span><span class="special">= </span><span 
class="special">!</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span class="special">) 
</span><span class="special">&gt;&gt; </span><span 
class="special">*(</span><span class="identifier">range_p</span><span 
class="special">(</span><span class="literal">'0'</span><span class="special">, 
</span><span class="literal">'9'</span><span 
class="special">));</span></code></pre>
-<p> would generate a root node with the id of integer and a child node for each
-  character parsed</p>
-<p> This:</p>
-<pre>    <code><span class="identifier">rule_t </span><span 
class="identifier">integer </span><span class="special">= </span><span 
class="identifier">token_node_d</span><span class="special">[ </span><span 
class="special">!</span><span class="identifier">ch_p</span><span 
class="special">(</span><span class="literal">'-'</span><span class="special">) 
</span><span class="special">&gt;&gt; </span><span 
class="special">*(</span><span class="identifier">range_p</span><span 
class="special">(</span><span class="literal">'0'</span><span class="special">, 
</span><span class="literal">'9'</span><span class="special">)) </span><span 
class="special">];</span></code></pre>
-<p> would generate a root node with only one child node that contained the 
entire
-  integer.</p>
-<a name="infix_node_d"></a>
+<p> Both <tt>leaf_node_t</tt> and <tt>token_node_d</tt> work the same. They 
+    create a single node for the match generated by the enclosed parser. 
+    Unlike with earlier versions of Spirit, this directive is an implicit
+    lexeme and alters the scanner (see 
+    <a href="faq.html#scanner_business">Scanner Business</a>). </p>
+<h3>reduced_node_d</h3>
+<p> This directive groups together all the nodes generated by the enclosed 
parser. 
+    For earlier versions of Spirit <tt>leaf_node_d</tt> and 
<tt>token_node_d</tt>
+    were implemented this way. The new implementation of those directives is a
+    lot faster, so <tt>reduced_node_d</tt> is primarily provided for 
portability
+    and can be useful when using a custom node factory (see advanced tree 
+    generation, below).</p>
 <h3>infix_node_d</h3>
 <p> This is useful for removing separators from lists. It discards all the 
nodes
   in even positions. Thus this rule:</p>
@@ -397,7 +399,7 @@
 <a name="custom"></a>
 <h3>custom</h3>
 <p> You can create your own factory. It should look like this:</p>
-<pre>    <code><span class="keyword">class </span><span 
class="identifier">my_factory<br>    </span><span class="special">{<br>    
</span><span class="keyword">public</span><span class="special">:<br><br>       
 </span><span class="comment">// This inner class is so that the factory can 
simulate<br>        // a template template parameter<br><br>        
</span><span class="keyword">template </span><span 
class="special">&lt;</span><span class="keyword">typename </span><span 
class="identifier">IteratorT</span><span class="special">&gt;<br>        
</span><span class="keyword">class </span><span class="identifier">factory<br>  
      </span><span class="special">{<br>        </span><span 
class="keyword">public</span><span class="special">:<br><br>            
</span><span class="comment">// This is your node type<br>            
</span><span class="keyword">typedef </span><span 
class="identifier">my_node_type </span><span 
class="identifier">node_t</span><span class="special">;<br><
 br>            </span><span class="keyword">static </span><span 
class="identifier">node_t </span><span 
class="identifier">create_node</span><span class="special">(<br>                
</span><span class="identifier">IteratorT </span><span 
class="keyword">const</span><span class="special">&amp; </span><span 
class="identifier">first</span><span class="special">, </span><span 
class="identifier">IteratorT </span><span class="keyword">const</span><span 
class="special">&amp; </span><span class="identifier">last</span><span 
class="special">, </span><span class="keyword">bool </span><span 
class="identifier">is_leaf_node</span><span class="special">)<br>            
</span><span class="special">{<br>                </span><span 
class="comment">// create a node and return it.<br>            </span><span 
class="special">}<br><br>            </span><span class="comment">// This 
function is used by the leaf_node and token_node directives.<br>            // 
If you don't use them, then you c
 an leave this function<br>            // unimplemented.<br><br>            
</span><span class="keyword">template </span><span 
class="special">&lt;</span><span class="keyword">typename </span><span 
class="identifier">ContainerT</span><span class="special">&gt;<br>            
</span><span class="keyword">static </span><span class="identifier">node_t 
</span><span class="identifier">group_nodes</span><span 
class="special">(</span><span class="identifier">ContainerT </span><span 
class="keyword">const</span><span class="special">&amp; </span><span 
class="identifier">nodes</span><span class="special">)<br>            
</span><span class="special">{<br>                </span><span 
class="comment">// Group all the nodes into one and return it.<br>            
</span><span class="special">}<br>        </span><span class="special">};<br>   
 </span><span class="special">};<br><br><br>    </span><span class="comment">// 
Typedefs to use my_factory<br>    </span><span class="keyword">typedef
  </span><span class="identifier">my_factory </span><span 
class="identifier">factory_t</span><span class="special">;<br>    </span><span 
class="keyword">typedef </span><span class="identifier">tree_match</span><span 
class="special">&lt;</span><span class="identifier">iterator_t</span><span 
class="special">, </span><span class="identifier">factory_t</span><span 
class="special">&gt; </span><span class="identifier">match_t</span><span 
class="special">;<br>    </span><span class="keyword">typedef </span><span 
class="identifier">tree_match_policy</span><span 
class="special">&lt;</span><span class="identifier">iterator_t</span><span 
class="special">, </span><span class="identifier">factory_t</span><span 
class="special">&gt; </span><span class="identifier">match_policy_t</span><span 
class="special">;<br></span></code><code><span class="special"><br>    
</span><span class="comment">// Typedefs if you are using rules instead of 
grammars<br></span></code><code><span class="special">   
  </span><span class="keyword">typedef </span><span 
class="identifier">scanner</span><span class="special">&lt;</span><span 
class="identifier">iterator_t</span></code><code><span 
class="special">,</span></code><code><span class="identifier"> 
scanner_policies</span></code><code><span class="identifier"></span><span 
class="special">&lt;</span></code><code><span 
class="identifier">iter_policy_t</span></code><code><span 
class="special">,</span></code><code><span class="identifier"> 
match_policy_t</span><span class="special">&gt;</span></code><code><span 
class="identifier"></span><span class="special"> &gt;</span></code><code><span 
class="special"> </span><span class="identifier">scanner_t</span><span 
class="special">;<br>    </span><span class="keyword">typedef </span><span 
class="identifier">rule</span><span class="special">&lt;</span><span 
class="identifier">scanner_t</span><span class="special"></span><span 
class="identifier"></span><span class="special">&gt; </span><span clas
 s="identifier">rule_t</span><span 
class="special">;<br></span></code><code><span class="special"></span><span 
class="special"><br></span></code></pre><table border="0"><tbody><tr><td 
width="10"><br>
+<pre>    <code><span class="keyword">class </span><span 
class="identifier">my_factory<br>    </span><span class="special">{<br>    
</span><span class="keyword">public</span><span class="special">:<br><br>       
 </span><span class="comment">// This inner class is so that the factory can 
simulate<br>        // a template template parameter<br><br>        
</span><span class="keyword">template </span><span 
class="special">&lt;</span><span class="keyword">typename </span><span 
class="identifier">IteratorT</span><span class="special">&gt;<br>        
</span><span class="keyword">class </span><span class="identifier">factory<br>  
      </span><span class="special">{<br>        </span><span 
class="keyword">public</span><span class="special">:<br><br>            
</span><span class="comment">// This is your node type<br>            
</span><span class="keyword">typedef </span><span 
class="identifier">my_node_type </span><span 
class="identifier">node_t</span><span class="special">;<br><
 br>            </span><span class="keyword">static </span><span 
class="identifier">node_t </span><span 
class="identifier">create_node</span><span class="special">(<br>                
</span><span class="identifier">IteratorT </span><span 
class="keyword">const</span><span class="special">&amp; </span><span 
class="identifier">first</span><span class="special">, </span><span 
class="identifier">IteratorT </span><span class="keyword">const</span><span 
class="special">&amp; </span><span class="identifier">last</span><span 
class="special">, </span><span class="keyword">bool </span><span 
class="identifier">is_leaf_node</span><span class="special">)<br>            
</span><span class="special">{<br>                </span><span 
class="comment">// create a node and return it.<br>            </span><span 
class="special">}<br><br>            </span><span class="comment">// This 
function is used by the reduced_node directive.<br>            // If you don't 
use it, then you can leave this f
 unction<br>            // unimplemented.<br><br>            </span><span 
class="keyword">template </span><span class="special">&lt;</span><span 
class="keyword">typename </span><span class="identifier">ContainerT</span><span 
class="special">&gt;<br>            </span><span class="keyword">static 
</span><span class="identifier">node_t </span><span 
class="identifier">group_nodes</span><span class="special">(</span><span 
class="identifier">ContainerT </span><span class="keyword">const</span><span 
class="special">&amp; </span><span class="identifier">nodes</span><span 
class="special">)<br>            </span><span class="special">{<br>             
   </span><span class="comment">// Group all the nodes into one and return 
it.<br>            </span><span class="special">}<br>        </span><span 
class="special">};<br>    </span><span class="special">};<br><br><br>    
</span><span class="comment">// Typedefs to use my_factory<br>    </span><span 
class="keyword">typedef </span><span c
 lass="identifier">my_factory </span><span 
class="identifier">factory_t</span><span class="special">;<br>    </span><span 
class="keyword">typedef </span><span class="identifier">tree_match</span><span 
class="special">&lt;</span><span class="identifier">iterator_t</span><span 
class="special">, </span><span class="identifier">factory_t</span><span 
class="special">&gt; </span><span class="identifier">match_t</span><span 
class="special">;<br>    </span><span class="keyword">typedef </span><span 
class="identifier">tree_match_policy</span><span 
class="special">&lt;</span><span class="identifier">iterator_t</span><span 
class="special">, </span><span class="identifier">factory_t</span><span 
class="special">&gt; </span><span class="identifier">match_policy_t</span><span 
class="special">;<br></span></code><code><span class="special"><br>    
</span><span class="comment">// Typedefs if you are using rules instead of 
grammars<br></span></code><code><span class="special">    </span><span c
 lass="keyword">typedef </span><span class="identifier">scanner</span><span 
class="special">&lt;</span><span 
class="identifier">iterator_t</span></code><code><span 
class="special">,</span></code><code><span class="identifier"> 
scanner_policies</span></code><code><span class="identifier"></span><span 
class="special">&lt;</span></code><code><span 
class="identifier">iter_policy_t</span></code><code><span 
class="special">,</span></code><code><span class="identifier"> 
match_policy_t</span><span class="special">&gt;</span></code><code><span 
class="identifier"></span><span class="special"> &gt;</span></code><code><span 
class="special"> </span><span class="identifier">scanner_t</span><span 
class="special">;<br>    </span><span class="keyword">typedef </span><span 
class="identifier">rule</span><span class="special">&lt;</span><span 
class="identifier">scanner_t</span><span class="special"></span><span 
class="identifier"></span><span class="special">&gt; </span><span 
class="identifier">
 rule_t</span><span class="special">;<br></span></code><code><span 
class="special"></span><span class="special"><br></span></code></pre><table 
border="0"><tbody><tr><td width="10"><br>
 </td>
     <td width="30"><a href="../index.html"><img src="theme/u_arr.gif" 
border="0"></a></td>
     <td width="30"><a href="symbols.html"><img src="theme/l_arr.gif" 
border="0"></a></td>
@@ -405,7 +407,7 @@
   </tr>
 </tbody></table>
 <hr size="1">
-<p class="copyright">Copyright &copy; 2001-2002 Daniel C. Nuffer<br>
+<p class="copyright">Copyright &copy; 2001-2002 Daniel C. Nuffer<br>Revised 
2007 Copyright &copy; Tobias Schwinger<br>
   <br>
   <font size="2">Use, modification and distribution is subject to the Boost 
Software
     License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs

Reply via email to