Implements namespace statement.

This commit is contained in:
2020-10-09 11:54:43 +02:00
parent 2fb1b68ead
commit 43f080cc48
6 changed files with 69 additions and 32 deletions

View File

@@ -3,7 +3,7 @@
#include <string_view>
#include "../../Diagnostics/Diagnostics.hpp"
#include "../../Utils/MemoryAllocator.hpp"
#include "../../Utils/MemoryPool.hpp"
#include "LexToken.hpp"
namespace MalachScript::Parser {
@@ -22,7 +22,7 @@ namespace MalachScript::Parser {
size_t _scriptLength;
Diagnostics::Diagnostics* _diagnostics;
Utils::MemoryAllocator<2048, 1024> _allocator;
Utils::MemoryPool<2048, 1024> _allocator;
inline char8_t Consume() {
if (++_position >= _scriptLength) {

View File

@@ -14,7 +14,9 @@
}
namespace MalachScript::Parser {
ParsedScriptStatement* Parser::Parse() {
const ParsedScriptStatement* Parser::Parse() { return ParseScript(); }
const ParsedScriptStatement* Parser::ParseScript() {
std::vector<const ParsedStatement*> statements;
statements.reserve(32);
size_t current = 0;
@@ -26,7 +28,10 @@ namespace MalachScript::Parser {
break;
}
const ParsedStatement* statement;
if (ParseClass(statement)) {
auto result = ParseClass(statement) || ParseNamespace(statement);
if (!result) {
// TODO: Log error
continue;
}
statements.push_back(statement);
current++;
@@ -123,16 +128,28 @@ namespace MalachScript::Parser {
PROGRESS_TOKEN(_currentToken);
Identifier defineTo;
if (!ParseIdentifier(defineTo, _currentToken, encounteredErrors)) {
LogError(Diagnostics::DiagnosticType::UnexpectedToken, _currentToken->GetSpan());
}
ParseIdentifier(defineTo, _currentToken, encounteredErrors);
PROGRESS_TOKEN(_currentToken);
EXPECT_TOKEN(_currentToken, SemicolonSymbol);
PROGRESS_TOKEN(_currentToken);
if (_currentToken->GetKind() != LexTokenKind::SemicolonSymbol) {
LogError(Diagnostics::DiagnosticType::UnexpectedToken, _currentToken->GetSpan());
}
out = new ParsedTypeDefStatement(TextSpan(start, _currentToken->GetSpan().GetEnd()), defineTo, defineFrom);
return true;
}
bool Parser::ParseNamespace(const ParsedStatement*& out) {
if (_currentToken->GetKind() != LexTokenKind::NamespaceKeyword) {
return false;
}
auto start = _currentToken->GetSpan().GetStart();
PROGRESS_TOKEN(_currentToken);
Identifier identifier;
bool encounteredErrors = false;
ParseIdentifier(identifier, _currentToken, encounteredErrors);
auto script = ParseScript();
auto end = _currentToken->GetSpan().GetEnd();
PROGRESS_TOKEN(_currentToken);
out = new ParsedNamespaceStatement(TextSpan(start, end), identifier, script);
return true;
}
bool Parser::ParseVirtProp([[maybe_unused]] const ParsedStatement*& out) { return false; }
bool Parser::ParseFunc([[maybe_unused]] const ParsedStatement*& out) { return false; }
bool Parser::ParseVar([[maybe_unused]] const ParsedStatement*& out) { return false; }

View File

@@ -9,7 +9,7 @@ namespace MalachScript::Parser {
public:
Parser(std::u8string_view scriptName, const LexToken* firstToken, Diagnostics::Diagnostics* diagnostics)
: _scriptName(scriptName), _diagnostics(diagnostics), _currentToken(firstToken) {}
ParsedScriptStatement* Parse();
const ParsedScriptStatement* Parse();
private:
std::u8string_view _scriptName;
@@ -20,8 +20,10 @@ namespace MalachScript::Parser {
_diagnostics->LogError(type, _scriptName, span);
}
const ParsedScriptStatement* ParseScript();
bool ParseClass(const ParsedStatement*& out);
bool ParseTypeDef(const ParsedStatement*& out);
bool ParseNamespace(const ParsedStatement*& out);
bool ParseVirtProp(const ParsedStatement*& out);
bool ParseFunc(const ParsedStatement*& out);
bool ParseVar(const ParsedStatement*& out);

View File

@@ -59,8 +59,21 @@ namespace MalachScript::Parser {
ParsedTypeDefStatement(TextSpan span, const Identifier& defineFrom, const Identifier& defineTo)
: ParsedStatementImpl<ParsedStatementKind::TypeDef>(span), _defineFrom(defineFrom), _defineTo(defineTo) {}
inline const Identifier& GetDefineFrom() const noexcept { return _defineFrom; }
inline const Identifier& GetDefineTo() const noexcept { return _defineTo; }
[[nodiscard]] inline const Identifier& GetDefineFrom() const noexcept { return _defineFrom; }
[[nodiscard]] inline const Identifier& GetDefineTo() const noexcept { return _defineTo; }
};
class ParsedNamespaceStatement : public ParsedStatementImpl<ParsedStatementKind::Namespace> {
Identifier _identifier;
const ParsedScriptStatement* _parsedScript;
public:
ParsedNamespaceStatement(TextSpan span, const Identifier& identifier, const ParsedScriptStatement* script)
: ParsedStatementImpl<ParsedStatementKind::Namespace>(span), _identifier(identifier),
_parsedScript(script) {}
[[nodiscard]] inline const Identifier& GetIdentifier() const noexcept { return _identifier; }
[[nodiscard]] inline const ParsedScriptStatement* GetScript() const noexcept { return _parsedScript; }
};
}

View File

@@ -6,7 +6,8 @@ namespace MalachScript::Parser {
Unknown,
Script,
Class,
TypeDef
TypeDef,
Namespace
};
}