diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp index 61ba912a567c4a6d868d22cc7915e7557f484518..fb3b1d74abf6ba0d33113ec95996c6a270edb77d 100644 --- a/src/language/PEGGrammar.hpp +++ b/src/language/PEGGrammar.hpp @@ -229,7 +229,10 @@ struct expression : logical_or {}; struct tuple_expression : seq< open_parent, expression, plus< if_must< COMMA, expression > >, close_parent >{}; -struct expression_list : seq< open_parent, sor< tuple_expression, expression >, plus< if_must< COMMA, sor< tuple_expression, expression > > >, close_parent >{}; +struct expression_list : seq< open_parent, sor< seq< tuple_expression, + star< if_must< COMMA, sor< tuple_expression, expression > > > >, + seq< expression, + plus< if_must< COMMA, sor< tuple_expression, expression > > > > >, close_parent >{}; struct affect_op : sor< eq_op, multiplyeq_op, divideeq_op, pluseq_op, minuseq_op > {}; diff --git a/src/language/ast/ASTBuilder.cpp b/src/language/ast/ASTBuilder.cpp index cef779ffce63b9c2ad808ca94b993e7eff59d4ff..57db204973de150fa86b4070f8704e8ac71f6a40 100644 --- a/src/language/ast/ASTBuilder.cpp +++ b/src/language/ast/ASTBuilder.cpp @@ -138,11 +138,16 @@ struct ASTBuilder::simplify_node_list : parse_tree::apply<ASTBuilder::simplify_n transform(std::unique_ptr<ASTNode>& n, States&&... st) { if (n->is_type<language::name_list>() or n->is_type<language::lvalue_list>() or - n->is_type<language::function_argument_list>() or n->is_type<language::expression_list>()) { + n->is_type<language::function_argument_list>()) { if (n->children.size() == 1) { n = std::move(n->children.back()); transform(n, st...); } + } else if (n->is_type<language::expression_list>()) { + if ((n->children.size() == 1) and (not n->children[0]->is_type<language::tuple_expression>())) { + n = std::move(n->children.back()); + transform(n, st...); + } } } };