================ @@ -80,6 +85,99 @@ class RootSignatureLexer { } }; +class RootSignatureParser { +public: + RootSignatureParser(SmallVector<rs::RootElement> &Elements, + const SmallVector<RootSignatureToken> &Tokens, + DiagnosticsEngine &Diags); + + // Iterates over the provided tokens and constructs the in-memory + // representations of the RootElements. + // + // The return value denotes if there was a failure and the method will + // return on the first encountered failure, or, return false if it + // can sucessfully reach the end of the tokens. + bool Parse(); + +private: + // Root Element helpers + bool ParseRootElement(bool First); + bool ParseDescriptorTable(); + bool ParseDescriptorTableClause(); + + // Helper dispatch method + // + // These will switch on the Variant kind to dispatch to the respective Parse + // method and store the parsed value back into Ref. + // + // It is helpful to have a generalized dispatch method so that when we need + // to parse multiple optional parameters in any order, we can invoke this + // method + bool ParseParam(rs::ParamType Ref); + + // Parse as many optional parameters as possible in any order + bool + ParseOptionalParams(llvm::SmallDenseMap<TokenKind, rs::ParamType> RefMap); ---------------- bogner wrote:
Do you really want to be passing a `SmallDenseMap` by value here? This and the other similar APIs should probably be using references. https://github.com/llvm/llvm-project/pull/122982 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits