?? parse_8cpp-source.html
字號:
00197 }00198 <span class="keywordflow">return</span> <span class="keyword">true</span>;00199 }00200 <a name="l00205"></a><a class="code" href="parse_8cpp.html#a7">00205</a> <a class="code" href="classCell.html">Cell</a>* <a class="code" href="parse_8cpp.html#a7">makecell</a>(string str)00206 {00207 <a class="code" href="classCell.html">Cell</a>* root;00208 <span class="keywordflow">if</span> (((str[0] >= <span class="charliteral">'0'</span>) && (str[0] <= <span class="charliteral">'9'</span>)) || (str[0] == <span class="charliteral">'.'</span>) 00209 || (((<span class="charliteral">'+'</span>==str[0]) || (<span class="charliteral">'-'</span>==str[0]))&&(str.length()>1))) {00210 <span class="keywordflow">if</span> (<span class="keyword">false</span> == <a class="code" href="parse_8cpp.html#a2">is_legalnumeric</a>(str)) {00211 cout << <span class="stringliteral">"error: illegal numeric literal"</span> << endl;00212 exit(1);00213 }00214 <span class="comment">// this is a numeric literal</span>00215 <span class="keywordflow">if</span> (string::npos == str.find(<span class="charliteral">'.'</span>)) {00216 <span class="comment">// int number</span>00217 <span class="keywordtype">char</span>* fchar = const_cast<char*>(str.c_str());00218 <span class="keywordtype">int</span> value = atoi(fchar);00219 root = <a class="code" href="cons_8hpp.html#a1">make_int</a>(value);00220 } <span class="keywordflow">else</span> {00221 <span class="comment">// this is a double</span>00222 <span class="keywordtype">char</span>* fchar = const_cast<char*>(str.c_str());00223 <span class="keywordtype">double</span> value = atof(fchar); 00224 root = <a class="code" href="cons_8hpp.html#a2">make_double</a>(value);00225 }00226 } 00227 00228 <span class="comment">// we don't deal with literal strings right now, so they are commented out</span>00229 <span class="comment">// else if (str[0] == '\"') {</span>00230 <span class="comment">// // this is a string literal</span>00231 <span class="comment">// string strval = str.substr(1, str.size() - 2);</span>00232 <span class="comment">// root = make_string(const_cast<char*>(strval.data()));</span>00233 <span class="comment">// } </span>00234 <span class="keywordflow">else</span> {00235 <span class="comment">// this is a symbol</span>00236 <span class="keywordflow">if</span> (<span class="keyword">false</span> == <a class="code" href="parse_8cpp.html#a3">is_legaloperator</a>(str)) {00237 cout << <span class="stringliteral">"error: illegal operator"</span> << endl;00238 exit(1);00239 }00240 root = <a class="code" href="cons_8hpp.html#a3">make_symbol</a>(const_cast<char*>(str.data()));00241 }00242 <span class="keywordflow">return</span> root;00243 }00244 00245 <a class="code" href="classCell.html">Cell</a>* <a class="code" href="parse_8cpp.html#a8">separate_parse</a>(string& sexpr); 00246 <a name="l00247"></a><a class="code" href="parse_8hpp.html#a0">00247</a> <a class="code" href="classCell.html">Cell</a>* <a class="code" href="parse_8hpp.html#a0">parse</a>(string sexpr)00248 {00249 <span class="comment">// is_legal(sexpr);</span>00250 <span class="comment">// delete the whitesapce at the begining and end</span>00251 <span class="comment">// such that the first and last character are not white space</span>00252 <a class="code" href="parse_8cpp.html#a5">clearwhitespace</a>(sexpr);00253 <span class="comment">// if (sexpr.length() == 0) {</span>00254 <span class="comment">// return NULL;</span>00255 <span class="comment">// }</span>00256 <span class="keywordflow">if</span> (sexpr.length() == 0) {00257 <span class="keywordflow">return</span> NULL;00258 }00259 <span class="keywordflow">if</span> ( !<a class="code" href="parse_8cpp.html#a6">is_legalexpr</a>(sexpr)) {00260 <span class="keywordflow">return</span> NULL;00261 }00262 <span class="comment">// check whether is single symbol</span>00263 <span class="comment">// i.e. leaf cell</span>00264 <span class="comment">// if (string::npos == sexpr.find('(')) {</span>00265 <span class="keywordflow">if</span> (<span class="charliteral">'('</span> != sexpr[0]) {00266 <span class="comment">// this is leaf cell</span>00267 <span class="comment">// bulid this leaf cell</span>00268 <a class="code" href="classCell.html">Cell</a>* root = <a class="code" href="parse_8cpp.html#a7">makecell</a>( sexpr );00269 <span class="keywordflow">return</span> root;00270 }00271 00272 <span class="comment">// the first and last character are '(' and ')', respectively</span>00273 <span class="comment">// delete the two characters</span>00274 <span class="keywordtype">int</span> length = sexpr.size();00275 sexpr = sexpr.substr(1, length-2);00276 <a class="code" href="parse_8cpp.html#a5">clearwhitespace</a>(sexpr);00277 length = sexpr.size();00278 <span class="comment">// if ( inparsecar ) {</span>00279 <span class="comment">// if (sexpr == "") {</span>00280 <span class="comment">// Cell* ec = new Cell("()");</span>00281 <span class="comment">// return ec;</span>00282 <span class="comment">// }</span>00283 <span class="comment">// }</span>00284 <span class="comment">// separate the s-expression into two left and right subsexps</span>00285 <a class="code" href="classCell.html">Cell</a>* root = <a class="code" href="parse_8cpp.html#a8">separate_parse</a>(sexpr);00286 00287 <span class="keywordflow">return</span> root;00288 }00289 <a name="l00295"></a><a class="code" href="parse_8cpp.html#a8">00295</a> <a class="code" href="classCell.html">Cell</a>* <a class="code" href="parse_8cpp.html#a8">separate_parse</a>(string& instr)00296 {00297 string sexp;00298 <span class="keywordtype">bool</span> isstartsexp = <span class="keyword">false</span>;00299 <span class="keywordtype">int</span> inumleftparenthesis = 0;00300 00301 <span class="comment">// check whether to read the end</span>00302 <a class="code" href="parse_8cpp.html#a5">clearwhitespace</a>(instr);00303 <span class="keywordtype">int</span> length = instr.size();00304 <span class="comment">// check whether it is a "()" sexpr</span>00305 00306 <span class="keywordflow">while</span> (instr.size() > 0) {00307 <span class="comment">// read char by char</span>00308 <span class="keywordtype">char</span> currentchar = instr[0];00309 <span class="comment">// skip some white space before new s-expression occurs</span>00310 <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)) {00311 <span class="keywordflow">continue</span>;00312 }00313 <span class="comment">// run accross a new s-expression</span>00314 <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))) {00315 <span class="comment">// check whether single symbol</span>00316 <span class="keywordflow">if</span> (<span class="charliteral">'('</span> != currentchar) {00317 <span class="comment">// read single a single symbol</span>00318 <a class="code" href="main_8cpp.html#a1">readsinglesymbol</a>(instr, sexp);00319 <a class="code" href="parse_8cpp.html#a5">clearwhitespace</a>(instr); 00320 inparsecar = <span class="keyword">true</span>;00321 <a class="code" href="classCell.html">Cell</a>* <a class="code" href="cons_8hpp.html#a13">car</a> = <a class="code" href="parse_8hpp.html#a0">parse</a>(sexp);00322 inparsecar = <span class="keyword">false</span>;00323 <a class="code" href="classCell.html">Cell</a>* <a class="code" href="cons_8hpp.html#a14">cdr</a> = <a class="code" href="parse_8hpp.html#a0">parse</a>(<span class="stringliteral">"("</span> + instr + <span class="stringliteral">")"</span>);00324 <a class="code" href="classCell.html">Cell</a>* root = <a class="code" href="cons_8hpp.html#a4">cons</a>(<a class="code" href="cons_8hpp.html#a13">car</a>, <a class="code" href="cons_8hpp.html#a14">cdr</a>);00325 sexp.clear();00326 <span class="keywordflow">return</span> root;00327 } <span class="keywordflow">else</span> {00328 <span class="comment">// start new expression</span>00329 isstartsexp = <span class="keyword">true</span>;00330 <span class="comment">// read left parenthesiss</span>00331 sexp += currentchar;00332 instr = instr.substr(1, instr.size() -1);00333 inumleftparenthesis = 1;00334 }00335 } <span class="keywordflow">else</span> {00336 <span class="comment">// in the process of reading the current s-expression</span>00337 <span class="keywordflow">if</span> (<span class="keyword">true</span> == isstartsexp) {00338 <span class="keywordflow">if</span> (<span class="keyword">true</span> == <a class="code" href="parse_8hpp.html#a1">iswhitespace</a>(currentchar)) {00339 <span class="comment">// append a blankspace</span>00340 sexp += <span class="charliteral">' '</span>;00341 instr = instr.substr(1, instr.size() -1);00342 } <span class="keywordflow">else</span> {00343 <span class="comment">// append current character</span>00344 sexp += currentchar;00345 instr = instr.substr(1, instr.size() -1);00346 <span class="comment">// count left parenthesiss</span>00347 <span class="keywordflow">if</span> (<span class="charliteral">'('</span> == currentchar) {00348 inumleftparenthesis ++;00349 }00350 <span class="keywordflow">if</span> (<span class="charliteral">')'</span> == currentchar) {00351 inumleftparenthesis --;00352 00353 <span class="comment">// check whether current s-expression ends</span>00354 <span class="keywordflow">if</span> (0 == inumleftparenthesis) {00355 <span class="comment">// current s-expression ends</span>00356 isstartsexp = <span class="keyword">false</span>;00357 <a class="code" href="parse_8cpp.html#a5">clearwhitespace</a>(instr);00358 inparsecar = <span class="keyword">true</span>;00359 <a class="code" href="classCell.html">Cell</a>* <a class="code" href="cons_8hpp.html#a13">car</a> = <a class="code" href="parse_8hpp.html#a0">parse</a>(sexp); 00360 inparsecar = <span class="keyword">false</span>;00361 <span class="keywordtype">int</span> length = instr.length();00362 <a class="code" href="classCell.html">Cell</a>* cdr;00363 <a class="code" href="classCell.html">Cell</a>* root;00364 <span class="keywordflow">if</span> (length <= 0) {00365 <a class="code" href="cons_8hpp.html#a14">cdr</a> = NULL;00366 } <span class="keywordflow">else</span> {00367 <a class="code" href="cons_8hpp.html#a14">cdr</a> = <a class="code" href="parse_8hpp.html#a0">parse</a>(<span class="stringliteral">"("</span> + instr + <span class="stringliteral">")"</span>); 00368 }00369 root = <a class="code" href="cons_8hpp.html#a4">cons</a>(<a class="code" href="cons_8hpp.html#a13">car</a>, <a class="code" href="cons_8hpp.html#a14">cdr</a>);00370 sexp.clear();00371 <span class="keywordflow">return</span> root; 00372 }00373 }00374 }00375 }00376 }00377 }00378 00379 <span class="keywordflow">return</span> NULL;00380 }</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 + -