summaryrefslogtreecommitdiff
path: root/src/parse/token.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/token.hpp')
-rw-r--r--src/parse/token.hpp18
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");)