@@ -276,21 +276,14 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseUnaryPlusMinus(LexScan
276276ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseValueExpression (LexScanner& lexer)
277277{
278278 Token tok = lexer.NextToken ();
279+
280+ ExpressionEvaluatorPtr<Expression> valueRef;
279281
280282 switch (tok.type )
281283 {
282284 case Token::Identifier:
283- {
284- lexer.ReturnToken ();
285- auto valueRef = ParseValueRef (lexer);
286-
287- if (lexer.EatIfEqual (' (' ))
288- {
289- return ParseCall (lexer, valueRef);
290- }
291-
292- return valueRef;
293- }
285+ valueRef = std::make_shared<ValueRefExpression>(AsString (tok.value ));
286+ break ;
294287 case Token::IntegerNum:
295288 case Token::FloatNum:
296289 case Token::String:
@@ -300,16 +293,26 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseValueExpression(LexSca
300293 case Token::False:
301294 return std::make_shared<ConstantExpression>(InternalValue (false ));
302295 case ' (' :
303- return ParseBracedExpressionOrTuple (lexer);
296+ valueRef = ParseBracedExpressionOrTuple (lexer);
297+ break ;
304298 case ' [' :
305- return ParseTuple (lexer);
299+ valueRef = ParseTuple (lexer);
300+ break ;
306301 case ' {' :
307- return ParseDictionary (lexer);
302+ valueRef = ParseDictionary (lexer);
303+ break ;
308304 }
309305
310- ExpressionEvaluatorPtr<Expression> result;
311-
312- return result;
306+ if (valueRef)
307+ {
308+ tok = lexer.PeekNextToken ();
309+ if (tok == ' [' || tok == ' .' )
310+ valueRef = ParseSubscript (lexer, valueRef);
311+
312+ if (lexer.EatIfEqual (' (' ))
313+ valueRef = ParseCall (lexer, valueRef);
314+ }
315+ return valueRef;
313316}
314317
315318ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseBracedExpressionOrTuple (LexScanner& lexer)
@@ -444,21 +447,17 @@ CallParams ExpressionParser::ParseCallParams(LexScanner& lexer, bool& isValid)
444447 return result;
445448}
446449
447- ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseValueRef (LexScanner& lexer)
450+ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseSubscript (LexScanner& lexer, ExpressionEvaluatorPtr<Expression> valueRef )
448451{
449- Token tok = lexer.NextToken ();
450- auto valueName = AsString (tok.value );
451- ExpressionEvaluatorPtr<Expression> valueRef = std::make_shared<ValueRefExpression>(valueName);
452-
453- for (tok = lexer.NextToken (); tok.type == ' .' || tok.type == ' [' ; tok = lexer.NextToken ())
452+ for (Token tok = lexer.NextToken (); tok.type == ' .' || tok.type == ' [' ; tok = lexer.NextToken ())
454453 {
455454 ExpressionEvaluatorPtr<Expression> indexExpr;
456455 if (tok == ' .' )
457456 {
458457 tok = lexer.NextToken ();
459458 if (tok.type != Token::Identifier)
460459 return ExpressionEvaluatorPtr<>();
461- valueName = AsString (tok.value );
460+ auto valueName = AsString (tok.value );
462461 indexExpr = std::make_shared<ConstantExpression>(InternalValue (valueName));
463462 }
464463 else
0 commit comments