diff --git a/src/asm/lexer.cpp b/src/asm/lexer.cpp index 4e329ee6..050a206f 100644 --- a/src/asm/lexer.cpp +++ b/src/asm/lexer.cpp @@ -49,11 +49,31 @@ struct Token { int type; std::variant value; - Token() : type(T_(NUMBER)), value(std::monostate{}) {} - Token(int type_) : type(type_), value(std::monostate{}) {} - Token(int type_, uint32_t value_) : type(type_), value(value_) {} - Token(int type_, std::string const &value_) : type(type_), value(std::move(value_)) {} - Token(int type_, std::string &&value_) : type(type_), value(std::move(value_)) {} + Token() : type(T_(NUMBER)), value(std::monostate{}) { + assume( + type != T_(NUMBER) && type != T_(STRING) && type != T_(CHARACTER) && type != T_(SYMBOL) + && type != T_(LABEL) && type != T_(LOCAL) && type != T_(ANON) && type != T_(QMACRO) + ); + } + Token(int type_) : type(type_), value(std::monostate{}) { + assume( + type != T_(NUMBER) && type != T_(STRING) && type != T_(CHARACTER) && type != T_(SYMBOL) + && type != T_(LABEL) && type != T_(LOCAL) && type != T_(ANON) && type != T_(QMACRO) + ); + } + Token(int type_, uint32_t value_) : type(type_), value(value_) { assume(type == T_(NUMBER)); } + Token(int type_, std::string const &value_) : type(type_), value(std::move(value_)) { + assume( + type == T_(STRING) || type == T_(CHARACTER) || type == T_(SYMBOL) || type == T_(LABEL) + || type == T_(LOCAL) || type == T_(ANON) || type == T_(QMACRO) + ); + } + Token(int type_, std::string &&value_) : type(type_), value(std::move(value_)) { + assume( + type == T_(STRING) || type == T_(CHARACTER) || type == T_(SYMBOL) || type == T_(LABEL) + || type == T_(LOCAL) || type == T_(ANON) || type == T_(QMACRO) + ); + } }; // This map lists all RGBASM keywords which `yylex_NORMAL` lexes as identifiers.