parent
366603675e
commit
ff38dc4b7c
2
.gitignore
vendored
2
.gitignore
vendored
@ -37,7 +37,7 @@
|
|||||||
build/
|
build/
|
||||||
CMakeList.txt
|
CMakeList.txt
|
||||||
acpa
|
acpa
|
||||||
.stackdump
|
*.stackdump
|
||||||
|
|
||||||
# --> Editors
|
# --> Editors
|
||||||
# Vim
|
# Vim
|
||||||
|
15
docs/BNF.txt
15
docs/BNF.txt
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
模板参数列表 ::= "<" [模板参数列表内容] ">"
|
模板参数列表 ::= "<" [模板参数列表内容] ">"
|
||||||
|
|
||||||
结构体定义 ::= "struct" <标识符> [模板参数列表] <函数参数列表> "{" 结构体内容 "}" ";"
|
结构体定义 ::= "struct" <标识符> [模板参数列表] ("(" "delete" ")" | <函数参数列表>) "{" 结构体内容 "}" ";"
|
||||||
|
|
||||||
匿名结构体定义 ::= "struct" "{" <结构体内容> "}" <标识符> ";"
|
匿名结构体定义 ::= "struct" "{" <结构体内容> "}" <标识符> ";"
|
||||||
|
|
||||||
@ -33,14 +33,17 @@
|
|||||||
值 ::= <基本值>
|
值 ::= <基本值>
|
||||||
| <基本值> "." <局部值>
|
| <基本值> "." <局部值>
|
||||||
|
|
||||||
基本值 ::= 标识符
|
基本值 ::= <标识符>
|
||||||
| 新实例
|
| <新实例>
|
||||||
| 新函数
|
| <新函数>
|
||||||
| 直接函数调用
|
| <新公理>
|
||||||
|
| <直接函数调用>
|
||||||
|
|
||||||
新实例 ::= <结构体类型> [类型列表] <值列表>
|
新实例 ::= <结构体类型> [类型列表] <值列表>
|
||||||
|
|
||||||
直接函数调用 ::= (<标识符> | <新函数> | <直接函数调用>) [类型列表] <值列表>
|
新公理 ::= "admit" "<" <类型> ">" "(" ")"
|
||||||
|
|
||||||
|
直接函数调用 ::= (<标识符> | <新函数> | <新公理> | <直接函数调用>) [类型列表] <值列表>
|
||||||
|
|
||||||
局部值 ::= <局部基本值>
|
局部值 ::= <局部基本值>
|
||||||
| <局部基本值> "." <局部值>
|
| <局部基本值> "." <局部值>
|
||||||
|
@ -23,6 +23,8 @@ enum class TokenType {
|
|||||||
RETURN, // return
|
RETURN, // return
|
||||||
TYPEOF, // typeof
|
TYPEOF, // typeof
|
||||||
PRIVATE, // private
|
PRIVATE, // private
|
||||||
|
ADMIT, // admit
|
||||||
|
DELETE, // delete
|
||||||
ID, // identifier
|
ID, // identifier
|
||||||
EXCEED
|
EXCEED
|
||||||
};
|
};
|
||||||
|
@ -65,6 +65,10 @@ vector<Token> scan(string s) {
|
|||||||
type = TokenType::TYPEOF, t.clear();
|
type = TokenType::TYPEOF, t.clear();
|
||||||
} else if (t == "private") {
|
} else if (t == "private") {
|
||||||
type = TokenType::PRIVATE, t.clear();
|
type = TokenType::PRIVATE, t.clear();
|
||||||
|
} else if (t == "admit") {
|
||||||
|
type = TokenType::ADMIT, t.clear();
|
||||||
|
} else if (t == "delete") {
|
||||||
|
type = TokenType::DELETE, t.clear();
|
||||||
} else {
|
} else {
|
||||||
type = TokenType::ID;
|
type = TokenType::ID;
|
||||||
}
|
}
|
||||||
|
@ -19,4 +19,6 @@ std::string token_mp[] = {",",
|
|||||||
"return",
|
"return",
|
||||||
"typeof",
|
"typeof",
|
||||||
"private",
|
"private",
|
||||||
|
"admit",
|
||||||
|
"delete",
|
||||||
"ID"};
|
"ID"};
|
||||||
|
18
src/work.cpp
18
src/work.cpp
@ -179,6 +179,13 @@ shared_ptr<ValType> createVal() {
|
|||||||
jump(TokenType::RB);
|
jump(TokenType::RB);
|
||||||
|
|
||||||
t = static_pointer_cast<ValType>(tt);
|
t = static_pointer_cast<ValType>(tt);
|
||||||
|
} else if (preview(TokenType::ADMIT)) {
|
||||||
|
pt++;
|
||||||
|
jump(TokenType::LT);
|
||||||
|
t = createType();
|
||||||
|
jump(TokenType::RT);
|
||||||
|
jump(TokenType::LP);
|
||||||
|
jump(TokenType::RP);
|
||||||
} else {
|
} else {
|
||||||
bool flag = 0; // 新实例
|
bool flag = 0; // 新实例
|
||||||
if (preview(TokenType::TYPEOF)) {
|
if (preview(TokenType::TYPEOF)) {
|
||||||
@ -418,19 +425,30 @@ pair<string, shared_ptr<Struct>> createStruct() {
|
|||||||
vector<pair<string, shared_ptr<ValType>>> pars;
|
vector<pair<string, shared_ptr<ValType>>> pars;
|
||||||
auto t = make_shared<Struct>();
|
auto t = make_shared<Struct>();
|
||||||
|
|
||||||
|
bool constructor = 1;
|
||||||
if (preview(TokenType::ID)) {
|
if (preview(TokenType::ID)) {
|
||||||
s = tokens[pt++].s;
|
s = tokens[pt++].s;
|
||||||
if (preview(TokenType::LT)) {
|
if (preview(TokenType::LT)) {
|
||||||
tems = createTems();
|
tems = createTems();
|
||||||
}
|
}
|
||||||
|
if(preview({TokenType::LP,TokenType::DELETE})) {
|
||||||
|
constructor = 0;
|
||||||
|
pt += 2, jump(TokenType::RP);
|
||||||
|
} else {
|
||||||
pars = createPars(&t->vars);
|
pars = createPars(&t->vars);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
for (const auto& pr : tems) {
|
for (const auto& pr : tems) {
|
||||||
t->c1.push_back(pr.second);
|
t->c1.push_back(pr.second);
|
||||||
}
|
}
|
||||||
|
if(constructor) {
|
||||||
for (const auto& pr : pars) {
|
for (const auto& pr : pars) {
|
||||||
t->c2.push_back(pr.second);
|
t->c2.push_back(pr.second);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
static auto null_type = static_pointer_cast<ValType>(make_shared<TemplateType>());
|
||||||
|
t->c2.push_back(null_type);
|
||||||
|
}
|
||||||
|
|
||||||
jump(TokenType::LB);
|
jump(TokenType::LB);
|
||||||
vector<string> defs;
|
vector<string> defs;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user