#pragma once #include namespace arti::lang { enum class TokenV; struct Token { TokenV value; std::size_t line; std::size_t column; std::string_view strValue; }; enum class TokenV { tkEOF, tkString, tkDecimal, tkInteger, tkCharacter, tkIdentifier, opDot, /* . */ opMod, /* % */ opPlus, /* + */ opHyphen, /* - */ opSlash, /* / */ opBang, /* ! */ opStar, /* * */ opColon, /* : */ opComma, /* , */ opAssign, /* = */ opAccess, /* :: */ opSemicolon, /* ; */ opCaret, /* ^ */ opTilde, /* ~ */ opEq, /* == */ opNeq, /* != */ opLt, /* < */ opGt, /* > */ opLtEq, /* <= */ opGtEq, /* >= */ opLShift, /* << */ opRShift, /* >> */ opBoolAnd, /* && */ opBoolOr, /* || */ opAnd, /* & */ opOr, /* | */ opLParen, /* ( */ opRParen, /* ) */ opLBracket, /* [ */ opRBracket, /* ] */ opLSquirly, /* { */ opRSquirly, /* } */ opArrow, /* -> */ opPlusAssign, /* += */ opHyphenAssign, /* -= */ opStarAssign, /* *= */ opSlashAssign, /* /= */ opModAssign, /* %= */ opAndAssign, /* &= */ opOrAssign, /* |= */ opLShiftAssign, /* <<= */ opRShiftAssign, /* >>= */ opBoolAndAssign, /* &&= */ opBoolOrAssign, /* ||= */ opMut, /* $ */ opOpt, /* ? */ opSliceSize, /* .# */ opPtrSlice, /* .[ */ opSlicePtr, /* .* */ opReflect, /* .@ */ opLabel, /* := */ /* Keywords */ kwUnderscore, /* _ */ kwOr, /* or */ kwNot, /* not */ kwAnd, /* and */ kwIf, /* if */ kwElse, /* else */ kwFn, /* fn */ kwEnum, /* enum */ kwStruct, /* struct */ kwDef, /* def */ kwLet, /* let */ kwFor, /* for */ kwLoop, /* loop */ kwBreak, /* break */ kwContinue, /* continue */ kwDo, /* do */ kwWhile, /* while */ kwMatch, /* match */ kwSwitch, /* switch */ kwReturn, /* return */ kwUnreachable, /* unreachable */ kwTypename, /* typename */ kwDefer, /* defer */ kwErrDefer, /* errdefer */ kwTrue, /* true */ kwFalse, /* false */ kwNull, /* null */ kwThis, /* this */ kwImport, /* import */ kwExport, /* export */ kwModule, /* module */ kwUsing, /* using */ }; std::string toString(const Token &value); std::string toString(const TokenV &value); } // namespace arti::lang