00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
00057
00058
00059
00060
00061
00062
00063
00064
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)
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
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 ':':
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
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
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
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
00183 if (m_tokens.size())
00184 {
00185 Statement *s = new Statement(m_tokens);
00186
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