| // 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. | |
| #ifndef SRC_READER_WGSL_TOKEN_H_ | |
| #define SRC_READER_WGSL_TOKEN_H_ | |
| #include <stddef.h> | |
| #include <ostream> | |
| #include <string> | |
| #include "src/source.h" | |
| namespace tint { | |
| namespace reader { | |
| namespace wgsl { | |
| /// Stores tokens generated by the Lexer | |
| class Token { | |
| public: | |
| /// The type of the parsed token | |
| enum class Type { | |
| /// Error result | |
| kError = -2, | |
| /// Reserved keyword | |
| kReservedKeyword = -1, | |
| /// Uninitialized token | |
| kUninitialized = 0, | |
| /// End of input string reached | |
| kEOF, | |
| /// An identifier | |
| kIdentifier, | |
| /// A string value | |
| kStringLiteral, | |
| /// A float value | |
| kFloatLiteral, | |
| /// An signed int value | |
| kSintLiteral, | |
| /// A unsigned int value | |
| kUintLiteral, | |
| /// A '&' | |
| kAnd, | |
| /// A '&&' | |
| kAndAnd, | |
| /// A '->' | |
| kArrow, | |
| /// A '[[' | |
| kAttrLeft, | |
| /// A ']]' | |
| kAttrRight, | |
| /// A '/' | |
| kForwardSlash, | |
| /// A '!' | |
| kBang, | |
| /// A '[' | |
| kBracketLeft, | |
| /// A ']' | |
| kBracketRight, | |
| /// A '{' | |
| kBraceLeft, | |
| /// A '}' | |
| kBraceRight, | |
| /// A ':' | |
| kColon, | |
| /// A ',' | |
| kComma, | |
| /// A '=' | |
| kEqual, | |
| /// A '==' | |
| kEqualEqual, | |
| /// A '>' | |
| kGreaterThan, | |
| /// A '>=' | |
| kGreaterThanEqual, | |
| /// A '<' | |
| kLessThan, | |
| /// A '<=' | |
| kLessThanEqual, | |
| /// A '%' | |
| kMod, | |
| /// A '-' | |
| kMinus, | |
| /// A '::' | |
| kNamespace, | |
| /// A '!=' | |
| kNotEqual, | |
| /// A '.' | |
| kPeriod, | |
| /// A '+' | |
| kPlus, | |
| /// A '|' | |
| kOr, | |
| /// A '||' | |
| kOrOr, | |
| /// A '(' | |
| kParenLeft, | |
| /// A ')' | |
| kParenRight, | |
| /// A ';' | |
| kSemicolon, | |
| /// A '*' | |
| kStar, | |
| /// A '^' | |
| kXor, | |
| /// A 'array' | |
| kArray, | |
| /// A 'binding' | |
| kBinding, | |
| /// A 'bitcast' | |
| kBitcast, | |
| /// A 'bool' | |
| kBool, | |
| /// A 'block' | |
| kBlock, | |
| /// A 'break' | |
| kBreak, | |
| /// A 'builtin' | |
| kBuiltin, | |
| /// A 'case' | |
| kCase, | |
| /// A 'compute' | |
| kCompute, | |
| /// A 'const' | |
| kConst, | |
| /// A 'continue' | |
| kContinue, | |
| /// A 'continuing' | |
| kContinuing, | |
| /// A 'discard' | |
| kDiscard, | |
| /// A 'default' | |
| kDefault, | |
| /// A 'else' | |
| kElse, | |
| /// A 'elseif' | |
| kElseIf, | |
| /// A 'f32' | |
| kF32, | |
| /// A 'fallthrough' | |
| kFallthrough, | |
| /// A 'false' | |
| kFalse, | |
| /// A 'fn' | |
| kFn, | |
| // A 'for' | |
| kFor, | |
| // A 'Bgra8Unorm' format | |
| kFormatBgra8Unorm, | |
| // A 'Bgra8UnormSrgb' format | |
| kFormatBgra8UnormSrgb, | |
| // A 'R16Float' format | |
| kFormatR16Float, | |
| // A 'R16Sint' format | |
| kFormatR16Sint, | |
| // A 'R16Uint' format | |
| kFormatR16Uint, | |
| // A 'R32Float' format | |
| kFormatR32Float, | |
| // A 'R32Sint' format | |
| kFormatR32Sint, | |
| // A 'R32Uint' format | |
| kFormatR32Uint, | |
| // A 'R8Sint' format | |
| kFormatR8Sint, | |
| // A 'R8Snorm' format | |
| kFormatR8Snorm, | |
| // A 'R8Uint' format | |
| kFormatR8Uint, | |
| // A 'R8Unorm' format | |
| kFormatR8Unorm, | |
| // A 'Rg11B10Float' format | |
| kFormatRg11B10Float, | |
| // A 'Rg16Float' format | |
| kFormatRg16Float, | |
| // A 'Rg16Sint' format | |
| kFormatRg16Sint, | |
| // A 'Rg16Uint' format | |
| kFormatRg16Uint, | |
| // A 'Rg32Float' format | |
| kFormatRg32Float, | |
| // A 'Rg32Sint' format | |
| kFormatRg32Sint, | |
| // A 'Rg32Uint' format | |
| kFormatRg32Uint, | |
| // A 'Rg8Sint' format | |
| kFormatRg8Sint, | |
| // A 'Rg8Snorm' format | |
| kFormatRg8Snorm, | |
| // A 'Rg8Uint' format | |
| kFormatRg8Uint, | |
| // A 'Rg8Unorm' format | |
| kFormatRg8Unorm, | |
| // A 'Rgb10A2Unorm' format | |
| kFormatRgb10A2Unorm, | |
| // A 'Rgba16Float' format | |
| kFormatRgba16Float, | |
| // A 'Rgba16Sint' format | |
| kFormatRgba16Sint, | |
| // A 'Rgba16Uint' format | |
| kFormatRgba16Uint, | |
| // A 'Rgba32Float' format | |
| kFormatRgba32Float, | |
| // A 'Rgba32Sint' format | |
| kFormatRgba32Sint, | |
| // A 'Rgba32Uint' format | |
| kFormatRgba32Uint, | |
| // A 'Rgba8Sint' format | |
| kFormatRgba8Sint, | |
| // A 'Rgba8Snorm' format | |
| kFormatRgba8Snorm, | |
| // A 'Rgba8Uint' format | |
| kFormatRgba8Uint, | |
| // A 'Rgba8Unorm' format | |
| kFormatRgba8Unorm, | |
| // A 'Rgba8UnormSrgb' format | |
| kFormatRgba8UnormSrgb, | |
| /// A 'fragment' | |
| kFragment, | |
| /// A 'function' | |
| kFunction, | |
| /// A 'i32' | |
| kI32, | |
| /// A 'if' | |
| kIf, | |
| /// A 'image' | |
| kImage, | |
| /// A 'import' | |
| kImport, | |
| /// A 'in' | |
| kIn, | |
| /// A 'location' | |
| kLocation, | |
| /// A 'loop' | |
| kLoop, | |
| /// A 'mat2x2' | |
| kMat2x2, | |
| /// A 'mat2x3' | |
| kMat2x3, | |
| /// A 'mat2x4' | |
| kMat2x4, | |
| /// A 'mat3x2' | |
| kMat3x2, | |
| /// A 'mat3x3' | |
| kMat3x3, | |
| /// A 'mat3x4' | |
| kMat3x4, | |
| /// A 'mat4x2' | |
| kMat4x2, | |
| /// A 'mat4x3' | |
| kMat4x3, | |
| /// A 'mat4x4' | |
| kMat4x4, | |
| /// A 'offset' | |
| kOffset, | |
| /// A 'out' | |
| kOut, | |
| /// A 'private' | |
| kPrivate, | |
| /// A 'ptr' | |
| kPtr, | |
| /// A 'return' | |
| kReturn, | |
| /// A 'sampler' | |
| kSampler, | |
| /// A 'sampler_comparison' | |
| kComparisonSampler, | |
| /// A 'set' | |
| kSet, | |
| /// A 'storage_buffer' | |
| kStorageBuffer, | |
| /// A 'stage' | |
| kStage, | |
| /// A 'stride' | |
| kStride, | |
| /// A 'struct' | |
| kStruct, | |
| /// A 'switch' | |
| kSwitch, | |
| /// A 'texture_depth_2d' | |
| kTextureDepth2d, | |
| /// A 'texture_depth_2d_array' | |
| kTextureDepth2dArray, | |
| /// A 'texture_depth_cube' | |
| kTextureDepthCube, | |
| /// A 'texture_depth_cube_array' | |
| kTextureDepthCubeArray, | |
| /// A 'texture_multisampled_2d' | |
| kTextureMultisampled2d, | |
| /// A 'texture_storage_ro_1d' | |
| kTextureStorageReadonly1d, | |
| /// A 'texture_storage_ro_2d_array' | |
| kTextureStorageReadonly1dArray, | |
| /// A 'texture_storage_ro_2d' | |
| kTextureStorageReadonly2d, | |
| /// A 'texture_storage_ro_2d_array' | |
| kTextureStorageReadonly2dArray, | |
| /// A 'texture_storage_ro_3d' | |
| kTextureStorageReadonly3d, | |
| /// A 'texture_1d' | |
| kTextureSampled1d, | |
| /// A 'texture_1d_array' | |
| kTextureSampled1dArray, | |
| /// A 'texture_2d' | |
| kTextureSampled2d, | |
| /// A 'texture_2d_array' | |
| kTextureSampled2dArray, | |
| /// A 'texture_3d' | |
| kTextureSampled3d, | |
| /// A 'texture_cube' | |
| kTextureSampledCube, | |
| /// A 'texture_cube_array' | |
| kTextureSampledCubeArray, | |
| /// A 'texture_wo_1d' | |
| kTextureStorageWriteonly1d, | |
| /// A 'texture_wo_2d_array' | |
| kTextureStorageWriteonly1dArray, | |
| /// A 'texture_wo_2d' | |
| kTextureStorageWriteonly2d, | |
| /// A 'texture_wo_2d_array' | |
| kTextureStorageWriteonly2dArray, | |
| /// A 'texture_wo_3d' | |
| kTextureStorageWriteonly3d, | |
| /// A 'true' | |
| kTrue, | |
| /// A 'type' | |
| kType, | |
| /// A 'u32' | |
| kU32, | |
| /// A 'uniform' | |
| kUniform, | |
| /// A 'uniform_constant' | |
| kUniformConstant, | |
| /// A 'var' | |
| kVar, | |
| /// A 'vec2' | |
| kVec2, | |
| /// A 'vec3' | |
| kVec3, | |
| /// A 'vec4' | |
| kVec4, | |
| /// A 'vertex' | |
| kVertex, | |
| /// A 'void' | |
| kVoid, | |
| /// A 'workgroup' | |
| kWorkgroup, | |
| /// A 'workgroup_size' | |
| kWorkgroupSize, | |
| }; | |
| /// Converts a token type to a name | |
| /// @param type the type to convert | |
| /// @returns the token type as as string | |
| static std::string TypeToName(Type type); | |
| /// Creates an uninitialized token | |
| Token(); | |
| /// Create a Token | |
| /// @param type the Token::Type of the token | |
| /// @param source the source of the token | |
| Token(Type type, const Source& source); | |
| /// Create a string Token | |
| /// @param type the Token::Type of the token | |
| /// @param source the source of the token | |
| /// @param val the source string for the token | |
| Token(Type type, const Source& source, const std::string& val); | |
| /// Create a unsigned integer Token | |
| /// @param source the source of the token | |
| /// @param val the source unsigned for the token | |
| Token(const Source& source, uint32_t val); | |
| /// Create a signed integer Token | |
| /// @param source the source of the token | |
| /// @param val the source integer for the token | |
| Token(const Source& source, int32_t val); | |
| /// Create a float Token | |
| /// @param source the source of the token | |
| /// @param val the source float for the token | |
| Token(const Source& source, float val); | |
| /// Move constructor | |
| Token(Token&&); | |
| /// Copy constructor | |
| Token(const Token&); | |
| ~Token(); | |
| /// Assignment operator | |
| /// @param b the token to copy | |
| /// @return Token | |
| Token& operator=(const Token& b); | |
| /// Returns true if the token is of the given type | |
| /// @param t the type to check against. | |
| /// @returns true if the token is of type |t| | |
| bool Is(Type t) const { return type_ == t; } | |
| /// @returns true if the token is uninitialized | |
| bool IsUninitialized() const { return type_ == Type::kUninitialized; } | |
| /// @returns true if the token is reserved | |
| bool IsReservedKeyword() const { return type_ == Type::kReservedKeyword; } | |
| /// @returns true if the token is an error | |
| bool IsError() const { return type_ == Type::kError; } | |
| /// @returns true if the token is EOF | |
| bool IsEof() const { return type_ == Type::kEOF; } | |
| /// @returns true if the token is an identifier | |
| bool IsIdentifier() const { return type_ == Type::kIdentifier; } | |
| /// @returns true if the token is a string | |
| bool IsStringLiteral() const { return type_ == Type::kStringLiteral; } | |
| /// @returns true if the token is a float | |
| bool IsFloatLiteral() const { return type_ == Type::kFloatLiteral; } | |
| /// @returns true if the token is an signed int | |
| bool IsSintLiteral() const { return type_ == Type::kSintLiteral; } | |
| /// @returns true if the token is a unsigned int | |
| bool IsUintLiteral() const { return type_ == Type::kUintLiteral; } | |
| /// @returns true if token is a '&' | |
| bool IsAnd() const { return type_ == Type::kAnd; } | |
| /// @returns true if token is a '&&' | |
| bool IsAndAnd() const { return type_ == Type::kAndAnd; } | |
| /// @returns true if token is a '->' | |
| bool IsArrow() const { return type_ == Type::kArrow; } | |
| /// @returns true if token is a '[[' | |
| bool IsAttrLeft() const { return type_ == Type::kAttrLeft; } | |
| /// @returns true if token is a ']]' | |
| bool IsAttrRight() const { return type_ == Type::kAttrRight; } | |
| /// @returns true if token is a '/' | |
| bool IsForwardSlash() const { return type_ == Type::kForwardSlash; } | |
| /// @returns true if token is a '!' | |
| bool IsBang() const { return type_ == Type::kBang; } | |
| /// @returns true if token is a '[' | |
| bool IsBracketLeft() const { return type_ == Type::kBracketLeft; } | |
| /// @returns true if token is a ']' | |
| bool IsBracketRight() const { return type_ == Type::kBracketRight; } | |
| /// @returns true if token is a '{' | |
| bool IsBraceLeft() const { return type_ == Type::kBraceLeft; } | |
| /// @returns true if token is a '}' | |
| bool IsBraceRight() const { return type_ == Type::kBraceRight; } | |
| /// @returns true if token is a ':' | |
| bool IsColon() const { return type_ == Type::kColon; } | |
| /// @returns true if token is a ',' | |
| bool IsComma() const { return type_ == Type::kComma; } | |
| /// @returns true if token is a '=' | |
| bool IsEqual() const { return type_ == Type::kEqual; } | |
| /// @returns true if token is a '==' | |
| bool IsEqualEqual() const { return type_ == Type::kEqualEqual; } | |
| /// @returns true if token is a '>' | |
| bool IsGreaterThan() const { return type_ == Type::kGreaterThan; } | |
| /// @returns true if token is a '>=' | |
| bool IsGreaterThanEqual() const { return type_ == Type::kGreaterThanEqual; } | |
| /// @returns true if token is a '<' | |
| bool IsLessThan() const { return type_ == Type::kLessThan; } | |
| /// @returns true if token is a '<=' | |
| bool IsLessThanEqual() const { return type_ == Type::kLessThanEqual; } | |
| /// @returns true if token is a '%' | |
| bool IsMod() const { return type_ == Type::kMod; } | |
| /// @returns true if token is a '-' | |
| bool IsMinus() const { return type_ == Type::kMinus; } | |
| /// @returns true if token is a '::' | |
| bool IsNamespace() const { return type_ == Type::kNamespace; } | |
| /// @returns true if token is a '!=' | |
| bool IsNotEqual() const { return type_ == Type::kNotEqual; } | |
| /// @returns true if token is a '.' | |
| bool IsPeriod() const { return type_ == Type::kPeriod; } | |
| /// @returns true if token is a '+' | |
| bool IsPlus() const { return type_ == Type::kPlus; } | |
| /// @returns true if token is a '|' | |
| bool IsOr() const { return type_ == Type::kOr; } | |
| /// @returns true if token is a '||' | |
| bool IsOrOr() const { return type_ == Type::kOrOr; } | |
| /// @returns true if token is a '(' | |
| bool IsParenLeft() const { return type_ == Type::kParenLeft; } | |
| /// @returns true if token is a ')' | |
| bool IsParenRight() const { return type_ == Type::kParenRight; } | |
| /// @returns true if token is a ';' | |
| bool IsSemicolon() const { return type_ == Type::kSemicolon; } | |
| /// @returns true if token is a '*' | |
| bool IsStar() const { return type_ == Type::kStar; } | |
| /// @returns true if token is a '^' | |
| bool IsXor() const { return type_ == Type::kXor; } | |
| /// @returns true if token is a 'array' | |
| bool IsArray() const { return type_ == Type::kArray; } | |
| /// @returns true if token is a 'binding' | |
| bool IsBinding() const { return type_ == Type::kBinding; } | |
| /// @returns true if token is a 'bitcast' | |
| bool IsBitcast() const { return type_ == Type::kBitcast; } | |
| /// @returns true if token is a 'block' | |
| bool IsBlock() const { return type_ == Type::kBlock; } | |
| /// @returns true if token is a 'bool' | |
| bool IsBool() const { return type_ == Type::kBool; } | |
| /// @returns true if token is a 'break' | |
| bool IsBreak() const { return type_ == Type::kBreak; } | |
| /// @returns true if token is a 'builtin' | |
| bool IsBuiltin() const { return type_ == Type::kBuiltin; } | |
| /// @returns true if token is a 'case' | |
| bool IsCase() const { return type_ == Type::kCase; } | |
| /// @returns true if token is a 'sampler_comparison' | |
| bool IsComparisonSampler() const { return type_ == Type::kComparisonSampler; } | |
| /// @returns true if token is a 'compute' | |
| bool IsCompute() const { return type_ == Type::kCompute; } | |
| /// @returns true if token is a 'const' | |
| bool IsConst() const { return type_ == Type::kConst; } | |
| /// @returns true if token is a 'continue' | |
| bool IsContinue() const { return type_ == Type::kContinue; } | |
| /// @returns true if token is a 'continuing' | |
| bool IsContinuing() const { return type_ == Type::kContinuing; } | |
| /// @returns true if token is a 'discard' | |
| bool IsDiscard() const { return type_ == Type::kDiscard; } | |
| /// @returns true if token is a 'default' | |
| bool IsDefault() const { return type_ == Type::kDefault; } | |
| /// @returns true if token is a 'else' | |
| bool IsElse() const { return type_ == Type::kElse; } | |
| /// @returns true if token is a 'elseif' | |
| bool IsElseIf() const { return type_ == Type::kElseIf; } | |
| /// @returns true if token is a 'f32' | |
| bool IsF32() const { return type_ == Type::kF32; } | |
| /// @returns true if token is a 'fallthrough' | |
| bool IsFallthrough() const { return type_ == Type::kFallthrough; } | |
| /// @returns true if token is a 'false' | |
| bool IsFalse() const { return type_ == Type::kFalse; } | |
| /// @returns true if token is a 'fn' | |
| bool IsFn() const { return type_ == Type::kFn; } | |
| /// @returns true if token is a 'for' | |
| bool IsFor() const { return type_ == Type::kFor; } | |
| /// @returns true if token is a 'Bgra8Unorm' format | |
| bool IsFormatBgra8Unorm() const { return type_ == Type::kFormatBgra8Unorm; } | |
| /// @returns true if token is a 'Bgra8UnormSrgb' format | |
| bool IsFormatBgra8UnormSrgb() const { | |
| return type_ == Type::kFormatBgra8UnormSrgb; | |
| } | |
| /// @returns true if token is a 'R16Float' format | |
| bool IsFormatR16Float() const { return type_ == Type::kFormatR16Float; } | |
| /// @returns true if token is a 'R16Sint' format | |
| bool IsFormatR16Sint() const { return type_ == Type::kFormatR16Sint; } | |
| /// @returns true if token is a 'R16Uint' format | |
| bool IsFormatR16Uint() const { return type_ == Type::kFormatR16Uint; } | |
| /// @returns true if token is a 'R32Float' format | |
| bool IsFormatR32Float() const { return type_ == Type::kFormatR32Float; } | |
| /// @returns true if token is a 'R32Sint' format | |
| bool IsFormatR32Sint() const { return type_ == Type::kFormatR32Sint; } | |
| /// @returns true if token is a 'R32Uint' format | |
| bool IsFormatR32Uint() const { return type_ == Type::kFormatR32Uint; } | |
| /// @returns true if token is a 'R8Sint' format | |
| bool IsFormatR8Sint() const { return type_ == Type::kFormatR8Sint; } | |
| /// @returns true if token is a 'R8Snorm' format | |
| bool IsFormatR8Snorm() const { return type_ == Type::kFormatR8Snorm; } | |
| /// @returns true if token is a 'R8Uint' format | |
| bool IsFormatR8Uint() const { return type_ == Type::kFormatR8Uint; } | |
| /// @returns true if token is a 'R8Unorm' format | |
| bool IsFormatR8Unorm() const { return type_ == Type::kFormatR8Unorm; } | |
| /// @returns true if token is a 'Rg11B10Float' format | |
| bool IsFormatRg11B10Float() const { | |
| return type_ == Type::kFormatRg11B10Float; | |
| } | |
| /// @returns true if token is a 'Rg16Float' format | |
| bool IsFormatRg16Float() const { return type_ == Type::kFormatRg16Float; } | |
| /// @returns true if token is a 'Rg16Sint' format | |
| bool IsFormatRg16Sint() const { return type_ == Type::kFormatRg16Sint; } | |
| /// @returns true if token is a 'Rg16Uint' format | |
| bool IsFormatRg16Uint() const { return type_ == Type::kFormatRg16Uint; } | |
| /// @returns true if token is a 'Rg32Float' format | |
| bool IsFormatRg32Float() const { return type_ == Type::kFormatRg32Float; } | |
| /// @returns true if token is a 'Rg32Sint' format | |
| bool IsFormatRg32Sint() const { return type_ == Type::kFormatRg32Sint; } | |
| /// @returns true if token is a 'Rg32Uint' format | |
| bool IsFormatRg32Uint() const { return type_ == Type::kFormatRg32Uint; } | |
| /// @returns true if token is a 'Rg8Sint' format | |
| bool IsFormatRg8Sint() const { return type_ == Type::kFormatRg8Sint; } | |
| /// @returns true if token is a 'Rg8Snorm' format | |
| bool IsFormatRg8Snorm() const { return type_ == Type::kFormatRg8Snorm; } | |
| /// @returns true if token is a 'Rg8Uint' format | |
| bool IsFormatRg8Uint() const { return type_ == Type::kFormatRg8Uint; } | |
| /// @returns true if token is a 'Rg8Unorm' format | |
| bool IsFormatRg8Unorm() const { return type_ == Type::kFormatRg8Unorm; } | |
| /// @returns true if token is a 'Rgb10A2Unorm' format | |
| bool IsFormatRgb10A2Unorm() const { | |
| return type_ == Type::kFormatRgb10A2Unorm; | |
| } | |
| /// @returns true if token is a 'Rgba16Float' format | |
| bool IsFormatRgba16Float() const { return type_ == Type::kFormatRgba16Float; } | |
| /// @returns true if token is a 'Rgba16Sint' format | |
| bool IsFormatRgba16Sint() const { return type_ == Type::kFormatRgba16Sint; } | |
| /// @returns true if token is a 'Rgba16Uint' format | |
| bool IsFormatRgba16Uint() const { return type_ == Type::kFormatRgba16Uint; } | |
| /// @returns true if token is a 'Rgba32Float' format | |
| bool IsFormatRgba32Float() const { return type_ == Type::kFormatRgba32Float; } | |
| /// @returns true if token is a 'Rgba32Sint' format | |
| bool IsFormatRgba32Sint() const { return type_ == Type::kFormatRgba32Sint; } | |
| /// @returns true if token is a 'Rgba32Uint' format | |
| bool IsFormatRgba32Uint() const { return type_ == Type::kFormatRgba32Uint; } | |
| /// @returns true if token is a 'Rgba8Sint' format | |
| bool IsFormatRgba8Sint() const { return type_ == Type::kFormatRgba8Sint; } | |
| /// @returns true if token is a 'Rgba8Snorm' format | |
| bool IsFormatRgba8Snorm() const { return type_ == Type::kFormatRgba8Snorm; } | |
| /// @returns true if token is a 'Rgba8Uint' format | |
| bool IsFormatRgba8Uint() const { return type_ == Type::kFormatRgba8Uint; } | |
| /// @returns true if token is a 'Rgba8Unorm' format | |
| bool IsFormatRgba8Unorm() const { return type_ == Type::kFormatRgba8Unorm; } | |
| /// @returns true if token is a 'Rgba8UnormSrgb' format | |
| bool IsFormatRgba8UnormSrgb() const { | |
| return type_ == Type::kFormatRgba8UnormSrgb; | |
| } | |
| /// @returns true if token is a 'fragment' | |
| bool IsFragment() const { return type_ == Type::kFragment; } | |
| /// @returns true if token is a 'function' | |
| bool IsFunction() const { return type_ == Type::kFunction; } | |
| /// @returns true if token is a 'i32' | |
| bool IsI32() const { return type_ == Type::kI32; } | |
| /// @returns true if token is a 'if' | |
| bool IsIf() const { return type_ == Type::kIf; } | |
| /// @returns true if token is a 'image' | |
| bool IsImage() const { return type_ == Type::kImage; } | |
| /// @returns true if token is a 'import' | |
| bool IsImport() const { return type_ == Type::kImport; } | |
| /// @returns true if token is a 'in' | |
| bool IsIn() const { return type_ == Type::kIn; } | |
| /// @returns true if token is a 'location' | |
| bool IsLocation() const { return type_ == Type::kLocation; } | |
| /// @returns true if token is a 'loop' | |
| bool IsLoop() const { return type_ == Type::kLoop; } | |
| /// @returns true if token is a 'mat2x2' | |
| bool IsMat2x2() const { return type_ == Type::kMat2x2; } | |
| /// @returns true if token is a 'mat2x3' | |
| bool IsMat2x3() const { return type_ == Type::kMat2x3; } | |
| /// @returns true if token is a 'mat2x4' | |
| bool IsMat2x4() const { return type_ == Type::kMat2x4; } | |
| /// @returns true if token is a 'mat3x2' | |
| bool IsMat3x2() const { return type_ == Type::kMat3x2; } | |
| /// @returns true if token is a 'mat3x3' | |
| bool IsMat3x3() const { return type_ == Type::kMat3x3; } | |
| /// @returns true if token is a 'mat3x4' | |
| bool IsMat3x4() const { return type_ == Type::kMat3x4; } | |
| /// @returns true if token is a 'mat4x2' | |
| bool IsMat4x2() const { return type_ == Type::kMat4x2; } | |
| /// @returns true if token is a 'mat4x3' | |
| bool IsMat4x3() const { return type_ == Type::kMat4x3; } | |
| /// @returns true if token is a 'mat4x4' | |
| bool IsMat4x4() const { return type_ == Type::kMat4x4; } | |
| /// @returns true if token is a 'offset' | |
| bool IsOffset() const { return type_ == Type::kOffset; } | |
| /// @returns true if token is a 'out' | |
| bool IsOut() const { return type_ == Type::kOut; } | |
| /// @returns true if token is a 'private' | |
| bool IsPrivate() const { return type_ == Type::kPrivate; } | |
| /// @returns true if token is a 'ptr' | |
| bool IsPtr() const { return type_ == Type::kPtr; } | |
| /// @returns true if token is a 'return' | |
| bool IsReturn() const { return type_ == Type::kReturn; } | |
| /// @returns true if token is a 'sampler' | |
| bool IsSampler() const { return type_ == Type::kSampler; } | |
| /// @returns true if token is a 'set' | |
| bool IsSet() const { return type_ == Type::kSet; } | |
| /// @returns true if token is a 'stage' | |
| bool IsStage() const { return type_ == Type::kStage; } | |
| /// @returns true if token is a 'storage_buffer' | |
| bool IsStorageBuffer() const { return type_ == Type::kStorageBuffer; } | |
| /// @returns true if token is a 'stride' | |
| bool IsStride() const { return type_ == Type::kStride; } | |
| /// @returns true if token is a 'struct' | |
| bool IsStruct() const { return type_ == Type::kStruct; } | |
| /// @returns true if token is a 'switch' | |
| bool IsSwitch() const { return type_ == Type::kSwitch; } | |
| /// @returns true if token is a 'texture_depth_2d' | |
| bool IsTextureDepth2d() const { return type_ == Type::kTextureDepth2d; } | |
| /// @returns true if token is a 'texture_depth_2d_array' | |
| bool IsTextureDepth2dArray() const { | |
| return type_ == Type::kTextureDepth2dArray; | |
| } | |
| /// @returns true if token is a 'texture_depth_cube' | |
| bool IsTextureDepthCube() const { return type_ == Type::kTextureDepthCube; } | |
| /// @returns true if token is a 'texture_depth_cube_array' | |
| bool IsTextureDepthCubeArray() const { | |
| return type_ == Type::kTextureDepthCubeArray; | |
| } | |
| /// @returns true if the token is a 'texture_multisample_2d' | |
| bool IsTextureMultisampled2d() const { | |
| return type_ == Type::kTextureMultisampled2d; | |
| } | |
| /// @returns true if token is a 'texture_storage_ro_1d' | |
| bool IsTextureStorageReadonly1d() const { | |
| return type_ == Type::kTextureStorageReadonly1d; | |
| } | |
| /// @returns true if token is a 'texture_storage_ro_1d_array' | |
| bool IsTextureStorageReadonly1dArray() const { | |
| return type_ == Type::kTextureStorageReadonly1dArray; | |
| } | |
| /// @returns true if token is a 'texture_storage_ro_2d' | |
| bool IsTextureStorageReadonly2d() const { | |
| return type_ == Type::kTextureStorageReadonly2d; | |
| } | |
| /// @returns true if token is a 'texture_storage_ro_2d_array' | |
| bool IsTextureStorageReadonly2dArray() const { | |
| return type_ == Type::kTextureStorageReadonly2dArray; | |
| } | |
| /// @returns true if token is a 'texture_storage_ro_3d' | |
| bool IsTextureStorageReadonly3d() const { | |
| return type_ == Type::kTextureStorageReadonly3d; | |
| } | |
| /// @returns true if token is a 'texture_1d' | |
| bool IsTextureSampled1d() const { return type_ == Type::kTextureSampled1d; } | |
| /// @returns true if token is a 'texture_1d_array' | |
| bool IsTextureSampled1dArray() const { | |
| return type_ == Type::kTextureSampled1dArray; | |
| } | |
| /// @returns true if token is a 'texture_2d' | |
| bool IsTextureSampled2d() const { return type_ == Type::kTextureSampled2d; } | |
| /// @returns true if token is a 'texture_2d_array' | |
| bool IsTextureSampled2dArray() const { | |
| return type_ == Type::kTextureSampled2dArray; | |
| } | |
| /// @returns true if token is a 'texture_3d' | |
| bool IsTextureSampled3d() const { return type_ == Type::kTextureSampled3d; } | |
| /// @returns true if token is a 'texture_cube' | |
| bool IsTextureSampledCube() const { | |
| return type_ == Type::kTextureSampledCube; | |
| } | |
| /// @returns true if token is a 'texture_cube_array' | |
| bool IsTextureSampledCubeArray() const { | |
| return type_ == Type::kTextureSampledCubeArray; | |
| } | |
| /// @returns true if token is a 'texture_storage_wo_1d' | |
| bool IsTextureStorageWriteonly1d() const { | |
| return type_ == Type::kTextureStorageWriteonly1d; | |
| } | |
| /// @returns true if token is a 'texture_storage_wo_1d_array' | |
| bool IsTextureStorageWriteonly1dArray() const { | |
| return type_ == Type::kTextureStorageWriteonly1dArray; | |
| } | |
| /// @returns true if token is a 'texture_storage_wo_2d' | |
| bool IsTextureStorageWriteonly2d() const { | |
| return type_ == Type::kTextureStorageWriteonly2d; | |
| } | |
| /// @returns true if token is a 'texture_storage_wo_2d_array' | |
| bool IsTextureStorageWriteonly2dArray() const { | |
| return type_ == Type::kTextureStorageWriteonly2dArray; | |
| } | |
| /// @returns true if token is a 'texture_storage_wo_3d' | |
| bool IsTextureStorageWriteonly3d() const { | |
| return type_ == Type::kTextureStorageWriteonly3d; | |
| } | |
| /// @returns true if token is a 'true' | |
| bool IsTrue() const { return type_ == Type::kTrue; } | |
| /// @returns true if token is a 'type' | |
| bool IsType() const { return type_ == Type::kType; } | |
| /// @returns true if token is a 'u32' | |
| bool IsU32() const { return type_ == Type::kU32; } | |
| /// @returns true if token is a 'uniform' | |
| bool IsUniform() const { return type_ == Type::kUniform; } | |
| /// @returns true if token is a 'uniform_constant' | |
| bool IsUniformConstant() const { return type_ == Type::kUniformConstant; } | |
| /// @returns true if token is a 'var' | |
| bool IsVar() const { return type_ == Type::kVar; } | |
| /// @returns true if token is a 'vec2' | |
| bool IsVec2() const { return type_ == Type::kVec2; } | |
| /// @returns true if token is a 'vec3' | |
| bool IsVec3() const { return type_ == Type::kVec3; } | |
| /// @returns true if token is a 'vec4' | |
| bool IsVec4() const { return type_ == Type::kVec4; } | |
| /// @returns true if token is a 'vertex' | |
| bool IsVertex() const { return type_ == Type::kVertex; } | |
| /// @returns true if token is a 'void' | |
| bool IsVoid() const { return type_ == Type::kVoid; } | |
| /// @returns true if token is a 'workgroup' | |
| bool IsWorkgroup() const { return type_ == Type::kWorkgroup; } | |
| /// @returns true if token is a 'workgroup_size' | |
| bool IsWorkgroupSize() const { return type_ == Type::kWorkgroupSize; } | |
| /// @returns the source information for this token | |
| Source source() const { return source_; } | |
| /// Returns the string value of the token | |
| /// @return const std::string& | |
| std::string to_str() const; | |
| /// Returns the float value of the token. 0 is returned if the token does not | |
| /// contain a float value. | |
| /// @return float | |
| float to_f32() const; | |
| /// Returns the uint32 value of the token. 0 is returned if the token does not | |
| /// contain a unsigned integer value. | |
| /// @return uint32_t | |
| uint32_t to_u32() const; | |
| /// Returns the int32 value of the token. 0 is returned if the token does not | |
| /// contain a signed integer value. | |
| /// @return int32_t | |
| int32_t to_i32() const; | |
| /// @returns the token type as string | |
| std::string to_name() const { return Token::TypeToName(type_); } | |
| private: | |
| /// The Token::Type of the token | |
| Type type_ = Type::kError; | |
| /// The source where the token appeared | |
| Source source_; | |
| /// The string represented by the token | |
| std::string val_str_; | |
| /// The signed integer represented by the token | |
| int32_t val_int_ = 0; | |
| /// The unsigned integer represented by the token | |
| uint32_t val_uint_ = 0; | |
| /// The float value represented by the token | |
| float val_float_ = 0.0; | |
| }; | |
| #ifndef NDEBUG | |
| inline std::ostream& operator<<(std::ostream& out, Token::Type type) { | |
| out << Token::TypeToName(type); | |
| return out; | |
| } | |
| #endif // NDEBUG | |
| } // namespace wgsl | |
| } // namespace reader | |
| } // namespace tint | |
| #endif // SRC_READER_WGSL_TOKEN_H_ |