Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > b9ba69a436161613d8fb030c8c726a8e > files > 444

spirit-1.5.1-2mdk.noarch.rpm

<html>
<head>
<title>subrule_calc.cpp</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" href="theme/style.css" type="text/css">
</head>

<body>
<table width="100%" border="0" background="theme/bkd2.gif" cellspacing="2">
  <tr> 
    <td width="10"> 
    </td>
    <td width="85%"> 
      <font size="6" face="Verdana, Arial, Helvetica, sans-serif"><b>subrule_calc.cpp</b></font>
    </td>
    <td width="112"><a href="http://spirit.sf.net"><img src="theme/spirit.gif" width="112" height="48" align="right" border="0"></a></td>
  </tr>
</table>
<pre>
<span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=comment>//
</span><span class=comment>//  This calculator example demontrates the use of subrules.
</span><span class=comment>//
</span><span class=comment>//  [ JDG 4/11/2002 ]
</span><span class=comment>//
</span><span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=preprocessor>#include </span><span class=string>&quot;boost/spirit/core.hpp&quot;
</span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>iostream</span><span class=special>&gt;
</span><span class=preprocessor>#include </span><span class=special>&lt;</span><span class=identifier>string</span><span class=special>&gt;

</span><span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>std</span><span class=special>;
</span><span class=keyword>using </span><span class=keyword>namespace </span><span class=identifier>spirit</span><span class=special>;

