Use custom parser values instead of simple parser values for parsing Zone definitions

This commit is contained in:
Jan
2021-03-20 14:07:48 +01:00
parent ef36d6cdc5
commit 5e08469635
27 changed files with 431 additions and 174 deletions

View File

@ -0,0 +1,58 @@
#pragma once
#include <string>
#include "Parsing/IParserValue.h"
#include "Utils/ClassUtils.h"
#include "Parsing/TokenPos.h"
enum class ZoneDefinitionParserValueType
{
// Meta tokens
INVALID,
END_OF_FILE,
CHARACTER,
STRING,
FIELD,
// End
MAX
};
class ZoneDefinitionParserValue final : public IParserValue
{
public:
TokenPos m_pos;
ZoneDefinitionParserValueType m_type;
size_t m_hash;
union ValueType
{
char char_value;
std::string* string_value;
} m_value;
static ZoneDefinitionParserValue Invalid(TokenPos pos);
static ZoneDefinitionParserValue EndOfFile(TokenPos pos);
static ZoneDefinitionParserValue Character(TokenPos pos, char c);
static ZoneDefinitionParserValue String(TokenPos pos, std::string* str);
static ZoneDefinitionParserValue Field(TokenPos pos, std::string* field);
private:
ZoneDefinitionParserValue(TokenPos pos, ZoneDefinitionParserValueType type);
public:
~ZoneDefinitionParserValue() override;
ZoneDefinitionParserValue(const ZoneDefinitionParserValue& other) = delete;
ZoneDefinitionParserValue(ZoneDefinitionParserValue&& other) noexcept;
ZoneDefinitionParserValue& operator=(const ZoneDefinitionParserValue& other) = delete;
ZoneDefinitionParserValue& operator=(ZoneDefinitionParserValue&& other) noexcept;
_NODISCARD bool IsEof() const override;
_NODISCARD const TokenPos& GetPos() const override;
_NODISCARD char CharacterValue() const;
_NODISCARD std::string& StringValue() const;
_NODISCARD std::string& FieldValue() const;
_NODISCARD size_t FieldHash() const;
};