[wgsl-reader] Remove keywords which aren't in spec.

This CL updates the WGSL-Reader to remove the decoration keywords as
they are no longer reserved in the spec. The old `::` token is removed
as well as namespaces don't exist anymore.

Change-Id: I1dfa16c1d7e4866f6c2f9ea7b4f93a48ff5a23d7
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34481
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
dan sinclair 2020-12-01 20:10:47 +00:00 committed by Commit Bot service account
parent 15f80a706c
commit 2478ae78bb
5 changed files with 73 additions and 143 deletions

View File

@ -411,10 +411,6 @@ Token Lexer::try_punctuation() {
type = Token::Type::kBang;
pos_ += 1;
location_.column += 1;
} else if (matches(pos_, "::")) {
type = Token::Type::kNamespace;
pos_ += 2;
location_.column += 2;
} else if (matches(pos_, ":")) {
type = Token::Type::kColon;
pos_ += 1;
@ -497,22 +493,14 @@ Token Lexer::try_punctuation() {
Token Lexer::check_keyword(const Source& source, const std::string& str) {
if (str == "array")
return {Token::Type::kArray, source, "array"};
if (str == "binding")
return {Token::Type::kBinding, source, "binding"};
if (str == "bitcast")
return {Token::Type::kBitcast, source, "bitcast"};
if (str == "block")
return {Token::Type::kBlock, source, "block"};
if (str == "bool")
return {Token::Type::kBool, source, "bool"};
if (str == "break")
return {Token::Type::kBreak, source, "break"};
if (str == "builtin")
return {Token::Type::kBuiltin, source, "builtin"};
if (str == "case")
return {Token::Type::kCase, source, "case"};
if (str == "compute")
return {Token::Type::kCompute, source, "compute"};
if (str == "const")
return {Token::Type::kConst, source, "const"};
if (str == "continue")
@ -607,8 +595,6 @@ Token Lexer::check_keyword(const Source& source, const std::string& str) {
return {Token::Type::kFormatRgba8Unorm, source, "rgba8unorm"};
if (str == "rgba8unorm_srgb")
return {Token::Type::kFormatRgba8UnormSrgb, source, "rgba8unorm_srgb"};
if (str == "fragment")
return {Token::Type::kFragment, source, "fragment"};
if (str == "function")
return {Token::Type::kFunction, source, "function"};
if (str == "i32")
@ -621,8 +607,6 @@ Token Lexer::check_keyword(const Source& source, const std::string& str) {
return {Token::Type::kImport, source, "import"};
if (str == "in")
return {Token::Type::kIn, source, "in"};
if (str == "location")
return {Token::Type::kLocation, source, "location"};
if (str == "loop")
return {Token::Type::kLoop, source, "loop"};
if (str == "mat2x2")
@ -643,8 +627,6 @@ Token Lexer::check_keyword(const Source& source, const std::string& str) {
return {Token::Type::kMat4x3, source, "mat4x3"};
if (str == "mat4x4")
return {Token::Type::kMat4x4, source, "mat4x4"};
if (str == "offset")
return {Token::Type::kOffset, source, "offset"};
if (str == "out")
return {Token::Type::kOut, source, "out"};
if (str == "private")
@ -657,14 +639,8 @@ Token Lexer::check_keyword(const Source& source, const std::string& str) {
return {Token::Type::kSampler, source, "sampler"};
if (str == "sampler_comparison")
return {Token::Type::kComparisonSampler, source, "sampler_comparison"};
if (str == "set")
return {Token::Type::kSet, source, "set"};
if (str == "stage")
return {Token::Type::kStage, source, "stage"};
if (str == "storage_buffer")
return {Token::Type::kStorageBuffer, source, "storage_buffer"};
if (str == "stride")
return {Token::Type::kStride, source, "stride"};
if (str == "struct")
return {Token::Type::kStruct, source, "struct"};
if (str == "switch")
@ -807,14 +783,10 @@ Token Lexer::check_keyword(const Source& source, const std::string& str) {
return {Token::Type::kVec3, source, "vec3"};
if (str == "vec4")
return {Token::Type::kVec4, source, "vec4"};
if (str == "vertex")
return {Token::Type::kVertex, source, "vertex"};
if (str == "void")
return {Token::Type::kVoid, source, "void"};
if (str == "workgroup")
return {Token::Type::kWorkgroup, source, "workgroup"};
if (str == "workgroup_size")
return {Token::Type::kWorkgroupSize, source, "workgroup_size"};
return {};
}

View File

@ -435,7 +435,6 @@ INSTANTIATE_TEST_SUITE_P(
TokenData{"%", Token::Type::kMod},
TokenData{"!=", Token::Type::kNotEqual},
TokenData{"-", Token::Type::kMinus},
TokenData{"::", Token::Type::kNamespace},
TokenData{".", Token::Type::kPeriod},
TokenData{"+", Token::Type::kPlus},
TokenData{"|", Token::Type::kOr},
@ -468,14 +467,10 @@ INSTANTIATE_TEST_SUITE_P(
KeywordTest,
testing::Values(
TokenData{"array", Token::Type::kArray},
TokenData{"binding", Token::Type::kBinding},
TokenData{"bitcast", Token::Type::kBitcast},
TokenData{"block", Token::Type::kBlock},
TokenData{"bool", Token::Type::kBool},
TokenData{"break", Token::Type::kBreak},
TokenData{"builtin", Token::Type::kBuiltin},
TokenData{"case", Token::Type::kCase},
TokenData{"compute", Token::Type::kCompute},
TokenData{"const", Token::Type::kConst},
TokenData{"continue", Token::Type::kContinue},
TokenData{"continuing", Token::Type::kContinuing},
@ -523,14 +518,12 @@ INSTANTIATE_TEST_SUITE_P(
TokenData{"rgba8uint", Token::Type::kFormatRgba8Uint},
TokenData{"rgba8unorm", Token::Type::kFormatRgba8Unorm},
TokenData{"rgba8unorm_srgb", Token::Type::kFormatRgba8UnormSrgb},
TokenData{"fragment", Token::Type::kFragment},
TokenData{"function", Token::Type::kFunction},
TokenData{"i32", Token::Type::kI32},
TokenData{"if", Token::Type::kIf},
TokenData{"image", Token::Type::kImage},
TokenData{"import", Token::Type::kImport},
TokenData{"in", Token::Type::kIn},
TokenData{"location", Token::Type::kLocation},
TokenData{"loop", Token::Type::kLoop},
TokenData{"mat2x2", Token::Type::kMat2x2},
TokenData{"mat2x3", Token::Type::kMat2x3},
@ -541,17 +534,13 @@ INSTANTIATE_TEST_SUITE_P(
TokenData{"mat4x2", Token::Type::kMat4x2},
TokenData{"mat4x3", Token::Type::kMat4x3},
TokenData{"mat4x4", Token::Type::kMat4x4},
TokenData{"offset", Token::Type::kOffset},
TokenData{"out", Token::Type::kOut},
TokenData{"private", Token::Type::kPrivate},
TokenData{"ptr", Token::Type::kPtr},
TokenData{"return", Token::Type::kReturn},
TokenData{"sampler", Token::Type::kSampler},
TokenData{"sampler_comparison", Token::Type::kComparisonSampler},
TokenData{"set", Token::Type::kSet},
TokenData{"stage", Token::Type::kStage},
TokenData{"storage_buffer", Token::Type::kStorageBuffer},
TokenData{"stride", Token::Type::kStride},
TokenData{"struct", Token::Type::kStruct},
TokenData{"switch", Token::Type::kSwitch},
TokenData{"texture_1d", Token::Type::kTextureSampled1d},
@ -621,10 +610,8 @@ INSTANTIATE_TEST_SUITE_P(
TokenData{"vec2", Token::Type::kVec2},
TokenData{"vec3", Token::Type::kVec3},
TokenData{"vec4", Token::Type::kVec4},
TokenData{"vertex", Token::Type::kVertex},
TokenData{"void", Token::Type::kVoid},
TokenData{"workgroup", Token::Type::kWorkgroup},
TokenData{"workgroup_size", Token::Type::kWorkgroupSize}));
TokenData{"workgroup", Token::Type::kWorkgroup}));
using KeywordTest_Reserved = testing::TestWithParam<const char*>;
TEST_P(KeywordTest_Reserved, Parses) {

View File

@ -91,6 +91,13 @@ constexpr uint32_t kMaxConstExprDepth = 128;
/// parser on error.
constexpr size_t const kMaxResynchronizeLookahead = 32;
const char kVertexStage[] = "vertex";
const char kFragmentStage[] = "fragment";
const char kComputeStage[] = "compute";
const char kReadAccessControl[] = "read";
const char kReadWriteAccessControl[] = "read_write";
ast::Builtin ident_to_builtin(const std::string& str) {
if (str == "position") {
return ast::Builtin::kPosition;
@ -122,10 +129,27 @@ ast::Builtin ident_to_builtin(const std::string& str) {
return ast::Builtin::kNone;
}
const char kAccessDecoration[] = "access";
const char kBindingDecoration[] = "binding";
const char kBlockDecoration[] = "block";
const char kBuiltinDecoration[] = "builtin";
const char kLocationDecoration[] = "location";
const char kOffsetDecoration[] = "offset";
const char kSetDecoration[] = "set";
const char kStageDecoration[] = "stage";
const char kStrideDecoration[] = "stride";
const char kWorkgroupSizeDecoration[] = "workgroup_size";
bool is_decoration(Token t) {
return t.IsLocation() || t.IsBinding() || t.IsSet() || t.IsBuiltin() ||
t.IsWorkgroupSize() || t.IsStage() || t.IsBlock() || t.IsStride() ||
t.IsOffset();
if (!t.IsIdentifier())
return false;
auto s = t.to_str();
return s == kAccessDecoration || s == kBindingDecoration ||
s == kBlockDecoration || s == kBuiltinDecoration ||
s == kLocationDecoration || s == kOffsetDecoration ||
s == kSetDecoration || s == kStageDecoration ||
s == kStrideDecoration || s == kWorkgroupSizeDecoration;
}
/// Enter-exit counters for block token types.
@ -850,9 +874,9 @@ Expect<ast::AccessControl> ParserImpl::expect_access_type() {
if (ident.errored)
return Failure::kErrored;
if (ident.value == "read")
if (ident.value == kReadAccessControl)
return {ast::AccessControl::kReadOnly, ident.source};
if (ident.value == "read_write")
if (ident.value == kReadWriteAccessControl)
return {ast::AccessControl::kReadWrite, ident.source};
return add_error(ident.source, "invalid value for access decoration");
@ -1338,15 +1362,24 @@ Expect<ast::VariableList> ParserImpl::expect_param_list() {
// | FRAGMENT
// | COMPUTE
Expect<ast::PipelineStage> ParserImpl::expect_pipeline_stage() {
Source source;
if (match(Token::Type::kVertex, &source))
return {ast::PipelineStage::kVertex, source};
auto t = peek();
if (!t.IsIdentifier()) {
return add_error(t, "invalid value for stage decoration");
}
if (match(Token::Type::kFragment, &source))
return {ast::PipelineStage::kFragment, source};
if (match(Token::Type::kCompute, &source))
return {ast::PipelineStage::kCompute, source};
auto s = t.to_str();
if (s == kVertexStage) {
next(); // Consume the peek
return {ast::PipelineStage::kVertex, t.source()};
}
if (s == kFragmentStage) {
next(); // Consume the peek
return {ast::PipelineStage::kFragment, t.source()};
}
if (s == kComputeStage) {
next(); // Consume the peek
return {ast::PipelineStage::kCompute, t.source()};
}
return add_error(peek(), "invalid value for stage decoration");
}
@ -2774,7 +2807,13 @@ Expect<ast::Decoration*> ParserImpl::expect_decoration() {
Maybe<ast::Decoration*> ParserImpl::decoration() {
using Result = Maybe<ast::Decoration*>;
auto t = next();
if (t.IsIdentifier() && t.to_str() == "access") {
if (!t.IsIdentifier()) {
return Failure::kNoMatch;
}
auto s = t.to_str();
if (s == kAccessDecoration) {
const char* use = "access decoration";
return expect_paren_block(use, [&]() -> Result {
auto val = expect_access_type();
@ -2784,7 +2823,8 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::AccessDecoration>(val.value, val.source);
});
}
if (t.IsLocation()) {
if (s == kLocationDecoration) {
const char* use = "location decoration";
return expect_paren_block(use, [&]() -> Result {
auto val = expect_positive_sint(use);
@ -2794,7 +2834,8 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::LocationDecoration>(val.value, val.source);
});
}
if (t.IsBinding()) {
if (s == kBindingDecoration) {
const char* use = "binding decoration";
return expect_paren_block(use, [&]() -> Result {
auto val = expect_positive_sint(use);
@ -2804,7 +2845,8 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::BindingDecoration>(val.value, val.source);
});
}
if (t.IsSet()) {
if (s == kSetDecoration) {
const char* use = "set decoration";
return expect_paren_block(use, [&]() -> Result {
auto val = expect_positive_sint(use);
@ -2814,7 +2856,8 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::SetDecoration>(val.value, val.source);
});
}
if (t.IsBuiltin()) {
if (s == kBuiltinDecoration) {
return expect_paren_block("builtin decoration", [&]() -> Result {
auto builtin = expect_builtin();
if (builtin.errored)
@ -2823,7 +2866,8 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::BuiltinDecoration>(builtin.value, builtin.source);
});
}
if (t.IsWorkgroupSize()) {
if (s == kWorkgroupSizeDecoration) {
return expect_paren_block("workgroup_size decoration", [&]() -> Result {
uint32_t x;
uint32_t y = 1;
@ -2851,7 +2895,8 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::WorkgroupDecoration>(x, y, z, t.source());
});
}
if (t.IsStage()) {
if (s == kStageDecoration) {
return expect_paren_block("stage decoration", [&]() -> Result {
auto stage = expect_pipeline_stage();
if (stage.errored)
@ -2860,10 +2905,12 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::StageDecoration>(stage.value, stage.source);
});
}
if (t.IsBlock()) {
if (s == kBlockDecoration) {
return create<ast::StructBlockDecoration>(t.source());
}
if (t.IsStride()) {
if (s == kStrideDecoration) {
const char* use = "stride decoration";
return expect_paren_block(use, [&]() -> Result {
auto val = expect_nonzero_positive_sint(use);
@ -2873,7 +2920,8 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::StrideDecoration>(val.value, t.source());
});
}
if (t.IsOffset()) {
if (s == kOffsetDecoration) {
const char* use = "offset decoration";
return expect_paren_block(use, [&]() -> Result {
auto val = expect_positive_sint(use);
@ -2883,6 +2931,7 @@ Maybe<ast::Decoration*> ParserImpl::decoration() {
return create<ast::StructMemberOffsetDecoration>(val.value, t.source());
});
}
return Failure::kNoMatch;
}

View File

@ -84,8 +84,6 @@ std::string Token::TypeToName(Type type) {
return "!=";
case Token::Type::kMinus:
return "-";
case Token::Type::kNamespace:
return "::";
case Token::Type::kPeriod:
return ".";
case Token::Type::kPlus:
@ -107,22 +105,14 @@ std::string Token::TypeToName(Type type) {
case Token::Type::kArray:
return "array";
case Token::Type::kBinding:
return "binding";
case Token::Type::kBitcast:
return "bitcast";
case Token::Type::kBlock:
return "block";
case Token::Type::kBool:
return "bool";
case Token::Type::kBreak:
return "break";
case Token::Type::kBuiltin:
return "builtin";
case Token::Type::kCase:
return "case";
case Token::Type::kCompute:
return "compute";
case Token::Type::kConst:
return "const";
case Token::Type::kContinue:
@ -217,8 +207,6 @@ std::string Token::TypeToName(Type type) {
return "rgba8unorm";
case Token::Type::kFormatRgba8UnormSrgb:
return "rgba8unorm_srgb";
case Token::Type::kFragment:
return "fragment";
case Token::Type::kFunction:
return "function";
case Token::Type::kI32:
@ -231,8 +219,6 @@ std::string Token::TypeToName(Type type) {
return "import";
case Token::Type::kIn:
return "in";
case Token::Type::kLocation:
return "location";
case Token::Type::kLoop:
return "loop";
case Token::Type::kMat2x2:
@ -253,8 +239,6 @@ std::string Token::TypeToName(Type type) {
return "mat4x3";
case Token::Type::kMat4x4:
return "mat4x4";
case Token::Type::kOffset:
return "offset";
case Token::Type::kOut:
return "out";
case Token::Type::kPrivate:
@ -267,14 +251,8 @@ std::string Token::TypeToName(Type type) {
return "sampler";
case Token::Type::kComparisonSampler:
return "sampler_comparison";
case Token::Type::kSet:
return "set";
case Token::Type::kStorageBuffer:
return "storage_buffer";
case Token::Type::kStride:
return "stride";
case Token::Type::kStage:
return "stage";
case Token::Type::kStruct:
return "struct";
case Token::Type::kSwitch:
@ -341,14 +319,10 @@ std::string Token::TypeToName(Type type) {
return "vec3";
case Token::Type::kVec4:
return "vec4";
case Token::Type::kVertex:
return "vertex";
case Token::Type::kVoid:
return "void";
case Token::Type::kWorkgroup:
return "workgroup";
case Token::Type::kWorkgroupSize:
return "workgroup_size";
}
return "<unknown>";

View File

@ -93,8 +93,6 @@ class Token {
kMod,
/// A '-'
kMinus,
/// A '::'
kNamespace,
/// A '!='
kNotEqual,
/// A '.'
@ -118,22 +116,14 @@ class Token {
/// 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'
@ -228,8 +218,6 @@ class Token {
kFormatRgba8Unorm,
// A 'Rgba8UnormSrgb' format
kFormatRgba8UnormSrgb,
/// A 'fragment'
kFragment,
/// A 'function'
kFunction,
/// A 'i32'
@ -242,8 +230,6 @@ class Token {
kImport,
/// A 'in'
kIn,
/// A 'location'
kLocation,
/// A 'loop'
kLoop,
/// A 'mat2x2'
@ -264,8 +250,6 @@ class Token {
kMat4x3,
/// A 'mat4x4'
kMat4x4,
/// A 'offset'
kOffset,
/// A 'out'
kOut,
/// A 'private'
@ -278,14 +262,8 @@ class Token {
kSampler,
/// A 'sampler_comparison'
kComparisonSampler,
/// A 'set'
kSet,
/// A 'storage_buffer'
kStorageBuffer,
/// A 'stage'
kStage,
/// A 'stride'
kStride,
/// A 'struct'
kStruct,
/// A 'switch'
@ -352,14 +330,10 @@ class Token {
kVec3,
/// A 'vec4'
kVec4,
/// A 'vertex'
kVertex,
/// A 'void'
kVoid,
/// A 'workgroup'
kWorkgroup,
/// A 'workgroup_size'
kWorkgroupSize,
};
/// Converts a token type to a name
@ -468,8 +442,6 @@ class Token {
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 '.'
@ -493,24 +465,16 @@ class Token {
/// @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'
@ -613,8 +577,6 @@ class Token {
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'
@ -627,8 +589,6 @@ class Token {
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'
@ -649,8 +609,6 @@ class Token {
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'
@ -661,14 +619,8 @@ class Token {
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'
@ -769,14 +721,10 @@ class Token {
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_; }