</span><span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=comment>//
</span><span class=comment>//  Semantic actions
</span><span class=comment>//
</span><span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=keyword>namespace </span><span class=special>{

    </span><span class=keyword>void    </span><span class=identifier>do_int</span><span class=special>(</span><span class=keyword>char </span><span class=keyword>const</span><span class=special>* </span><span class=identifier>str</span><span class=special>, </span><span class=keyword>char </span><span class=keyword>const</span><span class=special>* </span><span class=identifier>end</span><span class=special>)
    </span><span class=special>{
        </span><span class=identifier>string  </span><span class=identifier>s</span><span class=special>(</span><span class=identifier>str</span><span class=special>, </span><span class=identifier>end</span><span class=special>);
        </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;PUSH(&quot; </span><span class=special>&lt;&lt; </span><span class=identifier>s </span><span class=special>&lt;&lt; </span><span class=literal>')' </span><span class=special>&lt;&lt; </span><span class=identifier>endl</span><span class=special>;
    </span><span class=special>}

    </span><span class=keyword>void    </span><span class=identifier>do_add</span><span class=special>(</span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*, </span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*)    </span><span class=special>{ </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;ADD\n&quot;</span><span class=special>; </span><span class=special>}
    </span><span class=keyword>void    </span><span class=identifier>do_subt</span><span class=special>(</span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*, </span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*)   </span><span class=special>{ </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;SUBTRACT\n&quot;</span><span class=special>; </span><span class=special>}
    </span><span class=keyword>void    </span><span class=identifier>do_mult</span><span class=special>(</span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*, </span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*)   </span><span class=special>{ </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;MULTIPLY\n&quot;</span><span class=special>; </span><span class=special>}
    </span><span class=keyword>void    </span><span class=identifier>do_div</span><span class=special>(</span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*, </span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*)    </span><span class=special>{ </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;DIVIDE\n&quot;</span><span class=special>; </span><span class=special>}
    </span><span class=keyword>void    </span><span class=identifier>do_neg</span><span class=special>(</span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*, </span><span class=keyword>char </span><span class=keyword>const</span><span class=special>*)    </span><span class=special>{ </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;NEGATE\n&quot;</span><span class=special>; </span><span class=special>}
</span><span class=special>}

</span><span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=comment>//
</span><span class=comment>//  Our calculator grammar (using subrules)
</span><span class=comment>//
</span><span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=keyword>struct </span><span class=identifier>calculator </span><span class=special>: </span><span class=keyword>public </span><span class=identifier>grammar</span><span class=special>&lt;</span><span class=identifier>calculator</span><span class=special>&gt; </span><span class=special>{

    </span><span class=keyword>template </span><span class=special>&lt;</span><span class=keyword>typename </span><span class=identifier>ScannerT</span><span class=special>&gt;
    </span><span class=keyword>struct </span><span class=identifier>definition </span><span class=special>{

        </span><span class=identifier>definition</span><span class=special>(</span><span class=identifier>calculator </span><span class=keyword>const</span><span class=special>&amp; </span><span class=identifier>self</span><span class=special>)
        </span><span class=special>{
            </span><span class=identifier>first </span><span class=special>= </span><span class=special>(

                </span><span class=identifier>expression </span><span class=special>=
                    </span><span class=identifier>term
                    </span><span class=special>&gt;&gt; </span><span class=special>*(   </span><span class=special>(</span><span class=literal>'+' </span><span class=special>&gt;&gt; </span><span class=identifier>term</span><span class=special>)[&amp;</span><span class=identifier>do_add</span><span class=special>]
                        </span><span class=special>|   </span><span class=special>(</span><span class=literal>'-' </span><span class=special>&gt;&gt; </span><span class=identifier>term</span><span class=special>)[&amp;</span><span class=identifier>do_subt</span><span class=special>]
                        </span><span class=special>)
                </span><span class=special>,

                </span><span class=identifier>term </span><span class=special>=
                    </span><span class=identifier>factor
                    </span><span class=special>&gt;&gt; </span><span class=special>*(   </span><span class=special>(</span><span class=literal>'*' </span><span class=special>&gt;&gt; </span><span class=identifier>factor</span><span class=special>)[&amp;</span><span class=identifier>do_mult</span><span class=special>]
                        </span><span class=special>|   </span><span class=special>(</span><span class=literal>'/' </span><span class=special>&gt;&gt; </span><span class=identifier>factor</span><span class=special>)[&amp;</span><span class=identifier>do_div</span><span class=special>]
                        </span><span class=special>)
                </span><span class=special>,

                </span><span class=identifier>factor
                    </span><span class=special>=   </span><span class=identifier>lexeme_d</span><span class=special>[(+</span><span class=identifier>digit_p</span><span class=special>)[&amp;</span><span class=identifier>do_int</span><span class=special>]]
                    </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>')'
                    </span><span class=special>|   </span><span class=special>(</span><span class=literal>'-' </span><span class=special>&gt;&gt; </span><span class=identifier>factor</span><span class=special>)[&amp;</span><span class=identifier>do_neg</span><span class=special>]
                    </span><span class=special>|   </span><span class=special>(</span><span class=literal>'+' </span><span class=special>&gt;&gt; </span><span class=identifier>factor</span><span class=special>)
            </span><span class=special>);
        </span><span class=special>}

        </span><span class=identifier>subrule</span><span class=special>&lt;</span><span class=number>0</span><span class=special>&gt;  </span><span class=identifier>expression</span><span class=special>;
        </span><span class=identifier>subrule</span><span class=special>&lt;</span><span class=number>1</span><span class=special>&gt;  </span><span class=identifier>term</span><span class=special>;
        </span><span class=identifier>subrule</span><span class=special>&lt;</span><span class=number>2</span><span class=special>&gt;  </span><span class=identifier>factor</span><span class=special>;

        </span><span class=identifier>rule</span><span class=special>&lt;</span><span class=identifier>ScannerT</span><span class=special>&gt; </span><span class=identifier>first</span><span class=special>;
        </span><span class=identifier>rule</span><span class=special>&lt;</span><span class=identifier>ScannerT</span><span class=special>&gt; </span><span class=keyword>const</span><span class=special>&amp;
        </span><span class=identifier>start</span><span class=special>() </span><span class=keyword>const </span><span class=special>{ </span><span class=keyword>return </span><span class=identifier>first</span><span class=special>; </span><span class=special>}
    </span><span class=special>};
</span><span class=special>};

</span><span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=comment>//
</span><span class=comment>//  Main program
</span><span class=comment>//
</span><span class=comment>////////////////////////////////////////////////////////////////////////////
</span><span class=keyword>int
</span><span class=identifier>main</span><span class=special>()
</span><span class=special>{
    </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;/////////////////////////////////////////////////////////\n\n&quot;</span><span class=special>;
    </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;\t\tA calculator using subrules...\n\n&quot;</span><span class=special>;
    </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;/////////////////////////////////////////////////////////\n\n&quot;</span><span class=special>;
    </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;Type an expression...or [q or Q] to quit\n\n&quot;</span><span class=special>;

    </span><span class=identifier>calculator </span><span class=identifier>calc</span><span class=special>;    </span><span class=comment>//  Our parser

    </span><span class=keyword>for </span><span class=special>(;;)
    </span><span class=special>{
        </span><span class=keyword>char </span><span class=identifier>str</span><span class=special>[</span><span class=number>256</span><span class=special>];
        </span><span class=identifier>cin</span><span class=special>.</span><span class=identifier>getline</span><span class=special>(</span><span class=identifier>str</span><span class=special>, </span><span class=number>256</span><span class=special>);
        </span><span class=keyword>if </span><span class=special>(</span><span class=identifier>str</span><span class=special>[</span><span class=number>0</span><span class=special>] </span><span class=special>== </span><span class=literal>'q' </span><span class=special>|| </span><span class=identifier>str</span><span class=special>[</span><span class=number>0</span><span class=special>] </span><span class=special>== </span><span class=literal>'Q'</span><span class=special>)
            </span><span class=keyword>break</span><span class=special>;

        </span><span class=identifier>parse_info</span><span class=special>&lt;&gt; </span><span class=identifier>info </span><span class=special>= </span><span class=identifier>parse</span><span class=special>(</span><span class=identifier>str</span><span class=special>, </span><span class=identifier>calc</span><span class=special>, </span><span class=identifier>space_p</span><span class=special>);

        </span><span class=keyword>if </span><span class=special>(</span><span class=identifier>info</span><span class=special>.</span><span class=identifier>full</span><span class=special>)
        </span><span class=special>{
            </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;-------------------------\n&quot;</span><span class=special>;
            </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;Parsing succeeded\n&quot;</span><span class=special>;
            </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;-------------------------\n&quot;</span><span class=special>;
        </span><span class=special>}
        </span><span class=keyword>else
        </span><span class=special>{
            </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;-------------------------\n&quot;</span><span class=special>;
            </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;Parsing failed\n&quot;</span><span class=special>;
            </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;stopped at: \&quot;: &quot; </span><span class=special>&lt;&lt; </span><span class=identifier>info</span><span class=special>.</span><span class=identifier>stop </span><span class=special>&lt;&lt; </span><span class=string>&quot;\&quot;\n&quot;</span><span class=special>;
            </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;-------------------------\n&quot;</span><span class=special>;
        </span><span class=special>}
    </span><span class=special>}

    </span><span class=identifier>cout </span><span class=special>&lt;&lt; </span><span class=string>&quot;Bye... :-) \n\n&quot;</span><span class=special>;
    </span><span class=keyword>return </span><span class=number>0</span><span class=special>;
</span><span class=special>}</span></pre>
<hr size="1">
<p class="copyright">Copyright &copy; 1998-2002 Joel de Guzman<br>
  <br>
  <font size="2">Permission to copy, use, modify, sell and distribute this document 
  is granted provided this copyright notice appears in all copies. This document 
  is provided &quot;as is&quot; without express or implied warranty, and with 
  no claim as to its suitability for any purpose.</font></p>
<p><span class=special><br>
  </span> </p>
</body>
</html>