================ @@ -162,5 +219,371 @@ std::optional<RootSignatureToken> RootSignatureLexer::PeekNextToken() { return Result; } +// Parser Definitions + +RootSignatureParser::RootSignatureParser(SmallVector<RootElement> &Elements, + RootSignatureLexer &Lexer, + DiagnosticsEngine &Diags) + : Elements(Elements), Lexer(Lexer), Diags(Diags) {} + +bool RootSignatureParser::Parse() { + // Handle edge-case of empty RootSignature() + if (Lexer.EndOfBuffer()) + return false; + + // Iterate as many RootElements as possible + while (!ParseRootElement()) { + if (Lexer.EndOfBuffer()) + return false; + if (ConsumeExpectedToken(TokenKind::pu_comma)) + return true; + } + + return true; +} + +bool RootSignatureParser::ParseRootElement() { + if (ConsumeExpectedToken(TokenKind::kw_DescriptorTable)) + return true; + + // Dispatch onto the correct parse method + switch (CurToken.Kind) { + case TokenKind::kw_DescriptorTable: + return ParseDescriptorTable(); + default: + llvm_unreachable("Switch for an expected token was not provided"); ---------------- inbelic wrote:
At the moment, we follow the pattern of `ConsumeExpectedToken({TokenKind1, ..., TokenKindN})` and then switch on the token kinds that were in that statement. `ConsumeExpectedToken` guards against any other token kind. So any new token kind is added we will never reach the default here, unless it is also added to the `ConsumeExpectedToken` statement. Maybe there is a way we could define the macros to generate sub-sets of tokens? Although, I am of the opinion the current method guards against this sufficiently. https://github.com/llvm/llvm-project/pull/122982 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits