?? main_8cpp-source.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 Page</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File 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 <sstream></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 << <span class="stringliteral">"()"</span> << endl;00026 } <span class="keywordflow">else</span> {00027 cout << *result << 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& fin, string& 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 && (<span class="charliteral">'('</span> != currentchar) 00057 && (<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& 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))&&(<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)&&(<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 << <span class="stringliteral">"> "</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 << <span class="stringliteral">"too many arguments!"</span> << 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 <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 + -