@@ -280,31 +280,13 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseValueExpression(LexSca
280280 {
281281 lexer.ReturnToken ();
282282 auto valueRef = ParseValueRef (lexer);
283- if (valueRef.empty ())
284- return ExpressionEvaluatorPtr<Expression>();
285283
286- Token nextTok = lexer.NextToken ();
287- if (nextTok == ' [' )
288- {
289- return ParseSubsicpt (lexer, valueRef);
290- }
291- else if (nextTok == ' (' )
284+ if (lexer.EatIfEqual (' (' ))
292285 {
293286 return ParseCall (lexer, valueRef);
294287 }
295288
296- lexer.ReturnToken ();
297-
298- ExpressionEvaluatorPtr<Expression> baseValueRef = std::make_shared<ValueRefExpression>(valueRef[0 ]);
299- if (valueRef.size () != 1 )
300- {
301- for (size_t i = 1 ; i < valueRef.size (); ++ i)
302- {
303- auto indexExpr = std::make_shared<ConstantExpression>(InternalValue (valueRef[i]));
304- baseValueRef = std::make_shared<SubscriptExpression>(baseValueRef, indexExpr);
305- }
306- }
307- return baseValueRef;
289+ return valueRef;
308290 }
309291 case Token::IntegerNum:
310292 case Token::FloatNum:
@@ -407,32 +389,7 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseTuple(LexScanner& lexe
407389 return result;
408390}
409391
410- ExpressionEvaluatorPtr<SubscriptExpression> ExpressionParser::ParseSubsicpt (LexScanner& lexer, const std::vector<std::string>& valueRef)
411- {
412- ExpressionEvaluatorPtr<SubscriptExpression> result;
413-
414- auto finalIndexExpr = ParseFullExpression (lexer);
415- if (!finalIndexExpr || lexer.PeekNextToken () != ' ]' )
416- return result;
417-
418- lexer.EatToken ();
419-
420- ExpressionEvaluatorPtr<Expression> baseValueRef = std::make_shared<ValueRefExpression>(valueRef[0 ]);
421- if (valueRef.size () != 1 )
422- {
423- for (size_t i = 1 ; i < valueRef.size (); ++ i)
424- {
425- auto indexExpr = std::make_shared<ConstantExpression>(InternalValue (valueRef[i]));
426- baseValueRef = std::make_shared<SubscriptExpression>(baseValueRef, indexExpr);
427- }
428- }
429-
430- result = std::make_shared<SubscriptExpression>(baseValueRef, finalIndexExpr);
431-
432- return result;
433- }
434-
435- ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseCall (LexScanner& lexer, const std::vector<std::string>& valueRef)
392+ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseCall (LexScanner& lexer, ExpressionEvaluatorPtr<Expression> valueRef)
436393{
437394 ExpressionEvaluatorPtr<Expression> result;
438395
@@ -484,25 +441,37 @@ CallParams ExpressionParser::ParseCallParams(LexScanner& lexer, bool& isValid)
484441 return result;
485442}
486443
487- std::vector<std::string > ExpressionParser::ParseValueRef (LexScanner& lexer)
444+ ExpressionEvaluatorPtr<Expression > ExpressionParser::ParseValueRef (LexScanner& lexer)
488445{
489446 Token tok = lexer.NextToken ();
490447 auto valueName = AsString (tok.value );
448+ ExpressionEvaluatorPtr<Expression> valueRef = std::make_shared<ValueRefExpression>(valueName);
491449
492- std::vector<std::string> result;
493- result.push_back (valueName);
494-
495- while (lexer.NextToken () == ' .' )
450+ for (tok = lexer.NextToken (); tok.type == ' .' || tok.type == ' [' ; tok = lexer.NextToken ())
496451 {
497- tok = lexer.NextToken ();
498- if (tok != Token::Identifier)
499- return std::vector<std::string>();
452+ ExpressionEvaluatorPtr<Expression> indexExpr;
453+ if (tok == ' .' )
454+ {
455+ tok = lexer.NextToken ();
456+ if (tok.type != Token::Identifier)
457+ return ExpressionEvaluatorPtr<>();
458+ valueName = AsString (tok.value );
459+ indexExpr = std::make_shared<ConstantExpression>(InternalValue (valueName));
460+ }
461+ else
462+ {
463+ indexExpr = ParseFullExpression (lexer);
500464
501- result.push_back (AsString (tok.value ));
465+ if (!indexExpr || !lexer.EatIfEqual (' ]' ))
466+ return ExpressionEvaluatorPtr<>();
467+ }
468+
469+ valueRef = std::make_shared<SubscriptExpression>(valueRef, indexExpr);
502470 }
471+
503472 lexer.ReturnToken ();
504473
505- return result ;
474+ return valueRef ;
506475}
507476
508477ExpressionEvaluatorPtr<ExpressionFilter> ExpressionParser::ParseFilterExpression (LexScanner& lexer)
0 commit comments