<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>"boost/spirit/core.hpp" </span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>iostream</span><span class=special>> </span><span class=preprocessor>#include </span><span class=special><</span><span class=identifier>string</span><span class=special>> </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><< </span><span class=string>"PUSH(" </span><span class=special><< </span><span class=identifier>s </span><span class=special><< </span><span class=literal>')' </span><span class=special><< </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><< </span><span class=string>"ADD\n"</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><< </span><span class=string>"SUBTRACT\n"</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><< </span><span class=string>"MULTIPLY\n"</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><< </span><span class=string>"DIVIDE\n"</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><< </span><span class=string>"NEGATE\n"</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><</span><span class=identifier>calculator</span><span class=special>> </span><span class=special>{ </span><span class=keyword>template </span><span class=special><</span><span class=keyword>typename </span><span class=identifier>ScannerT</span><span class=special>> </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>& </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>>> </span><span class=special>*( </span><span class=special>(</span><span class=literal>'+' </span><span class=special>>> </span><span class=identifier>term</span><span class=special>)[&</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>>> </span><span class=identifier>term</span><span class=special>)[&</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>>> </span><span class=special>*( </span><span class=special>(</span><span class=literal>'*' </span><span class=special>>> </span><span class=identifier>factor</span><span class=special>)[&</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>>> </span><span class=identifier>factor</span><span class=special>)[&</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>)[&</span><span class=identifier>do_int</span><span class=special>]] </span><span class=special>| </span><span class=literal>'(' </span><span class=special>>> </span><span class=identifier>expression </span><span class=special>>> </span><span class=literal>')' </span><span class=special>| </span><span class=special>(</span><span class=literal>'-' </span><span class=special>>> </span><span class=identifier>factor</span><span class=special>)[&</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>>> </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><</span><span class=number>0</span><span class=special>> </span><span class=identifier>expression</span><span class=special>; </span><span class=identifier>subrule</span><span class=special><</span><span class=number>1</span><span class=special>> </span><span class=identifier>term</span><span class=special>; </span><span class=identifier>subrule</span><span class=special><</span><span class=number>2</span><span class=special>> </span><span class=identifier>factor</span><span class=special>; </span><span class=identifier>rule</span><span class=special><</span><span class=identifier>ScannerT</span><span class=special>> </span><span class=identifier>first</span><span class=special>; </span><span class=identifier>rule</span><span class=special><</span><span class=identifier>ScannerT</span><span class=special>> </span><span class=keyword>const</span><span class=special>& </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><< </span><span class=string>"/////////////////////////////////////////////////////////\n\n"</span><span class=special>; </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"\t\tA calculator using subrules...\n\n"</span><span class=special>; </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"/////////////////////////////////////////////////////////\n\n"</span><span class=special>; </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"Type an expression...or [q or Q] to quit\n\n"</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><> </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><< </span><span class=string>"-------------------------\n"</span><span class=special>; </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"Parsing succeeded\n"</span><span class=special>; </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"-------------------------\n"</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><< </span><span class=string>"-------------------------\n"</span><span class=special>; </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"Parsing failed\n"</span><span class=special>; </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"stopped at: \": " </span><span class=special><< </span><span class=identifier>info</span><span class=special>.</span><span class=identifier>stop </span><span class=special><< </span><span class=string>"\"\n"</span><span class=special>; </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"-------------------------\n"</span><span class=special>; </span><span class=special>} </span><span class=special>} </span><span class=identifier>cout </span><span class=special><< </span><span class=string>"Bye... :-) \n\n"</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 © 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 "as is" 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>