From 0c8b9f394361179fb3c55015b9c9eedf750a4db1 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 15 Nov 2020 10:21:42 +0100 Subject: [PATCH] Adds parsing continue and break. --- src/Parser/Parser.cpp | 20 +++++++++++++++++++ src/Parser/Parser.hpp | 4 ++-- src/Parser/Statements/ParsedStatement.hpp | 11 ++++++++++ src/Parser/Statements/ParsedStatementKind.hpp | 2 ++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 829824e..db7ccfe 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -893,4 +893,24 @@ namespace MalachScript::Parser { } return false; } + bool Parser::ParseContinue(const ParsedStatement*& out, const LexToken*& currentToken) { + if (currentToken->GetKind() == LexTokenKind::ContinueKeyword) { + return false; + } + auto start = currentToken->GetSpan().GetStart(); + PROGRESS_TOKEN(currentToken); + EXPECT_TOKEN(currentToken, SemicolonSymbol); + out = new ParsedContinueStatement(TextSpan(start, currentToken->GetSpan().GetEnd())); + return true; + } + bool Parser::ParseBreak(const ParsedStatement*& out, const LexToken*& currentToken) { + if (currentToken->GetKind() == LexTokenKind::BreakKeyword) { + return false; + } + auto start = currentToken->GetSpan().GetStart(); + PROGRESS_TOKEN(currentToken); + EXPECT_TOKEN(currentToken, SemicolonSymbol); + out = new ParsedBreakStatement(TextSpan(start, currentToken->GetSpan().GetEnd())); + return true; + } } \ No newline at end of file diff --git a/src/Parser/Parser.hpp b/src/Parser/Parser.hpp index 2a03942..9b3862a 100644 --- a/src/Parser/Parser.hpp +++ b/src/Parser/Parser.hpp @@ -146,8 +146,8 @@ namespace MalachScript::Parser { bool ParseReturn(const ParsedStatement*& out, const LexToken*& currentToken); bool ParseExprStat(const ParsedStatement*& out, const LexToken*& currentToken); - // Continue - // Break + bool ParseContinue(const ParsedStatement*& out, const LexToken*& currentToken); + bool ParseBreak(const ParsedStatement*& out, const LexToken*& currentToken); bool ParseIfStatement(const ParsedStatement*& out, const LexToken*& currentToken); // For diff --git a/src/Parser/Statements/ParsedStatement.hpp b/src/Parser/Statements/ParsedStatement.hpp index fa03d78..eeafe5b 100644 --- a/src/Parser/Statements/ParsedStatement.hpp +++ b/src/Parser/Statements/ParsedStatement.hpp @@ -359,6 +359,17 @@ namespace MalachScript::Parser { private: std::unique_ptr _statement; }; + + class ParsedContinueStatement : public ParsedStatementImpl { + public: + ParsedContinueStatement(const TextSpan& span) : ParsedStatementImpl(span) {} + }; + + class ParsedBreakStatement : public ParsedStatementImpl { + public: + ParsedBreakStatement(const TextSpan& span) : ParsedStatementImpl(span) {} + }; + } #endif // MALACHSCRIPT_PARSEDSTATEMENT_HPP diff --git a/src/Parser/Statements/ParsedStatementKind.hpp b/src/Parser/Statements/ParsedStatementKind.hpp index c37e84c..0de3c34 100644 --- a/src/Parser/Statements/ParsedStatementKind.hpp +++ b/src/Parser/Statements/ParsedStatementKind.hpp @@ -22,6 +22,8 @@ namespace MalachScript::Parser { VarAccess, Increment, Decrement, + Continue, + Break, }; }