@@ -32,6 +32,9 @@ StatementsParser::ParseResult StatementsParser::Parse(LexScanner& lexer, Stateme
3232 case Keyword::Set:
3333 result = ParseSet (lexer, statementsInfo, tok);
3434 break ;
35+ case Keyword::EndSet:
36+ result = ParseEndSet (lexer, statementsInfo, tok);
37+ break ;
3538 case Keyword::Block:
3639 result = ParseBlock (lexer, statementsInfo, tok);
3740 break ;
@@ -79,8 +82,6 @@ StatementsParser::ParseResult StatementsParser::Parse(LexScanner& lexer, Stateme
7982 case Keyword::EndFilter:
8083 result = ParseEndFilter (lexer, statementsInfo, tok);
8184 break ;
82- case Keyword::EndSet:
83- return MakeParseError (ErrorCode::YetUnsupported, tok);
8485 default :
8586 return MakeParseError (ErrorCode::UnexpectedToken, tok);
8687 }
@@ -320,30 +321,60 @@ StatementsParser::ParseResult StatementsParser::ParseSet(LexScanner& lexer, Stat
320321 if (vars.empty ())
321322 return MakeParseError (ErrorCode::ExpectedIdentifier, lexer.PeekNextToken ());
322323
323- auto operTok = lexer.NextToken ();
324- ExpressionEvaluatorPtr<> valueExpr;
325- if (operTok == ' =' )
324+ ExpressionParser exprParser (m_settings);
325+ if (lexer.EatIfEqual (' =' ))
326326 {
327- ExpressionParser exprParser (m_settings);
328- auto expr = exprParser.ParseFullExpression (lexer);
327+ const auto expr = exprParser.ParseFullExpression (lexer);
329328 if (!expr)
330329 return expr.get_unexpected ();
331- valueExpr = *expr;
330+ statementsInfo.back ().currentComposition ->AddRenderer (
331+ std::make_shared<SetLineStatement>(std::move (vars), *expr));
332+ }
333+ else if (lexer.EatIfEqual (' |' ))
334+ {
335+ const auto expr = exprParser.ParseFilterExpression (lexer);
336+ if (!expr)
337+ return expr.get_unexpected ();
338+ auto statementInfo = StatementInfo::Create (
339+ StatementInfo::SetStatement, stmtTok);
340+ statementInfo.renderer = std::make_shared<SetFilteredBlockStatement>(
341+ std::move (vars), *expr);
342+ statementsInfo.push_back (std::move (statementInfo));
332343 }
333344 else
334- return MakeParseError (ErrorCode::YetUnsupported, operTok, {stmtTok}); // TODO: Add handling of the block assignments
335-
336- auto renderer = std::make_shared<SetStatement>(vars);
337- renderer->SetAssignmentExpr (valueExpr);
338- statementsInfo.back ().currentComposition ->AddRenderer (renderer);
345+ {
346+ auto operTok = lexer.NextToken ();
347+ if (lexer.NextToken () != Token::Eof)
348+ return MakeParseError (ErrorCode::YetUnsupported, operTok, {std::move (stmtTok)});
349+ auto statementInfo = StatementInfo::Create (
350+ StatementInfo::SetStatement, stmtTok);
351+ statementInfo.renderer = std::make_shared<SetRawBlockStatement>(
352+ std::move (vars));
353+ statementsInfo.push_back (std::move (statementInfo));
354+ }
339355
340- return ParseResult () ;
356+ return {} ;
341357}
342358
343- StatementsParser::ParseResult StatementsParser::ParseEndSet (LexScanner& /* lexer*/ , StatementInfoList& /* statementsInfo*/
359+ StatementsParser::ParseResult StatementsParser::ParseEndSet (LexScanner&
360+ , StatementInfoList& statementsInfo
344361 , const Token& stmtTok)
345362{
346- return MakeParseError (ErrorCode::YetUnsupported, stmtTok);
363+ if (statementsInfo.size () <= 1 )
364+ return MakeParseError (ErrorCode::UnexpectedStatement, stmtTok);
365+
366+ const auto info = statementsInfo.back ();
367+ if (info.type != StatementInfo::SetStatement)
368+ return MakeParseError (ErrorCode::UnexpectedStatement, stmtTok);
369+
370+ auto &renderer = *boost::polymorphic_downcast<SetBlockStatement*>(
371+ info.renderer .get ());
372+ renderer.SetBody (info.compositions [0 ]);
373+
374+ statementsInfo.pop_back ();
375+ statementsInfo.back ().currentComposition ->AddRenderer (info.renderer );
376+
377+ return {};
347378}
348379
349380StatementsParser::ParseResult StatementsParser::ParseBlock (LexScanner& lexer, StatementInfoList& statementsInfo
@@ -915,10 +946,10 @@ StatementsParser::ParseResult StatementsParser::ParseFilter(LexScanner& lexer, S
915946
916947StatementsParser::ParseResult StatementsParser::ParseEndFilter (LexScanner&, StatementInfoList& statementsInfo, const Token& stmtTok)
917948{
918- if (statementsInfo.size () <= 1 )
949+ if (statementsInfo.size () <= 1 )
919950 return MakeParseError (ErrorCode::UnexpectedStatement, stmtTok);
920951
921- auto info = statementsInfo.back ();
952+ const auto info = statementsInfo.back ();
922953 if (info.type != StatementInfo::FilterStatement)
923954 {
924955 return MakeParseError (ErrorCode::UnexpectedStatement, stmtTok);
0 commit comments