feat: 添加一些方法

This commit is contained in:
msojocs 2023-07-31 23:01:33 +08:00
parent 9aec5c4130
commit 8838c216cb
6 changed files with 316 additions and 18 deletions

1
.gitignore vendored
View File

@ -6,3 +6,4 @@ node_modules
*output.json
*err.js
*stderr.json
.cache

View File

@ -1,6 +1,8 @@
cmake_minimum_required(VERSION 3.0.0)
project(wx_complier VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
include(CTest)
enable_testing()

View File

@ -308,6 +308,7 @@ namespace night
std::string offset_0;
night::NSASTParse * offset_24 = nullptr;
std::vector<std::string> * offset_28 = nullptr;
int offset_32 = 0;
std::vector<night::ns_sourcemap> offset_36;
int offset_48;
NSCompileJs(/* args */);

View File

@ -169,7 +169,41 @@ namespace night
}
night::ns_node *NSASTParse::ast_new_array()
{
throw "not implement";
auto mlbp = this->make_list_by_parser("[", "]", ",", "ast_expression_no_comma", 0, -1, "ast_new_array");
auto v13 = this->offset_24->gen_girl(night::std_v_n);
auto v19 = this->offset_24->gen_son(night::NS_TYPE_PUNC);
v19->offset_60 = "[";
v13.vec->push_back(v19);
if (mlbp->begin() != mlbp->end())
{
v19 = this->offset_24->gen_son(night::NS_TYPE_PROG);
v19->offset_228 = mlbp;
v19->offset_108 = ",";
v13.vec->push_back(v19);
}
v19 = this->offset_24->gen_son(night::NS_TYPE_PUNC);
v19->offset_60 = "]";
v13.vec->push_back(v19);
v19 = this->offset_24->gen_son(night::NS_TYPE_ARRAY);
v19->offset_228 = v13.vec;
v19->offset_108 = "";
auto v14 = this->make_call_or_just_expression(v19);
auto v3 = this->offset_28->peek();
if (v3)
{
if ("[" == v3->offset_60)
{
return this->ast_obj_op(v14);
}
if ("." == v3->offset_60)
{
return this->ast_obj_dot(v14);
}
}
return v14;
}
night::ns_node *NSASTParse::ast_obj_op_self(night::ns_node *a2)
@ -227,7 +261,11 @@ namespace night
night::ns_node *NSASTParse::ast_op_self()
{
throw "not implement";
auto v3 = this->offset_28->next();
auto ret = this->offset_24->gen_son(night::NS_TYPE_OP_SELF);
ret->offset_156.assign(v3->offset_60);
ret->offset_192 = this->ast_dispatch(false);
return ret;
}
night::ns_node *NSASTParse::ast_if()
{
@ -271,7 +309,167 @@ namespace night
}
night::ns_node *NSASTParse::ast_switch()
{
throw "not implement";
this->offset_28->next();
auto v27 = this->offset_24->gen_girl(night::std_v_n);
auto v22 = this->offset_24->gen_girl(night::std_v_v_n);
auto v20 = this->offset_24->gen_girl(night::std_v_n);
auto v47 = this->offset_24->gen_son(night::NS_TYPE_SWITCH);
v47->offset_232 = v27.vec;
v47->offset_204 = 0;
v47->offset_236 = v22.vecVec;
v47->offset_240 = v20.vec;
this->ignore_punc("(");
v47->offset_204 = this->ast_expression();
this->ignore_punc(")");
this->ignore_punc("{");
this->offset_36++;
while (true)
{
if (!this->is_buildin_keywords("case"))
{
break;
}
this->ignore_buildin_kw("case");
auto v2 = this->offset_28;
auto v3 = v2->offset_4;
auto v19 = v3->offset_52;
auto v21 = v3->offset_56;
auto v29 = v2->peek();
if (!v29)
{
std::string msg = "Expected variable|numer|boolean|string";
this->offset_28->err(msg, v19, v21, true);
}
bool v23 = true;
if (!this->is_op("-"))
{
v23 = this->is_op("+");
}
if (v23)
{
this->offset_28->next();
night::ns_node * v4 = this->offset_28->peek();
if (!v4 || night::NS_TYPE_NUM != v4->offset_0)
{
std::string msg = "Expected variable|numer|boolean|string";
this->offset_28->err(msg, v19, v21, true);
}
v4->offset_60 = v29->offset_60 + v4->offset_60;
}
else if (
night::NS_TYPE_VAR != v29->offset_0
&& night::NS_TYPE_NUM != v29->offset_0
&& night::NS_TYPE_STR != v29->offset_0
)
{
bool v30;
if (this->is_buildin_keywords("true"))
{
v30 = true;
}
else
{
v30 = this->is_buildin_keywords("false");
}
if (!v30)
{
std::string msg = "Expected variable|numer|boolean|string";
this->offset_28->err(msg, v19, v21, true);
}
}
auto v31 = v47->offset_232;
auto v55 = this->offset_28->next();
v31->emplace_back(v55);
this->ignore_punc(":");
NSGod::GodsSon::Offset24 v52;
while (true) {
auto v5 = this->is_buildin_keywords("case");
bool v32 = false;
if (v5)
{
v32 = false;
}
else
{
auto v7 = this->is_buildin_keywords("default");
if (!v7)
{
auto v9 = this->is_punctuation("}");
v32 = v9 == nullptr;
}
}
if (!v32)
{
break;
}
if (!v52.vec)
{
v52 = this->offset_24->gen_girl(night::std_v_n);
}
auto v34 = v52.vec;
auto v55 = this->ast_expression();
v34->emplace_back(v55);
while (!this->offset_28->eof()) {
if (!this->is_punctuation(";"))
{
break;
}
this->offset_28->next();
}
}
if (!v52.vec)
{
v52 = this->offset_24->gen_girl(night::std_v_n);
auto v54 = this->offset_24->gen_son(night::NS_TYPE_SKIP);
v52.vec->emplace_back(v54);
}
v47->offset_236->push_back(v52.vec);
if (this->offset_28->eof())
{
this->offset_28->err("End of file", 0, 0, false);
}
if (this->is_punctuation("}"))
{
break;
}
if (this->is_buildin_keywords("default"))
{
this->ignore_buildin_kw("default");
this->ignore_punc(":");
while(true)
{
if (this->is_punctuation("}"))
{
break;
}
auto v55 = this->ast_expression();
v47->offset_240->emplace_back(v55);
if (this->offset_28->eof())
{
this->offset_28->err("End of file", 0, 0, false);
}
while(true)
{
if (!this->is_punctuation(";"))
{
break;
}
this->offset_28->next();
}
}
break;
}
}
this->offset_36--;
this->ignore_punc("}");
return v47;
}
bool NSASTParse::is_obj_op_self(bool a3)
{
@ -319,10 +517,11 @@ namespace night
}
return v6;
}
// int ast_dispatch_i = 0;
int ast_dispatch_i = 0;
night::ns_node *NSASTParse::ast_dispatch(bool a3)
{
// int inner_ast_dispatch_i = ++ast_dispatch_i;
int inner_ast_dispatch_i = ++ast_dispatch_i; // 178
// ast_dispatch - 0
auto v42 = this->is_punctuation("(");
if (!v42)
@ -385,7 +584,7 @@ namespace night
auto v11 = this->ast_obj_op_self(0);
return this->make_call_or_just_expression(v11);
}
if (this->is_op_self(false))
if (this->is_op_self(true))
{
auto v11 = this->ast_op_self();
return this->make_call_or_just_expression(v11);
@ -542,7 +741,8 @@ namespace night
auto v39 = v59->offset_60;
if (night::NS_TYPE_B_TYPE != v59->offset_0)
{
std::string msg = "Unexpected token `" + v39 + "`";
this->offset_28->err(msg, 0, 0, false);
}
if (
"Number" != v39
@ -722,10 +922,10 @@ namespace night
}
// int make_binary_or_just_value_i = 0;
int make_binary_or_just_value_i = 0;
night::ns_node *NSASTParse::make_binary_or_just_value(night::ns_node * a2, bool a3)
{
// int inner_make_binary_or_just_value_i = ++make_binary_or_just_value_i;
int inner_make_binary_or_just_value_i = ++make_binary_or_just_value_i;
bool v21;
bool v18;
if (a3)
@ -837,13 +1037,20 @@ namespace night
night::ns_node *NSASTParse::ast_ternary_expression()
{
throw "not implement";
auto v6 = this->ast_expression_no_comma();
this->ignore_punc(":");
auto v5 = this->ast_expression_no_comma();
auto lb = this->offset_24->gen_son(night::NS_TYPE_TERNARY);
lb->offset_180 = v6;
lb->offset_184 = v5;
return lb;
}
// int ast_obj_dot_i = 0;
int ast_obj_dot_i = 0;
night::ns_node *NSASTParse::ast_obj_dot(night::ns_node* a2)
{
// int inner_ast_obj_dot_i = ast_obj_dot_i++;
int inner_ast_obj_dot_i = ++ast_obj_dot_i;
auto v11 = this->offset_24;
auto v9 = v11->gen_girl(night::std_v_n);
auto v10 = v11->gen_son(night::NS_TYPE_OBJ_DOT);
@ -879,9 +1086,42 @@ namespace night
return v10;
}
night::ns_node *NSASTParse::ast_obj_op(night::ns_node*)
night::ns_node *NSASTParse::ast_obj_op(night::ns_node* a2)
{
throw "not implement";
auto v9 = this->offset_24->gen_girl(night::std_v_n);
auto v13 = this->offset_24->gen_son(night::NS_TYPE_OBJ_PROPERTY);
v13->offset_192 = a2;
v13->offset_196 = v9.vec;
std::string v10;
do
{
this->ignore_punc("[");
auto v15 = this->ast_expression();
v9.vec->emplace_back(v15);
this->ignore_punc("]");
auto v3 = this->offset_28->peek();
if (!v3)
{
break;
}
v10 = v3->offset_60;
if (";" == v10)
{
break;
}
} while ("[" == v10);
if (this->is_obj_op_self(false))
{
return this->ast_obj_op_self(v13);
}
auto v5 = this->offset_28->peek();
if (v5 && "." == v5->offset_0)
{
return this->ast_obj_dot(v13);
}
return v13;
}
night::ns_node *NSASTParse::ast_call(night::ns_node* a2)
@ -1208,8 +1448,10 @@ namespace night
return lt;
}
int is_punctuation_i = 0;
night::ns_node * NSASTParse::is_punctuation(std::string const &a2)
{
int inner_is_punctuation_i = ++ is_punctuation_i;
auto v2 = this->offset_28->peek();
if (v2)
{

View File

@ -15,8 +15,10 @@ namespace night
{
return this->compile_binary(a3);
}
int compile_binary_i = 0;
std::string NSCompileJs::compile_binary(night::ns_node *a3)
{
int inner_compile_binary_i = ++compile_binary_i;
std::string ret = this->compile(a3->offset_180);
std::string v10 = " " + a3->offset_156;
std::string v3 = v10.append(" ");
@ -312,9 +314,53 @@ namespace night
return result;
}
std::string NSCompileJs::compile_obj_property(night::ns_node *)
int compile_obj_property_i = 0;
std::string NSCompileJs::compile_obj_property(night::ns_node *a3)
{
throw "not implement";
int inner_compile_obj_property_i = ++compile_obj_property_i;
std::string v26 = night::nst_ + std::to_string(this->offset_32);
this->offset_32++;
std::string result;
result += this->compile(a3->offset_192);
for (int i = 0; i < a3->offset_196->size(); i++)
{
result += "[(";
this->offset_48 += 2;
auto cur = a3->offset_196->at(i);
if (night::NS_TYPE_STR == cur->offset_0)
{
std::string v38;
v38 = "\"" + night::nsv_ + "\"+";
result += v38;
this->offset_48 += v38.length();
result += this->compile(cur);
}
else
{
if (night::NS_TYPE_NUM == cur->offset_0)
{
result += this->compile(cur);
}
else
{
std::string v27 = "(" + v26 + "=(";
result += v27;
this->offset_48 += v27.length();
result += this->compile(cur) + "),";
this->offset_48 += 2;
v27 = "null==" + v26 + "?undefined:" + "'number'=== typeof " + v26 + "?" + v26 + ":\"" + night::nsv_ + "\"+" + v26 + ")";
result += v27;
this->offset_48 += v27.length();
}
}
result += ")]";
this->offset_48 += 2;
}
return result;
}
std::string NSCompileJs::compile_obj_self_op(night::ns_node *a3)
{
@ -446,8 +492,10 @@ namespace night
result += this->compile(a3->offset_216);
return result;
}
int compile_prog_i = 0;
std::string NSCompileJs::compile_prog(night::ns_node *a3)
{
int inner_compile_prog_i = ++compile_prog_i;
std::string result = "";
std::string v9 = a3->offset_108;
if (v9.size() == 0)

View File

@ -11,8 +11,10 @@ namespace night
{
}
int peek_i= 0;
night::ns_node* NSToken::peek(void)
{
int inner_peek_i = ++peek_i;
auto result = this->offset_8;
if (!result)
{
@ -95,8 +97,10 @@ namespace night
return ret;
}
int next_i = 0;
night::ns_node* NSToken::next(void)
{
int inner_next_i = ++next_i; // 396
auto result = this->offset_8;
this->offset_8 = nullptr;
if (!result)
@ -222,7 +226,7 @@ namespace night
night::ns_node * NSToken::read_number(std::string const& a2)
{
int v8;
int v8 = 0;
auto v9 = this->read_while(night::NSToken::rw_cb_number, &v8);
auto v13 = this->offset_4->peek();
if (night::NSToken::tk_is_var_start(v13.data, nullptr))