From feac3c1cba6ca95b911240217f74a494680cd057 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Fri, 24 Apr 2020 16:17:44 +0800 Subject: fix errors when explicitly declaring global or local variable initialized with table block. --- src/MoonP/moon_ast.h | 5 +++-- src/MoonP/moon_compiler.cpp | 16 +++++++++++++--- src/MoonP/moon_parser.cpp | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/MoonP/moon_ast.h b/src/MoonP/moon_ast.h index 44a55a4..7ef25a9 100644 --- a/src/MoonP/moon_ast.h +++ b/src/MoonP/moon_ast.h @@ -98,10 +98,11 @@ AST_NODE(NameList) AST_END(NameList) class ExpListLow_t; +class TableBlock_t; AST_NODE(local_values) ast_ptr nameList; - ast_ptr valueList; + ast_sel valueList; AST_MEMBER(local_values, &nameList, &valueList) AST_END(local_values) @@ -533,7 +534,7 @@ AST_END(ClassDecl) AST_NODE(global_values) ast_ptr nameList; - ast_ptr valueList; + ast_sel valueList; AST_MEMBER(global_values, &nameList, &valueList) AST_END(global_values) diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index 80ab5a9..c9d9c78 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp @@ -43,7 +43,7 @@ inline std::string s(std::string_view sv) { } const std::string_view version() { - return "0.3.9"sv; + return "0.3.10"sv; } // name of table stored in lua registry @@ -4364,7 +4364,12 @@ private: auto assignment = x->new_ptr(); assignment->expList.set(expList); auto assign = x->new_ptr(); - assign->values.dup(values->valueList->exprs); + if (auto expListLow = values->valueList.as()) { + assign->values.dup(expListLow->exprs); + } else { + auto tableBlock = values->valueList.to(); + assign->values.push_back(tableBlock); + } assignment->action.set(assign); transformAssignment(assignment, out); } else { @@ -4993,7 +4998,12 @@ private: auto assignment = x->new_ptr(); assignment->expList.set(expList); auto assign = x->new_ptr(); - assign->values.dup(values->valueList->exprs); + if (auto expListLow = values->valueList.as()) { + assign->values.dup(expListLow->exprs); + } else { + auto tableBlock = values->valueList.to(); + assign->values.push_back(tableBlock); + } assignment->action.set(assign); transformAssignment(assignment, temp); } diff --git a/src/MoonP/moon_parser.cpp b/src/MoonP/moon_parser.cpp index 9208d3a..7de2a84 100644 --- a/src/MoonP/moon_parser.cpp +++ b/src/MoonP/moon_parser.cpp @@ -170,7 +170,7 @@ MoonParser::MoonParser() { InBlock = Advance >> ensure(Block, PopIndent); local_flag = expr('*') | expr('^'); - local_values = NameList >> -(sym('=') >> ExpListLow); + local_values = NameList >> -(sym('=') >> (TableBlock | ExpListLow)); Local = key("local") >> (Space >> local_flag | local_values); colon_import_name = sym('\\') >> Space >> Variable; @@ -419,7 +419,7 @@ MoonParser::MoonParser() { -(key("extends") >> PreventIndent >> ensure(Exp, PopIndent)) >> -ClassBlock; - global_values = NameList >> -(sym('=') >> ExpListLow); + global_values = NameList >> -(sym('=') >> (TableBlock | ExpListLow)); global_op = expr('*') | expr('^'); Global = key("global") >> (ClassDecl | (Space >> global_op) | global_values); -- cgit v1.2.3-55-g6feb