⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_8cpp-source.html

📁 parser in C++~~~~~~~~~~~~
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>a1: main.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.9.1 --><div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div><h1>main.cpp</h1><a href="main_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 00010 <span class="preprocessor">#include "<a class="code" href="parse_8hpp.html">parse.hpp</a>"</span>00011 <span class="preprocessor">#include "<a class="code" href="eval_8hpp.html">eval.hpp</a>"</span>00012 <span class="preprocessor">#include &lt;sstream&gt;</span>00013 00014 <span class="keyword">using</span> <span class="keyword">namespace </span>std;00015 <a name="l00020"></a><a class="code" href="main_8cpp.html#a0">00020</a> <span class="keywordtype">void</span> <a class="code" href="main_8cpp.html#a0">parse_eval_print</a>(string sexpr)00021 {00022   <a class="code" href="classCell.html">Cell</a>* root = <a class="code" href="parse_8hpp.html#a0">parse</a>(sexpr);00023   <a class="code" href="classCell.html">Cell</a>* result = <a class="code" href="eval_8hpp.html#a0">eval</a>(root);00024   <span class="keywordflow">if</span> ( result == nil ) {00025     cout &lt;&lt; <span class="stringliteral">"()"</span> &lt;&lt; endl;00026   } <span class="keywordflow">else</span> {00027     cout &lt;&lt; *result &lt;&lt; endl;00028   }00029   <span class="keyword">delete</span> result;00030 }00031 <a name="l00037"></a><a class="code" href="main_8cpp.html#a1">00037</a> <span class="keywordtype">void</span> <a class="code" href="main_8cpp.html#a1">readsinglesymbol</a>(ifstream&amp; fin, string&amp; str)00038 {00039   <span class="keywordtype">char</span> currentchar;00040   fin.get(currentchar);00041   <span class="keywordflow">if</span> (fin.eof()) {00042     <span class="keywordflow">return</span>;00043   }00044   <span class="keywordflow">if</span> (currentchar == <span class="charliteral">'\"'</span>) {00045     <span class="comment">// read a string literal</span>00046     <span class="keywordflow">do</span> {00047       str += currentchar;00048       fin.get(currentchar);00049     } <span class="keywordflow">while</span> (currentchar != <span class="charliteral">'\"'</span>);00050     str += currentchar;00051   } <span class="keywordflow">else</span> {00052     <span class="keywordflow">do</span> {00053       str += currentchar;00054       fin.get(currentchar);00055     } <span class="keywordflow">while</span> ((<span class="keyword">false</span> == <a class="code" href="parse_8hpp.html#a1">iswhitespace</a>(currentchar)) 00056              &amp;&amp; (<span class="charliteral">'('</span> != currentchar) 00057              &amp;&amp; (<span class="keyword">false</span> == fin.eof()));00058     fin.putback(currentchar);  00059   }00060 }00061 <a name="l00068"></a><a class="code" href="main_8cpp.html#a2">00068</a> <span class="keywordtype">void</span> <a class="code" href="main_8cpp.html#a3">readfile</a>(ifstream&amp; fin)00069 {00070   string sexp;00071   <span class="keywordtype">bool</span> isstartsexp = <span class="keyword">false</span>;00072   <span class="keywordtype">int</span> inumleftparenthesis = 0;00073 00074   <span class="comment">// check whether to read the end</span>00075   <span class="keywordflow">while</span> (!fin.eof()) {00076     <span class="comment">// read char by char</span>00077     <span class="keywordtype">char</span> currentchar;00078     fin.get(currentchar);00079     <span class="keywordflow">if</span> (fin.eof()) {00080       <span class="keywordflow">break</span>;00081     }00082 00083     <span class="comment">// skip some white space before new s-expression occurs</span>00084     <span class="keywordflow">if</span> ((<span class="keyword">true</span> == <a class="code" href="parse_8hpp.html#a1">iswhitespace</a>(currentchar))&amp;&amp;(<span class="keyword">false</span> == isstartsexp)) {00085       <span class="keywordflow">continue</span>;00086     }00087     <span class="comment">// run across a new s-expression</span>00088     <span class="keywordflow">if</span> ((<span class="keyword">false</span> == isstartsexp)&amp;&amp;(<span class="keyword">false</span> == <a class="code" href="parse_8hpp.html#a1">iswhitespace</a>(currentchar))) {00089       <span class="comment">// check whether single symbol</span>00090       <span class="keywordflow">if</span> (<span class="charliteral">'('</span> != currentchar)   {00091         <span class="comment">// read a single symbol</span>00092         fin.putback(currentchar);00093         <a class="code" href="main_8cpp.html#a1">readsinglesymbol</a>(fin, sexp);00094         <span class="comment">// call function</span>00095         <a class="code" href="main_8cpp.html#a0">parse_eval_print</a>(sexp);00096         sexp.clear();00097       } <span class="keywordflow">else</span> {00098         <span class="comment">// start new expression</span>00099         isstartsexp = <span class="keyword">true</span>;00100         <span class="comment">// read left parenthesis</span>00101         sexp += currentchar;00102         inumleftparenthesis = 1;00103       }00104     } <span class="keywordflow">else</span> {00105       <span class="comment">// in the process of reading the current s-expression</span>00106       <span class="keywordflow">if</span> (<span class="keyword">true</span> == isstartsexp) {00107         <span class="keywordflow">if</span> (<span class="keyword">true</span> == <a class="code" href="parse_8hpp.html#a1">iswhitespace</a>(currentchar)) {00108           <span class="comment">// append a blankspace</span>00109           <span class="comment">//sexp += ' ';</span>00110           sexp += currentchar;00111         } <span class="keywordflow">else</span> {00112           <span class="comment">// append current character</span>00113           sexp += currentchar;00114           <span class="comment">// count left parenthesis</span>00115           <span class="keywordflow">if</span> (<span class="charliteral">'('</span> == currentchar) {00116             inumleftparenthesis ++;00117           }00118           <span class="keywordflow">if</span> (<span class="charliteral">')'</span> == currentchar) {00119             inumleftparenthesis --;00120             <span class="comment">// check whether current s-expression ends</span>00121             <span class="keywordflow">if</span> (0 == inumleftparenthesis) {00122               <span class="comment">// current s-expression ends</span>00123               isstartsexp  =  <span class="keyword">false</span>;00124               <span class="comment">// call functions</span>00125               <a class="code" href="main_8cpp.html#a0">parse_eval_print</a>(sexp);00126               sexp.clear();00127             }00128           }00129         }00130       }00131     }00132   }00133 }00134 <a name="l00139"></a><a class="code" href="main_8cpp.html#a3">00139</a> <span class="keywordtype">void</span> <a class="code" href="main_8cpp.html#a3">readfile</a>(<span class="keywordtype">char</span>* fn)00140 {00141   ifstream fin(fn);00142   <a class="code" href="main_8cpp.html#a3">readfile</a>(fin);00143   fin.close();00144 }00145 <a name="l00150"></a><a class="code" href="main_8cpp.html#a4">00150</a> <span class="keywordtype">void</span> <a class="code" href="main_8cpp.html#a4">readconsole</a>()00151 {00152   string sexpr;00153   <span class="comment">// read the input</span>00154   <span class="keywordflow">do</span> {00155     cout &lt;&lt; <span class="stringliteral">"&gt; "</span>;00156     getline(cin, sexpr);00157     <span class="keywordflow">if</span> (cin.eof()) {00158       <span class="keywordflow">break</span>;00159     }00160     <span class="keywordflow">if</span> (<span class="stringliteral">"(exit)"</span> == sexpr) {00161       <span class="keywordflow">return</span>;00162     }00163     <a class="code" href="main_8cpp.html#a0">parse_eval_print</a>(sexpr);00164   } <span class="keywordflow">while</span> (<span class="keyword">true</span>);00165 }00166 <a name="l00170"></a><a class="code" href="main_8cpp.html#a5">00170</a> <span class="keywordtype">int</span> <a class="code" href="main_8cpp.html#a5">main</a>(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>* argv[])00171 {00172   <span class="keywordflow">switch</span>(argc) {00173   <span class="keywordflow">case</span> 1:00174     <span class="comment">// read from the standard input</span>00175     <a class="code" href="main_8cpp.html#a4">readconsole</a>();00176     exit(0);00177     <span class="keywordflow">break</span>;00178   <span class="keywordflow">case</span> 2:00179     <span class="comment">// read from a file</span>00180     <a class="code" href="main_8cpp.html#a3">readfile</a>(argv[1]);00181     <span class="keywordflow">break</span>;00182   <span class="keywordflow">default</span>:00183     cout &lt;&lt; <span class="stringliteral">"too many arguments!"</span> &lt;&lt; endl;00184     exit(0);00185   }00186   <span class="keywordflow">return</span> 0;00187 }</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Mar 8 15:44:44 2007 for a1 by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -