Nathan =?utf-8?q?Gauër?= <brio...@google.com>,
Nathan =?utf-8?q?Gauër?= <brio...@google.com>,
Nathan =?utf-8?q?Gauër?= <brio...@google.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/152...@github.com>


================
@@ -118,6 +118,47 @@ static void fixSeparateAttrArgAndNumber(StringRef ArgStr, 
SourceLocation ArgLoc,
   Slot = new (Ctx) IdentifierLoc(ArgLoc, PP.getIdentifierInfo(FixedArg));
 }
 
+Parser::ParsedSemantic Parser::ParseHLSLSemantic() {
+  assert(Tok.is(tok::identifier) && "Not a HLSL Annotation");
+
+  // Semantic pattern: [A-Za-z_]([A-Za-z_0-9]*[A-Za-z_])?[0-9]*
+  // The first part is the semantic name, the second is the optional
+  // semantic index. The semantic index is the number at the end of
+  // the semantic, including leading zeroes. Digits located before
+  // the last letter are part of the semantic name.
+  bool Invalid = false;
+  SmallString<256> Buffer;
+  Buffer.resize(Tok.getLength() + 1);
+  StringRef Identifier = PP.getSpelling(Tok, Buffer);
+  if (Invalid) {
+    Diag(Tok.getLocation(), diag::err_expected_semantic_identifier);
+    return {};
+  }
+
+  assert(Identifier.size() > 0);
+  unsigned I = Identifier.size();
+  for (; I > 0 && isDigit(Identifier[I - 1]); --I)
----------------
llvm-beanz wrote:

Also as a follow-up it would be nice if `llvm::StringRef` had a utility for 
this. Currently it has a bunch of find and reverse-find methods, but it doesn't 
have an ideal fit. `find_if_not` is probably the right pattern, but you'd want 
an `rfind_if_not` so that this could be something like:

```c++
size_t I = Identifier.rfind_if_not(isDigit);
```

https://github.com/llvm/llvm-project/pull/152537
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to