diff --git a/src/ast/expressions.hpp b/src/ast/expressions.hpp index 0cb9de9..a35188b 100644 --- a/src/ast/expressions.hpp +++ b/src/ast/expressions.hpp @@ -190,4 +190,24 @@ struct Dict : Expr } return oss.str(); } +}; + +struct Tuple : Expr +{ + std::vector> elements; + + Tuple(std::vector> elems) + : elements(std::move(elems)) {} + + std::string dump(int indent = 0) const override + { + std::ostringstream oss; + oss << indent_str(indent) << "Tuple"; + for (const auto &elem : elements) + { + oss << "\n" + << elem->dump(indent + 1); + } + return oss.str(); + } }; \ No newline at end of file diff --git a/src/parser.y b/src/parser.y index 55d06cc..a7a72cb 100644 --- a/src/parser.y +++ b/src/parser.y @@ -57,6 +57,7 @@ %type > slice %type > stmt %type >> args +%type >> tuple %type >> stmt_list %type > params @@ -110,6 +111,7 @@ expr: | expr L_PAREN args R_PAREN { $$ = std::make_unique(std::move($1), std::move($3));} | expr DOT IDENTIFIER { $$ = std::make_unique(std::move($1), $3);} | L_BRACKET args R_BRACKET { $$ = std::make_unique(std::move($2));} + | L_PAREN tuple R_PAREN { $$ = std::make_unique(std::move($2));} | MINUS expr { $$ = std::make_unique(UnaryOperator(UnaryOperator::NEG), std::move($2));} ; @@ -131,6 +133,11 @@ args: | args COMMA expr { $1.push_back(std::move($3)); $$ = std::move($1); } ; +tuple: + expr { $$ = std::vector>(); + $$.push_back(std::move($1)); } + | tuple COMMA expr { $1.push_back(std::move($3)); $$ = std::move($1); } + params: { $$ = std::vector();} | IDENTIFIER { $$ = std::vector(); $$.push_back($1); } diff --git a/test/parser/23.out b/test/parser/23.out index d740c0f..cc3a9b0 100644 --- a/test/parser/23.out +++ b/test/parser/23.out @@ -3,5 +3,4 @@ Module Tuple Number(1) Number(2) - Number(3) - + Number(3) \ No newline at end of file