Google
Web alhem.net
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

MyParser.cpp

Go to the documentation of this file.
00001 
00006 /*
00007 Copyright (C) 2004  Anders Hedstrom
00008 
00009 This program is free software; you can redistribute it and/or
00010 modify it under the terms of the GNU General Public License
00011 as published by the Free Software Foundation; either version 2
00012 of the License, or (at your option) any later version.
00013 
00014 This program is distributed in the hope that it will be useful,
00015 but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 GNU General Public License for more details.
00018 
00019 You should have received a copy of the GNU General Public License
00020 along with this program; if not, write to the Free Software
00021 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 */
00023 #include <stdio.h>
00024 #include <string>
00025 #include <vector>
00026 #include <map>
00027 #include "Parse.h"
00028 #include <assert.h>
00029 #include "Token.h"
00030 #include "Statement.h"
00031 #include "Scope.h"
00032 #include "MyParser.h"
00033 #include "dp.h"
00034 
00035 #define DEB(x)
00036 
00037 
00038 
00039 MyParser::MyParser(const std::string &path)
00040 :BaseParser()
00041 ,m_path(path)
00042 ,m_stfilename("")
00043 ,m_stline(0)
00044 ,m_stpos(0)
00045 ,m_plevelm(0)
00046 ,m_extern(false)
00047 {
00048 }
00049 
00050 
00051 MyParser::~MyParser()
00052 {
00053 }
00054 
00055 
00056 // new parser
00057 // create Token
00058 // add to token_vec
00059 // if ';' - statement end
00060 // if '{' - scope begin
00061 // if '}' - scope end
00062 // that's it (well...)
00063 // # <line> <file> <?>
00064 // (use in sequence constructor or something like that)
00065 
00066 Scope *MyParser::Parser(FILE *fil,const std::string &name)
00067 {
00068         int c;
00069         std::string val;
00070         std::string strClass;
00071         bool append_next_statement = false;
00072         Scope *s = new Scope;
00073         Scope *current = s;
00074 
00075         for (;;)
00076         {
00077                 val = "";
00078                 c = GetToken(fil,val);
00079                 if (!c) // eof
00080                 {
00081                         break;
00082                 }
00083                 if (c == CPP)
00084                 {
00085                         preprocessor( val );
00086                 }
00087                 switch (c)
00088                 {
00089                 case COMMENT:
00090                         if (!m_tokens.size())
00091                         {
00092                                 AddToken(c,val);
00093                                 //
00094                                 Statement *s = new Statement(m_tokens);
00095                                 // set file, line
00096                                 s -> SetParent(current);
00097                                 s -> SetFile(m_stfilename);
00098                                 s -> SetLine(m_stline);
00099                                 s -> SetPos(m_stpos);
00100                                 s -> SetExtern(m_extern);
00101                                 current -> Add(s);
00102                                 //
00103                                 while (m_tokens.size())
00104                                         m_tokens.erase(m_tokens.begin());
00105                                 m_plevelm = m_plevel;
00106                         }
00107                         else
00108                         {
00109                                 AddToken(c,val);
00110                         }
00111                         break;
00112                 case ':': // public, protected, private, case
00113                         AddToken(c,val);
00114                         {
00115                                 token_v::iterator it = m_tokens.begin();
00116                                 Token *t = *it;
00117                                 if (t &&
00118                                     t -> GetCode() != Class &&
00119                                     t -> GetCode() != Template)
00120                                 {
00121                                         Statement *s = new Statement(m_tokens);
00122                                         // set file, line
00123                                         s -> SetParent(current);
00124                                         s -> SetFile(m_stfilename);
00125                                         s -> SetLine(m_stline);
00126                                         s -> SetPos(m_stpos);
00127                                         s -> SetExtern(m_extern);
00128                                         current -> Add(s);
00129                                         //
00130                                         while (m_tokens.size())
00131                                                 m_tokens.erase(m_tokens.begin());
00132                                         m_plevelm = m_plevel;
00133                                 }
00134                         }
00135                         break;
00136                 case ';':
00137                         AddToken(c,val);
00138                         if (m_plevel == m_plevelm)
00139                         {
00140                                 if (append_next_statement)
00141                                 {
00142                                         current -> AddTrail(m_tokens);
00143                                         current = current -> GetParent();
00144                                         append_next_statement = false;
00145                                 }
00146                                 else
00147                                 {
00148                                         Statement *s = new Statement(m_tokens);
00149                                         // set file, line
00150                                         s -> SetParent(current);
00151                                         s -> SetFile(m_stfilename);
00152                                         s -> SetLine(m_stline);
00153                                         s -> SetPos(m_stpos);
00154                                         s -> SetExtern(m_extern);
00155                                         current -> Add(s);
00156                                 }
00157                                 //
00158                                 while (m_tokens.size())
00159                                         m_tokens.erase(m_tokens.begin());
00160                                 m_plevelm = m_plevel;
00161                         }
00162                         break;
00163                 case '{':
00164                         {
00165                                 Scope *s = new Scope(m_tokens);
00166                                 // set file, line
00167                                 s -> SetParent(current);
00168                                 s -> SetFile(m_stfilename);
00169                                 s -> SetLine(m_stline);
00170                                 s -> SetPos(m_stpos);
00171                                 s -> SetExtern(m_extern);
00172                                 current -> Add(s);
00173                                 //
00174                                 current = s;
00175                                 //
00176                                 while (m_tokens.size())
00177                                         m_tokens.erase(m_tokens.begin());
00178                                 m_plevelm = m_plevel;
00179                         }
00180                         break;
00181                 case '}':
00182                         // enum fix
00183                         if (m_tokens.size())
00184                         {
00185                                 Statement *s = new Statement(m_tokens);
00186                                 // set file, line
00187                                 s -> SetParent(current);
00188                                 s -> SetFile(m_stfilename);
00189                                 s -> SetLine(m_stline);
00190                                 s -> SetPos(m_stpos);
00191                                 s -> SetExtern(m_extern);
00192                                 current -> Add(s);
00193                                 //
00194                                 while (m_tokens.size())
00195                                         m_tokens.erase(m_tokens.begin());
00196                                 m_plevelm = m_plevel;
00197                         }
00198                         if (current -> Trail())
00199                         {
00200                                 append_next_statement = true;
00201                         }
00202                         else
00203                         {
00204                                 current = current -> GetParent();
00205                         }
00206                         break;
00207                 default:
00208                         if (c != CPP)
00209                         {
00210                                 AddToken(c,val);
00211                         }
00212                         break;
00213                 }
00214                 //
00215                 EndToken(c);
00216         }
00217 
00218         return s;
00219 }
00220 
00221 
00222 Token *MyParser::AddToken(int c,const std::string &val)
00223 {
00224         if (!m_tokens.size() && c == WHITESPACE)
00225                 return NULL;
00226         Token *t = new Token(c,val);
00227         if (!m_tokens.size())
00228         {
00229                 m_stfilename = GetFilename();
00230                 m_stline = GetLine();
00231                 m_stpos = GetPos();
00232                 if (m_stfilename[0] == '/')
00233                         m_extern = true;
00234                 else
00235                         m_extern = false;
00236         }
00237         m_tokens.push_back(t);
00238         return t;
00239 }
00240 
00241 

Generated for My SDL C++ Gui by doxygen 1.3.6