diff options
Diffstat (limited to 'src/parse/token.hpp')
-rw-r--r-- | src/parse/token.hpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/parse/token.hpp b/src/parse/token.hpp index 5fdcbc77..94458f1f 100644 --- a/src/parse/token.hpp +++ b/src/parse/token.hpp @@ -1,4 +1,9 @@ /* + * MRustC - Rust Compiler + * - By John Hodge (Mutabah/thePowersGang) + * + * parse/token.hpp + * - Lexer Tokens */ #pragma once @@ -6,6 +11,7 @@ #include <tagged_union.hpp> #include <serialise.hpp> #include "../coretypes.hpp" +#include <ident.hpp> enum eTokenType { @@ -55,6 +61,7 @@ class Token: TAGGED_UNION(Data, None, (None, struct {}), (String, ::std::string), + (Ident, Ident), (Integer, struct { enum eCoreType m_datatype; uint64_t m_intval; @@ -69,6 +76,7 @@ class Token: enum eTokenType m_type; Data m_data; Position m_pos; + public: virtual ~Token(); Token(); @@ -91,6 +99,7 @@ public: Token(enum eTokenType type); Token(enum eTokenType type, ::std::string str); + Token(Ident ident); Token(uint64_t val, enum eCoreType datatype); Token(double val, enum eCoreType datatype); Token(const InterpolatedFragment& ); @@ -98,11 +107,17 @@ public: Token(TagTakeIP, InterpolatedFragment ); enum eTokenType type() const { return m_type; } + ::std::string& str() { return m_data.as_String(); } const ::std::string& str() const { return m_data.as_String(); } enum eCoreType datatype() const { TU_MATCH_DEF(Data, (m_data), (e), (assert(!"Getting datatype of invalid token type");), (Integer, return e.m_datatype;), (Float, return e.m_datatype;)) } uint64_t intval() const { return m_data.as_Integer().m_intval; } double floatval() const { return m_data.as_Float().m_floatval; } + const Ident& ident() const { return m_data.as_Ident(); } + Ident take_ident() { return ::std::move(m_data.as_Ident()); } + ::std::string& ident_str() { return m_data.as_Ident().name; } + const ::std::string& ident_str() const { return m_data.as_Ident().name; } + TypeRef& frag_type() { assert(m_type == TOK_INTERPOLATED_TYPE); return *reinterpret_cast<TypeRef*>( m_data.as_Fragment() ); } AST::Path& frag_path() { assert(m_type == TOK_INTERPOLATED_PATH); return *reinterpret_cast<AST::Path*>( m_data.as_Fragment() ); } AST::Pattern& frag_pattern() { assert(m_type == TOK_INTERPOLATED_PATTERN); return *reinterpret_cast<AST::Pattern*>( m_data.as_Fragment() ); } @@ -115,7 +130,8 @@ public: return false; TU_MATCH(Data, (m_data, r.m_data), (e, re), (None, return true;), - (String, return e == re;), + (String, return e == re; ), + (Ident, return e == re; ), (Integer, return e.m_datatype == re.m_datatype && e.m_intval == re.m_intval;), (Float, return e.m_datatype == re.m_datatype && e.m_floatval == re.m_floatval;), (Fragment, assert(!"Token equality on Fragment");) |