diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 167138c..924af07 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -984,6 +984,7 @@ namespace MalachScript::Parser { if (current->GetKind() != LexTokenKind::DoKeyword) { return false; } + PROGRESS_TOKEN(current); ScopedPtr body = nullptr; if (!ParseStatement(body, current, log)) { logError(DiagnosticType::UnexpectedToken, current->GetSpan()); @@ -1003,4 +1004,29 @@ namespace MalachScript::Parser { currentToken = current; return true; } + bool Parser::ParseTryStatement(ScopedPtr& out, const LexToken*& currentToken, + const Parser::log_func& log) { + const auto* current = currentToken; + if (current->GetKind() != LexTokenKind::TryKeyword) { + return false; + } + PROGRESS_TOKEN(current); + + ScopedPtr tryStatement = nullptr; + if (!ParseStatBlock(tryStatement, current, log)) { + logError(DiagnosticType::UnexpectedToken, current->GetSpan()); + return false; + } + EXPECT_TOKEN(current, CatchKeyword); + ScopedPtr catchStatement = nullptr; + if (!ParseStatBlock(catchStatement, current, log)) { + logError(DiagnosticType::UnexpectedToken, current->GetSpan()); + return false; + } + + out = new ParsedTryStatement(TextSpan(currentToken->GetSpan().GetStart(), current->GetSpan().GetEnd()), + tryStatement.TakeOwnership(), catchStatement.TakeOwnership()); + currentToken = current; + return true; + } } \ No newline at end of file diff --git a/src/Parser/Parser.hpp b/src/Parser/Parser.hpp index aa23b2e..73b9ace 100644 --- a/src/Parser/Parser.hpp +++ b/src/Parser/Parser.hpp @@ -158,7 +158,8 @@ namespace MalachScript::Parser { const log_func&); static bool ParseDoWhileStatement(ScopedPtr& out, const LexToken*& currentToken, const log_func&); - // Try + static bool ParseTryStatement(ScopedPtr& out, const LexToken*& currentToken, + const log_func&); // Case // Switch diff --git a/src/Parser/Statements/ParsedStatement.hpp b/src/Parser/Statements/ParsedStatement.hpp index 270554d..8330eac 100644 --- a/src/Parser/Statements/ParsedStatement.hpp +++ b/src/Parser/Statements/ParsedStatement.hpp @@ -369,7 +369,7 @@ namespace MalachScript::Parser { ParsedContinueStatement(const TextSpan& span) : ParsedStatementImpl(span) {} }; - class ParsedBreakStatement : public ParsedStatementImpl { + class ParsedBreakStatement : public ParsedStatementImpl { public: ParsedBreakStatement(const TextSpan& span) : ParsedStatementImpl(span) {} }; @@ -407,6 +407,7 @@ namespace MalachScript::Parser { std::unique_ptr _condition; std::unique_ptr _body; }; + class ParsedDoWhileStatement : public ParsedStatementImpl { public: ParsedDoWhileStatement(const TextSpan& span, const ParsedStatement* condition, const ParsedStatement* body) @@ -417,6 +418,17 @@ namespace MalachScript::Parser { std::unique_ptr _body; }; + class ParsedTryStatement : public ParsedStatementImpl { + public: + ParsedTryStatement(const TextSpan& span, const ParsedStatement* tryStatement, + const ParsedStatement* catchStatement) + : ParsedStatementImpl(span), _tryStatement(tryStatement), _catchStatement(catchStatement) {} + + private: + std::unique_ptr _tryStatement; + std::unique_ptr _catchStatement; + }; + } #endif // MALACHSCRIPT_PARSEDSTATEMENT_HPP diff --git a/src/Parser/Statements/ParsedStatementKind.hpp b/src/Parser/Statements/ParsedStatementKind.hpp index 978de0b..3acdebc 100644 --- a/src/Parser/Statements/ParsedStatementKind.hpp +++ b/src/Parser/Statements/ParsedStatementKind.hpp @@ -26,7 +26,8 @@ namespace MalachScript::Parser { Break, For, While, - DoWhile + DoWhile, + Try }; }