@@ -132,7 +132,7 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseLogicalCompare(LexScan
132132
133133 std::string name = tok.value .asString ();
134134 bool valid = true ;
135- CallParamsList params;
135+ CallParams params;
136136
137137 if (lexer.NextToken () == ' (' )
138138 params = ParseCallParams (lexer, valid);
@@ -314,6 +314,8 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseValueExpression(LexSca
314314 return std::make_shared<ConstantExpression>(Value (false ));
315315 case ' (' :
316316 return ParseBracedExpressionOrTuple (lexer);
317+ case ' [' :
318+ return ParseTuple (lexer);
317319 case ' {' :
318320 return ParseDictionary (lexer);
319321 }
@@ -355,6 +357,51 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseDictionary(LexScanner&
355357{
356358 ExpressionEvaluatorPtr<Expression> result;
357359
360+ std::unordered_map<std::string, ExpressionEvaluatorPtr<Expression>> items;
361+ while (lexer.NextToken () != ' }' )
362+ {
363+ lexer.ReturnToken ();;
364+ Token key = lexer.NextToken ();
365+ if (key != Token::String)
366+ return result;
367+
368+ if (lexer.NextToken () != ' =' )
369+ return result;
370+
371+ auto expr = ParseFullExpression (lexer);
372+ if (!expr)
373+ return result;
374+
375+ items[key.value .asString ()] = expr;
376+
377+ if (lexer.PeekNextToken () == ' ,' )
378+ lexer.EatToken ();
379+ }
380+
381+ result = std::make_shared<DictionaryCreator>(std::move (items));
382+
383+ return result;
384+ }
385+
386+ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseTuple (LexScanner& lexer)
387+ {
388+ ExpressionEvaluatorPtr<Expression> result;
389+
390+ std::vector<ExpressionEvaluatorPtr<Expression>> exprs;
391+ while (lexer.NextToken () != ' ]' )
392+ {
393+ lexer.ReturnToken ();
394+ auto expr = ParseFullExpression (lexer);
395+ if (!expr)
396+ return result;
397+
398+ exprs.push_back (expr);
399+ if (lexer.PeekNextToken () == ' ,' )
400+ lexer.EatToken ();
401+ }
402+
403+ result = std::make_shared<TupleCreator>(std::move (exprs));
404+
358405 return result;
359406}
360407
@@ -390,11 +437,11 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseCall(LexScanner& lexer
390437 return result;
391438}
392439
393- std::unordered_map<std::string, ExpressionEvaluatorPtr<> > ExpressionParser::ParseCallParams (LexScanner& lexer, bool & isValid)
440+ CallParams ExpressionParser::ParseCallParams (LexScanner& lexer, bool & isValid)
394441{
395- std::unordered_map<std::string, ExpressionEvaluatorPtr<> > result;
442+ CallParams result;
396443
397- int posParamId = 0 ;
444+ isValid = true ;
398445 while (lexer.NextToken () != ' )' )
399446 {
400447 lexer.ReturnToken ();
@@ -408,9 +455,6 @@ std::unordered_map<std::string, ExpressionEvaluatorPtr<> > ExpressionParser::Par
408455 else
409456 {
410457 lexer.ReturnToken ();
411- std::ostringstream str;
412- str << " param" << posParamId ++;
413- paramName = str.str ();
414458 }
415459
416460 auto valueExpr = ParseFullExpression (lexer);
@@ -419,7 +463,11 @@ std::unordered_map<std::string, ExpressionEvaluatorPtr<> > ExpressionParser::Par
419463 isValid = false ;
420464 return result;
421465 }
422- result[paramName] = valueExpr;
466+ if (paramName.empty ())
467+ result.posParams .push_back (valueExpr);
468+ else
469+ result.kwParams [paramName] = valueExpr;
470+
423471 if (lexer.PeekNextToken () == ' ,' )
424472 lexer.EatToken ();
425473 }
@@ -463,7 +511,7 @@ ExpressionEvaluatorPtr<ExpressionFilter> ExpressionParser::ParseFilterExpression
463511
464512 std::string name = tok.value .asString ();
465513 bool valid = true ;
466- std::unordered_map<std::string, ExpressionEvaluatorPtr<>> params;
514+ CallParams params;
467515
468516 if (lexer.NextToken () == ' (' )
469517 params = ParseCallParams (lexer, valid);
0 commit comments