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

📄 parse_8cpp-source.html

📁 parser in C++~~~~~~~~~~~~
💻 HTML
📖 第 1 页 / 共 2 页
字号:
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] &gt;= <span class="charliteral">'0'</span>) &amp;&amp; (str[0] &lt;= <span class="charliteral">'9'</span>)) || (str[0] == <span class="charliteral">'.'</span>) 00209       || (((<span class="charliteral">'+'</span>==str[0]) || (<span class="charliteral">'-'</span>==str[0]))&amp;&amp;(str.length()&gt;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 &lt;&lt; <span class="stringliteral">"error: illegal numeric literal"</span> &lt;&lt; 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&lt;char*&gt;(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&lt;char*&gt;(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&lt;char*&gt;(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 &lt;&lt; <span class="stringliteral">"error: illegal operator"</span> &lt;&lt; endl;00238       exit(1);00239     }00240     root = <a class="code" href="cons_8hpp.html#a3">make_symbol</a>(const_cast&lt;char*&gt;(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&amp; 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&amp; 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() &gt; 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))&amp;&amp;(<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)&amp;&amp;(<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 &lt;= 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&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 + -