diff --git a/include/element.h b/include/element.h index a495472..c9eadf5 100644 --- a/include/element.h +++ b/include/element.h @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -12,7 +11,6 @@ using std::map; using std::pair; using std::set; using std::shared_ptr; -using std::string; using std::vector; using std::weak_ptr; @@ -26,8 +24,8 @@ struct Struct { weak_ptr fa; vector> c1; vector> c2; - map> vars; - map> structs; + map> vars; + map> structs; }; struct ValType { diff --git a/include/token.h b/include/token.h index 427d56a..3308f95 100644 --- a/include/token.h +++ b/include/token.h @@ -30,11 +30,12 @@ enum class TokenType { }; extern std::string token_mp[]; +extern std::vector id_mp; struct Token { int line; TokenType type; - std::string s; + int s; }; #endif \ No newline at end of file diff --git a/src/scan.cpp b/src/scan.cpp index 31085ac..d5a54eb 100644 --- a/src/scan.cpp +++ b/src/scan.cpp @@ -1,4 +1,5 @@ #include "scan.h" +#include using namespace std; @@ -14,9 +15,11 @@ vector scan(string s) { pt++; } }; + map mp; for (skipSpace(); pt < s.size(); skipSpace()) { TokenType type; string t; + int id = 0; if (s[pt] == ',') { type = TokenType::COMMA, pt++; } else if (s[pt] == ';') { @@ -56,27 +59,32 @@ vector scan(string s) { } t = s.substr(pt, r - pt); if (t == "struct") { - type = TokenType::STRUCT, t.clear(); + type = TokenType::STRUCT; } else if (t == "Fn") { - type = TokenType::FN, t.clear(); + type = TokenType::FN; } else if (t == "return") { - type = TokenType::RETURN, t.clear(); + type = TokenType::RETURN; } else if (t == "typeof") { - type = TokenType::TYPEOF, t.clear(); + type = TokenType::TYPEOF; } else if (t == "private") { - type = TokenType::PRIVATE, t.clear(); + type = TokenType::PRIVATE; } else if (t == "admit") { - type = TokenType::ADMIT, t.clear(); + type = TokenType::ADMIT; } else if (t == "delete") { - type = TokenType::DELETE, t.clear(); + type = TokenType::DELETE; } else { type = TokenType::ID; + if(mp.find(t) == mp.end()) { + mp[t] = id_mp.size(); + id_mp.push_back(t); + } + id = mp[t]; } pt = r; } else { printf("error on line %d", line), exit(1); } - tokens.push_back({line, type, t}); + tokens.push_back({line, type, id}); } return tokens; } \ No newline at end of file diff --git a/src/token.cpp b/src/token.cpp index 98ad3cc..bf27f0b 100644 --- a/src/token.cpp +++ b/src/token.cpp @@ -1,7 +1,9 @@ - #include +#include -std::string token_mp[] = {",", +using namespace std; + +string token_mp[] = {",", ";", "{", "}", @@ -22,3 +24,5 @@ std::string token_mp[] = {",", "admit", "delete", "ID"}; + +vector id_mp{""}; \ No newline at end of file diff --git a/src/work.cpp b/src/work.cpp index 542beb4..aa4e675 100644 --- a/src/work.cpp +++ b/src/work.cpp @@ -47,7 +47,7 @@ struct DefVar : Def { shared_ptr def_var; }; -map> ndefs; +map> ndefs; bool preview(vector v) { if (pt + v.size() > tokens.size()) { @@ -63,7 +63,7 @@ bool preview(vector v) { bool preview(TokenType t) { return preview(vector{t}); } -string jump(TokenType t) { +int jump(TokenType t) { if (preview(t)) { return tokens[pt++].s; } @@ -81,10 +81,10 @@ vector> createVals(); shared_ptr _createType(shared_ptr); shared_ptr createType(); vector> createTypes(); -vector>> createTems(); -vector>> createPars(map>* = nullptr); -pair> createStruct(); -pair> createVar(); +vector>> createTems(); +vector>> createPars(map>* = nullptr); +pair> createStruct(); +pair> createVar(); shared_ptr _createVal(shared_ptr ft) { auto str = ft->str; @@ -137,7 +137,7 @@ shared_ptr createVal() { if (preview(TokenType::FN)) { pt++; auto tt = make_shared(); - vector>> tems; + vector>> tems; if (preview(TokenType::LT)) { tems = createTems(); } @@ -152,7 +152,7 @@ shared_ptr createVal() { tt->c3 = createType(); jump(TokenType::LB); - vector defs; + vector defs; while (!preview(TokenType::RETURN)) { if (preview({TokenType::STRUCT, TokenType::ID})) { defs.push_back(createStruct().first); @@ -370,8 +370,8 @@ vector> createTypes() { return types; } -vector>> createTems() { - vector>> tems; +vector>> createTems() { + vector>> tems; jump(TokenType::LT); if (preview(TokenType::ID)) { auto single = [&]() { @@ -391,8 +391,8 @@ vector>> createTems() { return tems; } -vector>> createPars(map>* vars) { - vector>> pars; +vector>> createPars(map>* vars) { + vector>> pars; jump(TokenType::LP); if (!preview(TokenType::RP)) { auto single = [&]() { @@ -418,11 +418,11 @@ vector>> createPars(map> createStruct() { +pair> createStruct() { jump(TokenType::STRUCT); - string s; - vector>> tems; - vector>> pars; + int s = 0; + vector>> tems; + vector>> pars; auto t = make_shared(); bool constructor = 1; @@ -451,7 +451,7 @@ pair> createStruct() { } jump(TokenType::LB); - vector defs; + vector defs; vector> subs; while (!preview(TokenType::RB)) { bool pub = 1; @@ -489,7 +489,7 @@ pair> createStruct() { ndefs.erase(ss); } - if (!s.empty()) { + if (s) { auto tt = make_shared(); tt->def_struct = t; ndefs[s] = static_pointer_cast(tt); @@ -497,8 +497,8 @@ pair> createStruct() { return {s, t}; } -pair> createVar() { - string s; +pair> createVar() { + int s; shared_ptr t; if (preview(TokenType::STRUCT)) { auto pr = createStruct();