From dfd4e3b2b2abc0137d26ed3df303a398741bb6a0 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Fri, 11 Sep 2020 14:55:22 +0800 Subject: add implicit objects support while writing tables. --- src/MoonP/moon_ast.h | 8 +++++++- src/MoonP/moon_compiler.cpp | 7 ++++++- src/MoonP/moon_parser.cpp | 10 ++++++---- src/MoonP/moon_parser.h | 1 + 4 files changed, 20 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/MoonP/moon_ast.h b/src/MoonP/moon_ast.h index 91d7614..16f7801 100644 --- a/src/MoonP/moon_ast.h +++ b/src/MoonP/moon_ast.h @@ -527,9 +527,15 @@ AST_NODE(TableLit) AST_MEMBER(TableLit, &sep, &values) AST_END(TableLit) +AST_NODE(TableBlockIndent) + ast_ptr sep; + ast_sel_list values; + AST_MEMBER(TableBlockIndent, &sep, &values) +AST_END(TableBlockIndent) + AST_NODE(TableBlock) ast_ptr sep; - ast_sel_list values; + ast_sel_list values; AST_MEMBER(TableBlock, &sep, &values) AST_END(TableBlock) diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index 2f16fff..406b412 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp @@ -49,7 +49,7 @@ inline std::string s(std::string_view sv) { } const std::string_view version() { - return "0.4.10"sv; + return "0.4.12"sv; } // name of table stored in lua registry @@ -4608,6 +4608,7 @@ private: case id(): transformExp(static_cast(pair), temp, ExpUsage::Closure); break; case id(): transform_variable_pair(static_cast(pair), temp); break; case id(): transform_normal_pair(static_cast(pair), temp); break; + case id(): transformTableBlockIndent(static_cast(pair), temp); break; default: assert(false); break; } temp.back() = indent() + temp.back() + (pair == pairs.back() ? Empty : s(","sv)) + nll(pair); @@ -4728,6 +4729,10 @@ private: addToScope(varName); } + void transformTableBlockIndent(TableBlockIndent_t* table, str_list& out) { + transformTable(table, table->values.objects(), out); + } + void transformTableBlock(TableBlock_t* table, str_list& out) { transformTable(table, table->values.objects(), out); } diff --git a/src/MoonP/moon_parser.cpp b/src/MoonP/moon_parser.cpp index a13a779..53a6b8f 100644 --- a/src/MoonP/moon_parser.cpp +++ b/src/MoonP/moon_parser.cpp @@ -430,12 +430,14 @@ MoonParser::MoonParser() { Space ); - TableBlockInner = Seperator >> KeyValueLine >> *(+(SpaceBreak) >> KeyValueLine); - TableBlock = +(SpaceBreak) >> Advance >> ensure(TableBlockInner, PopIndent); + TableBlockInner = Seperator >> KeyValueLine >> *(+SpaceBreak >> KeyValueLine); + TableBlock = +SpaceBreak >> Advance >> ensure(TableBlockInner, PopIndent); + TableBlockIndent = sym('#') >> Seperator >> KeyValueList >> -sym(',') >> + -(+SpaceBreak >> Advance >> ensure(KeyValueList >> -sym(',') >> *(+SpaceBreak >> KeyValueLine), PopIndent)); class_member_list = Seperator >> KeyValue >> *(sym(',') >> KeyValue); ClassLine = CheckIndent >> (class_member_list | Statement) >> -sym(','); - ClassBlock = +(SpaceBreak) >> Advance >>Seperator >> ClassLine >> *(+(SpaceBreak) >> ClassLine) >> PopIndent; + ClassBlock = +SpaceBreak >> Advance >> Seperator >> ClassLine >> *(+SpaceBreak >> ClassLine) >> PopIndent; ClassDecl = key("class") >> not_(expr(':')) >> @@ -489,7 +491,7 @@ MoonParser::MoonParser() { }); KeyValueList = KeyValue >> *(sym(',') >> KeyValue); - KeyValueLine = CheckIndent >> KeyValueList >> -sym(','); + KeyValueLine = CheckIndent >> (KeyValueList >> -sym(',') | TableBlockIndent); FnArgDef = (Variable | SelfName) >> -(sym('=') >> Space >> Exp); diff --git a/src/MoonP/moon_parser.h b/src/MoonP/moon_parser.h index c6a03f8..6b7f224 100644 --- a/src/MoonP/moon_parser.h +++ b/src/MoonP/moon_parser.h @@ -264,6 +264,7 @@ private: AST_RULE(existential_op) AST_RULE(TableLit) AST_RULE(TableBlock) + AST_RULE(TableBlockIndent) AST_RULE(class_member_list) AST_RULE(ClassBlock) AST_RULE(ClassDecl) -- cgit v1.2.3-55-g6feb