From 366603675eb739078d7e390d3c3a7a0192495ab2 Mon Sep 17 00:00:00 2001 From: lcw Date: Wed, 30 Aug 2023 10:33:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E5=91=98=E6=94=B9=E4=B8=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=85=AC=E6=9C=89=EF=BC=8C=E5=B9=B6=E4=B8=BA=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E6=88=90=E5=91=98=E6=B7=BB=E5=8A=A0=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E4=BF=AE=E9=A5=B0=E7=AC=A6=20(#1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/token.h | 2 +- src/scan.cpp | 4 ++-- src/token.cpp | 2 +- src/work.cpp | 22 +++++++++++++--------- 4 files changed, 17 insertions(+), 13 deletions(-) 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();