<html> <head> <title>calc_plain.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>calc_plain.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>// Plain calculator example. </span><span class=comment>// </span><span class=comment>// [ JDG 5/10/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 </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>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>rule</span><span class=special><</span><span class=identifier>ScannerT</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=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=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>expression</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\tExpression parser...\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><span class=special><br> </span><br> </span></p> </body> </html>