diff --git a/include/token.h b/include/token.h index 89e489e..631b323 100644 --- a/include/token.h +++ b/include/token.h @@ -22,7 +22,7 @@ enum class TokenType { FN, // Fn RETURN, // return TYPEOF, // typeof - PUBLIC, // public + PRIVATE, // private ID, // identifier EXCEED }; diff --git a/src/scan.cpp b/src/scan.cpp index bd74ca8..891f95a 100644 --- a/src/scan.cpp +++ b/src/scan.cpp @@ -63,8 +63,8 @@ vector scan(string s) { type = TokenType::RETURN, t.clear(); } else if (t == "typeof") { type = TokenType::TYPEOF, t.clear(); - } else if (t == "public") { - type = TokenType::PUBLIC, t.clear(); + } else if (t == "private") { + type = TokenType::PRIVATE, t.clear(); } else { type = TokenType::ID; } diff --git a/src/token.cpp b/src/token.cpp index 873a0cd..c29fb90 100644 --- a/src/token.cpp +++ b/src/token.cpp @@ -18,5 +18,5 @@ std::string token_mp[] = {",", "Fn", "return", "typeof", - "public", + "private", "ID"}; diff --git a/src/work.cpp b/src/work.cpp index 095ca69..d9b2c0e 100644 --- a/src/work.cpp +++ b/src/work.cpp @@ -82,7 +82,7 @@ shared_ptr _createType(shared_ptr); shared_ptr createType(); vector> createTypes(); vector>> createTems(); -vector>> createPars(); +vector>> createPars(map>* = nullptr); pair> createStruct(); pair> createVar(); @@ -384,11 +384,15 @@ vector>> createTems() { return tems; } -vector>> createPars() { +vector>> createPars(map>* vars) { vector>> pars; jump(TokenType::LP); - if (preview(TokenType::ID)) { + if (!preview(TokenType::RP)) { auto single = [&]() { + bool pub = 1; + if (preview(TokenType::PRIVATE)) { + pub = 0, pt++; + } auto s = jump(TokenType::ID); if (ndefs.find(s) != ndefs.end()) { printf("error on line %d", tokens[pt - 1].line), exit(0); @@ -399,6 +403,7 @@ vector>> createPars() { d->def_var = t; ndefs[s] = static_pointer_cast(d); pars.push_back({s, t}); + if (vars != nullptr && pub) (*vars)[s]=t; }; for (single(); preview(TokenType::COMMA); pt++, single()) {} } @@ -411,30 +416,29 @@ pair> createStruct() { string s; vector>> tems; vector>> pars; + auto t = make_shared(); if (preview(TokenType::ID)) { s = tokens[pt++].s; if (preview(TokenType::LT)) { tems = createTems(); } - pars = createPars(); + pars = createPars(&t->vars); } - auto t = make_shared(); for (const auto& pr : tems) { t->c1.push_back(pr.second); } for (const auto& pr : pars) { t->c2.push_back(pr.second); - t->vars[pr.first] = pr.second; } jump(TokenType::LB); vector defs; vector> subs; while (!preview(TokenType::RB)) { - bool pub = 0; - if (preview(TokenType::PUBLIC)) { - pub = 1, pt++; + bool pub = 1; + if (preview(TokenType::PRIVATE)) { + pub = 0, pt++; } if (preview({TokenType::STRUCT, TokenType::ID})) { auto tt = createStruct();