Skip to content

Commit c5d3881

Browse files
committed
Add lexing for example keyword and enum
1 parent dc0c7ba commit c5d3881

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

clang/include/clang/Parse/HLSLRootSignatureTokenKinds.def

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@
2020
#ifndef PUNCTUATOR
2121
#define PUNCTUATOR(X,Y) TOK(pu_ ## X)
2222
#endif
23+
#ifndef KEYWORD
24+
#define KEYWORD(X) TOK(kw_ ## X)
25+
#endif
26+
#ifndef ENUM
27+
#define ENUM(NAME, LIT) TOK(en_ ## NAME)
28+
#endif
29+
30+
// Defines the various types of enum
31+
#ifndef DESCRIPTOR_RANGE_OFFSET_ENUM
32+
#define DESCRIPTOR_RANGE_OFFSET_ENUM(NAME, LIT) ENUM(NAME, LIT)
33+
#endif
2334

2435
// General Tokens:
2536
TOK(invalid)
@@ -38,5 +49,14 @@ PUNCTUATOR(comma, ',')
3849
PUNCTUATOR(or, '|')
3950
PUNCTUATOR(equal, '=')
4051

52+
// RootElement Keywords:
53+
KEYWORD(DescriptorTable)
54+
55+
// Descriptor Range Offset Enum:
56+
DESCRIPTOR_RANGE_OFFSET_ENUM(DescriptorRangeOffsetAppend, "DESCRIPTOR_RANGE_OFFSET_APPEND")
57+
58+
#undef DESCRIPTOR_RANGE_OFFSET_ENUM
59+
#undef ENUM
60+
#undef KEYWORD
4161
#undef PUNCTUATOR
4262
#undef TOK

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "llvm/ADT/SmallVector.h"
2222
#include "llvm/ADT/StringRef.h"
23+
#include "llvm/ADT/StringSwitch.h"
2324

2425
namespace clang {
2526
namespace hlsl {

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,26 @@ bool RootSignatureLexer::LexToken(RootSignatureToken &Result) {
147147
return false;
148148
}
149149

150-
// Unable to match on any token type
151-
PP.getDiagnostics().Report(Result.TokLoc, diag::err_hlsl_invalid_token);
152-
return true;
150+
// Keywords and Enums:
151+
StringRef TokSpelling =
152+
Buffer.take_while([](char C) { return isalnum(C) || C == '_'; });
153+
154+
// Define a large string switch statement for all the keywords and enums
155+
auto Switch = llvm::StringSwitch<TokenKind>(TokSpelling);
156+
#define KEYWORD(NAME) Switch.Case(#NAME, TokenKind::kw_##NAME);
157+
#define ENUM(NAME, LIT) Switch.CaseLower(LIT, TokenKind::en_##NAME);
158+
#include "clang/Parse/HLSLRootSignatureTokenKinds.def"
159+
160+
// Then attempt to retreive a string from it
161+
auto Kind = Switch.Default(TokenKind::invalid);
162+
if (Kind == TokenKind::invalid) {
163+
PP.getDiagnostics().Report(Result.TokLoc, diag::err_hlsl_invalid_token);
164+
return true;
165+
}
166+
167+
Result.Kind = Kind;
168+
AdvanceBuffer(TokSpelling.size());
169+
return false;
153170
}
154171

155172
} // namespace hlsl

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ TEST_F(ParseHLSLRootSignatureTest, ValidLexAllTokensTest) {
147147
b0 t43 u987 s234
148148
149149
(),|=
150+
151+
DescriptorTable
152+
153+
DESCRIPTOR_RANGE_OFFSET_APPEND
150154
)cc";
151155

152156
TrivialModuleLoader ModLoader;

0 commit comments

Comments
 (0)