| // Copyright 2020 The Tint Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "src/reader/wgsl/token.h" |
| |
| namespace tint { |
| namespace reader { |
| namespace wgsl { |
| |
| // static |
| std::string_view Token::TypeToName(Type type) { |
| switch (type) { |
| case Token::Type::kError: |
| return "kError"; |
| case Token::Type::kEOF: |
| return "kEOF"; |
| case Token::Type::kIdentifier: |
| return "kIdentifier"; |
| case Token::Type::kFloatLiteral: |
| return "kFloatLiteral"; |
| case Token::Type::kSintLiteral: |
| return "kSintLiteral"; |
| case Token::Type::kUintLiteral: |
| return "kUintLiteral"; |
| case Token::Type::kUninitialized: |
| return "kUninitialized"; |
| |
| case Token::Type::kAnd: |
| return "&"; |
| case Token::Type::kAndAnd: |
| return "&&"; |
| case Token::Type::kArrow: |
| return "->"; |
| case Token::Type::kAttr: |
| return "@"; |
| case Token::Type::kAttrLeft: |
| return "[["; |
| case Token::Type::kAttrRight: |
| return "]]"; |
| case Token::Type::kForwardSlash: |
| return "/"; |
| case Token::Type::kBang: |
| return "!"; |
| case Token::Type::kBracketLeft: |
| return "["; |
| case Token::Type::kBracketRight: |
| return "]"; |
| case Token::Type::kBraceLeft: |
| return "{"; |
| case Token::Type::kBraceRight: |
| return "}"; |
| case Token::Type::kColon: |
| return ":"; |
| case Token::Type::kComma: |
| return ","; |
| case Token::Type::kEqual: |
| return "="; |
| case Token::Type::kEqualEqual: |
| return "=="; |
| case Token::Type::kGreaterThan: |
| return ">"; |
| case Token::Type::kGreaterThanEqual: |
| return ">="; |
| case Token::Type::kShiftRight: |
| return ">>"; |
| case Token::Type::kLessThan: |
| return "<"; |
| case Token::Type::kLessThanEqual: |
| return "<="; |
| case Token::Type::kShiftLeft: |
| return "<<"; |
| case Token::Type::kMod: |
| return "%"; |
| case Token::Type::kNotEqual: |
| return "!="; |
| case Token::Type::kMinus: |
| return "-"; |
| case Token::Type::kMinusMinus: |
| return "--"; |
| case Token::Type::kPeriod: |
| return "."; |
| case Token::Type::kPlus: |
| return "+"; |
| case Token::Type::kPlusPlus: |
| return "++"; |
| case Token::Type::kOr: |
| return "|"; |
| case Token::Type::kOrOr: |
| return "||"; |
| case Token::Type::kParenLeft: |
| return "("; |
| case Token::Type::kParenRight: |
| return ")"; |
| case Token::Type::kSemicolon: |
| return ";"; |
| case Token::Type::kStar: |
| return "*"; |
| case Token::Type::kTilde: |
| return "~"; |
| case Token::Type::kUnderscore: |
| return "_"; |
| case Token::Type::kXor: |
| return "^"; |
| |
| case Token::Type::kArray: |
| return "array"; |
| case Token::Type::kAtomic: |
| return "atomic"; |
| case Token::Type::kBitcast: |
| return "bitcast"; |
| case Token::Type::kBool: |
| return "bool"; |
| case Token::Type::kBreak: |
| return "break"; |
| case Token::Type::kCase: |
| return "case"; |
| case Token::Type::kContinue: |
| return "continue"; |
| case Token::Type::kContinuing: |
| return "continuing"; |
| case Token::Type::kDiscard: |
| return "discard"; |
| case Token::Type::kDefault: |
| return "default"; |
| case Token::Type::kElse: |
| return "else"; |
| case Token::Type::kElseIf: |
| return "elseif"; |
| case Token::Type::kF32: |
| return "f32"; |
| case Token::Type::kFallthrough: |
| return "fallthrough"; |
| case Token::Type::kFalse: |
| return "false"; |
| case Token::Type::kFn: |
| return "fn"; |
| case Token::Type::kFor: |
| return "for"; |
| case Token::Type::kFunction: |
| return "function"; |
| case Token::Type::kI32: |
| return "i32"; |
| case Token::Type::kIf: |
| return "if"; |
| case Token::Type::kImport: |
| return "import"; |
| case Token::Type::kLet: |
| return "let"; |
| case Token::Type::kLoop: |
| return "loop"; |
| case Token::Type::kMat2x2: |
| return "mat2x2"; |
| case Token::Type::kMat2x3: |
| return "mat2x3"; |
| case Token::Type::kMat2x4: |
| return "mat2x4"; |
| case Token::Type::kMat3x2: |
| return "mat3x2"; |
| case Token::Type::kMat3x3: |
| return "mat3x3"; |
| case Token::Type::kMat3x4: |
| return "mat3x4"; |
| case Token::Type::kMat4x2: |
| return "mat4x2"; |
| case Token::Type::kMat4x3: |
| return "mat4x3"; |
| case Token::Type::kMat4x4: |
| return "mat4x4"; |
| case Token::Type::kPrivate: |
| return "private"; |
| case Token::Type::kPtr: |
| return "ptr"; |
| case Token::Type::kReturn: |
| return "return"; |
| case Token::Type::kSampler: |
| return "sampler"; |
| case Token::Type::kComparisonSampler: |
| return "sampler_comparison"; |
| case Token::Type::kStorage: |
| return "storage"; |
| case Token::Type::kStruct: |
| return "struct"; |
| case Token::Type::kSwitch: |
| return "switch"; |
| case Token::Type::kTextureDepth2d: |
| return "texture_depth_2d"; |
| case Token::Type::kTextureDepth2dArray: |
| return "texture_depth_2d_array"; |
| case Token::Type::kTextureDepthCube: |
| return "texture_depth_cube"; |
| case Token::Type::kTextureDepthCubeArray: |
| return "texture_depth_cube_array"; |
| case Token::Type::kTextureDepthMultisampled2d: |
| return "texture_depth_multisampled_2d"; |
| case Token::Type::kTextureExternal: |
| return "texture_external"; |
| case Token::Type::kTextureMultisampled2d: |
| return "texture_multisampled_2d"; |
| case Token::Type::kTextureSampled1d: |
| return "texture_1d"; |
| case Token::Type::kTextureSampled2d: |
| return "texture_2d"; |
| case Token::Type::kTextureSampled2dArray: |
| return "texture_2d_array"; |
| case Token::Type::kTextureSampled3d: |
| return "texture_3d"; |
| case Token::Type::kTextureSampledCube: |
| return "texture_cube"; |
| case Token::Type::kTextureSampledCubeArray: |
| return "texture_cube_array"; |
| case Token::Type::kTextureStorage1d: |
| return "texture_storage_1d"; |
| case Token::Type::kTextureStorage2d: |
| return "texture_storage_2d"; |
| case Token::Type::kTextureStorage2dArray: |
| return "texture_storage_2d_array"; |
| case Token::Type::kTextureStorage3d: |
| return "texture_storage_3d"; |
| case Token::Type::kTrue: |
| return "true"; |
| case Token::Type::kType: |
| return "type"; |
| case Token::Type::kU32: |
| return "u32"; |
| case Token::Type::kUniform: |
| return "uniform"; |
| case Token::Type::kVar: |
| return "var"; |
| case Token::Type::kVec2: |
| return "vec2"; |
| case Token::Type::kVec3: |
| return "vec3"; |
| case Token::Type::kVec4: |
| return "vec4"; |
| case Token::Type::kWorkgroup: |
| return "workgroup"; |
| } |
| |
| return "<unknown>"; |
| } |
| |
| Token::Token() : type_(Type::kUninitialized) {} |
| |
| Token::Token(Type type, const Source& source, const std::string_view& view) |
| : type_(type), source_(source), value_(view) {} |
| |
| Token::Token(Type type, const Source& source, const std::string& str) |
| : type_(type), source_(source), value_(str) {} |
| |
| Token::Token(Type type, const Source& source, const char* str) |
| : type_(type), source_(source), value_(std::string_view(str)) {} |
| |
| Token::Token(const Source& source, uint32_t val) |
| : type_(Type::kUintLiteral), source_(source), value_(val) {} |
| |
| Token::Token(const Source& source, int32_t val) |
| : type_(Type::kSintLiteral), source_(source), value_(val) {} |
| |
| Token::Token(const Source& source, float val) |
| : type_(Type::kFloatLiteral), source_(source), value_(val) {} |
| |
| Token::Token(Type type, const Source& source) : type_(type), source_(source) {} |
| |
| Token::Token(Token&&) = default; |
| |
| Token::Token(const Token&) = default; |
| |
| Token::~Token() = default; |
| |
| Token& Token::operator=(const Token& rhs) = default; |
| |
| bool Token::operator==(std::string_view ident) { |
| if (type_ != Type::kIdentifier) { |
| return false; |
| } |
| if (auto* view = std::get_if<std::string_view>(&value_)) { |
| return *view == ident; |
| } |
| return std::get<std::string>(value_) == ident; |
| } |
| |
| std::string Token::to_str() const { |
| switch (type_) { |
| case Type::kFloatLiteral: |
| return std::to_string(std::get<float>(value_)); |
| case Type::kSintLiteral: |
| return std::to_string(std::get<int32_t>(value_)); |
| case Type::kUintLiteral: |
| return std::to_string(std::get<uint32_t>(value_)); |
| case Type::kIdentifier: |
| case Type::kError: |
| if (auto* view = std::get_if<std::string_view>(&value_)) { |
| return std::string(*view); |
| } |
| return std::get<std::string>(value_); |
| default: |
| return ""; |
| } |
| } |
| |
| float Token::to_f32() const { |
| return std::get<float>(value_); |
| } |
| |
| uint32_t Token::to_u32() const { |
| return std::get<uint32_t>(value_); |
| } |
| |
| int32_t Token::to_i32() const { |
| return std::get<int32_t>(value_); |
| } |
| |
| } // namespace wgsl |
| } // namespace reader |
| } // namespace tint |