Skip to content

Commit d350d6e

Browse files
committed
Fix subscription of complex values
1 parent d15a74f commit d350d6e

File tree

3 files changed

+35
-25
lines changed

3 files changed

+35
-25
lines changed

src/expression_parser.cpp

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -276,21 +276,14 @@ ExpressionEvaluatorPtr<Expression> ExpressionParser::ParseUnaryPlusMinus(LexScan
276276
ExpressionEvaluatorPtr<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

315318
ExpressionEvaluatorPtr<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

src/expression_parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class ExpressionParser
2929
ExpressionEvaluatorPtr<Expression> ParseTuple(LexScanner& lexer);
3030
ExpressionEvaluatorPtr<Expression> ParseCall(LexScanner& lexer, ExpressionEvaluatorPtr<Expression> valueRef);
3131
CallParams ParseCallParams(LexScanner& lexer, bool& isValid);
32-
ExpressionEvaluatorPtr<Expression> ParseValueRef(LexScanner& lexer);
32+
ExpressionEvaluatorPtr<Expression> ParseSubscript(LexScanner& lexer, ExpressionEvaluatorPtr<Expression> valueRef);
3333
ExpressionEvaluatorPtr<ExpressionFilter> ParseFilterExpression(LexScanner& lexer);
3434
ExpressionEvaluatorPtr<IfExpression> ParseIfExpression(LexScanner& lexer);
3535

test/expressions_test.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,18 @@ INSTANTIATE_TEST_CASE_P(ComplexSubscriptionTest, ExpressionSubstitutionTest, ::t
147147
InputOutputPair{"mapValue.reflectedList[1]['intValue']", "1"},
148148
InputOutputPair{"mapValue['reflectedList'][1]['intValue']", "1"},
149149
InputOutputPair{"mapValue.reflectedList[1].intValue", "1"},
150+
InputOutputPair{"{'fieldName'='field', 'fieldValue'=10}.fieldName", "field"},
151+
InputOutputPair{"{'fieldName'='field', 'fieldValue'=10}['fieldValue']", "10"},
152+
InputOutputPair{R"( ([
153+
{'fieldName'='field1', 'fieldValue'=10},
154+
{'fieldName'='field2', 'fieldValue'=11},
155+
{'fieldName'='field3', 'fieldValue'=12}
156+
] | last).fieldValue)", "12"},
150157
InputOutputPair{"reflectedList[1].intValue", "1"},
158+
InputOutputPair{"(reflectedList[1]).intValue", "1"},
159+
InputOutputPair{"(reflectedList | first).intValue", "0"},
151160
InputOutputPair{"reflectedList[1].strValue[0]", "t"},
161+
InputOutputPair{"(reflectedList[1]).strValue[0]", "t"},
162+
InputOutputPair{"(reflectedList | first).strValue[0]", "t"},
152163
InputOutputPair{"reflectedVal.strValue[0]", "t"}
153164
));

0 commit comments

Comments
 (0)