Implements parsing dowhile statements
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
037470a0ce
commit
dd2722d485
@ -555,6 +555,7 @@ namespace MalachScript::Parser {
|
|||||||
case LexTokenKind::ReturnKeyword: return ParseReturn(out, currentToken);
|
case LexTokenKind::ReturnKeyword: return ParseReturn(out, currentToken);
|
||||||
case LexTokenKind::BreakKeyword: return ParseBreak(out, currentToken);
|
case LexTokenKind::BreakKeyword: return ParseBreak(out, currentToken);
|
||||||
case LexTokenKind::ContinueKeyword: return ParseContinue(out, currentToken);
|
case LexTokenKind::ContinueKeyword: return ParseContinue(out, currentToken);
|
||||||
|
case LexTokenKind::DoKeyword: return ParseDoWhileStatement(out, currentToken);
|
||||||
default: return ParseStatBlock(out, currentToken) || ParseExprStat(out, currentToken);
|
default: return ParseStatBlock(out, currentToken) || ParseExprStat(out, currentToken);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -944,4 +945,28 @@ namespace MalachScript::Parser {
|
|||||||
currentToken = current;
|
currentToken = current;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
bool Parser::ParseDoWhileStatement(ScopedPtr<const ParsedStatement>& out, const LexToken*& currentToken) {
|
||||||
|
const auto* current = currentToken;
|
||||||
|
if (current->GetKind() != LexTokenKind::DoKeyword) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ScopedPtr<const ParsedStatement> body = nullptr;
|
||||||
|
if (!ParseStatement(body, current)) {
|
||||||
|
LogError(Diagnostics::DiagnosticType::UnexpectedToken, current->GetSpan());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EXPECT_TOKEN(current, WhileKeyword);
|
||||||
|
EXPECT_TOKEN(current, OpenParenthesisSymbol);
|
||||||
|
ScopedPtr<const ParsedStatement> condition = nullptr;
|
||||||
|
if (!ParseAssign(condition, current)) {
|
||||||
|
LogError(Diagnostics::DiagnosticType::UnexpectedToken, current->GetSpan());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EXPECT_TOKEN(current, CloseParenthesisSymbol);
|
||||||
|
EXPECT_TOKEN(current, SemicolonSymbol);
|
||||||
|
out = new ParsedDoWhileStatement(TextSpan(currentToken->GetSpan().GetStart(), current->GetSpan().GetEnd()),
|
||||||
|
condition.TakeOwnership(), body.TakeOwnership());
|
||||||
|
currentToken = current;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
@ -153,7 +153,7 @@ namespace MalachScript::Parser {
|
|||||||
bool ParseIfStatement(ScopedPtr<const ParsedStatement>& out, const LexToken*& currentToken);
|
bool ParseIfStatement(ScopedPtr<const ParsedStatement>& out, const LexToken*& currentToken);
|
||||||
bool ParseForStatement(ScopedPtr<const ParsedStatement>& out, const LexToken*& currentToken);
|
bool ParseForStatement(ScopedPtr<const ParsedStatement>& out, const LexToken*& currentToken);
|
||||||
bool ParseWhileStatement(ScopedPtr<const ParsedStatement>& out, const LexToken*& currentToken);
|
bool ParseWhileStatement(ScopedPtr<const ParsedStatement>& out, const LexToken*& currentToken);
|
||||||
// DoWhile
|
bool ParseDoWhileStatement(ScopedPtr<const ParsedStatement>& out, const LexToken*& currentToken);
|
||||||
// Try
|
// Try
|
||||||
// Case
|
// Case
|
||||||
// Switch
|
// Switch
|
||||||
|
@ -403,6 +403,15 @@ namespace MalachScript::Parser {
|
|||||||
std::unique_ptr<const ParsedStatement> _condition;
|
std::unique_ptr<const ParsedStatement> _condition;
|
||||||
std::unique_ptr<const ParsedStatement> _body;
|
std::unique_ptr<const ParsedStatement> _body;
|
||||||
};
|
};
|
||||||
|
class ParsedDoWhileStatement : public ParsedStatementImpl<ParsedStatementKind::DoWhile> {
|
||||||
|
public:
|
||||||
|
ParsedDoWhileStatement(const TextSpan& span, const ParsedStatement* condition, const ParsedStatement* body)
|
||||||
|
: ParsedStatementImpl(span), _condition(condition), _body(body) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<const ParsedStatement> _condition;
|
||||||
|
std::unique_ptr<const ParsedStatement> _body;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ namespace MalachScript::Parser {
|
|||||||
Break,
|
Break,
|
||||||
For,
|
For,
|
||||||
While,
|
While,
|
||||||
|
DoWhile
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user