Parser.h revision f7f295f321fd434e1e542844a71f538a56f2f8fb
1f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//===--- Parser.h - Matcher expression parser -----*- C++ -*-===// 2f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 3f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// The LLVM Compiler Infrastructure 4f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 5f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// This file is distributed under the University of Illinois Open Source 6f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// License. See LICENSE.TXT for details. 7f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 8f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//===----------------------------------------------------------------------===// 9f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// 10f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \file 11f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \brief Simple matcher expression parser. 12f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// 13f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// The parser understands matcher expressions of the form: 14f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// MatcherName(Arg0, Arg1, ..., ArgN) 15f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// as well as simple types like strings. 16f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// The parser does not know how to process the matchers. It delegates this task 17f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// to a Sema object received as an argument. 18f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// 19f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \code 20f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// Grammar for the expressions supported: 21f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// <Expression> := <StringLiteral> | <MatcherExpression> 22f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// <StringLiteral> := "quoted string" 23f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// <MatcherExpression> := <MatcherName>(<ArgumentList>) 24f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// <MatcherName> := [a-zA-Z]+ 25f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// <ArgumentList> := <Expression> | <Expression>,<ArgumentList> 26f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \endcode 27f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// 28f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//===----------------------------------------------------------------------===// 29f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 30f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#ifndef LLVM_CLANG_AST_MATCHERS_DYNAMIC_PARSER_H 31f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#define LLVM_CLANG_AST_MATCHERS_DYNAMIC_PARSER_H 32f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 33f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "clang/ASTMatchers/Dynamic/Diagnostics.h" 34f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "clang/ASTMatchers/Dynamic/VariantValue.h" 35f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "clang/Basic/LLVM.h" 36f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "llvm/ADT/ArrayRef.h" 37f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "llvm/ADT/StringRef.h" 38f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 39f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace clang { 40f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace ast_matchers { 41f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace dynamic { 42f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 43f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \brief Matcher expression parser. 44f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekclass Parser { 45f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekpublic: 46f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \brief Interface to connect the parser with the registry and more. 47f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 48f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// The parser uses the Sema instance passed into 49f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// parseMatcherExpression() to handle all matcher tokens. The simplest 50f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// processor implementation would simply call into the registry to create 51f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// the matchers. 52f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// However, a more complex processor might decide to intercept the matcher 53f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// creation and do some extra work. For example, it could apply some 54f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// transformation to the matcher by adding some id() nodes, or could detect 55f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// specific matcher nodes for more efficient lookup. 56f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek class Sema { 57f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek public: 58f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek virtual ~Sema(); 59f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 60f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \brief Process a matcher expression. 61f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 62f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// All the arguments passed here have already been processed. 63f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 64f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \param MatcherName The matcher name found by the parser. 65f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 66f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \param NameRange The location of the name in the matcher source. 67f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// Useful for error reporting. 68f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 69f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \param Args The argument list for the matcher. 70f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 71f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \return The matcher object constructed by the processor, or NULL 72f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// if an error occurred. In that case, \c Error will contain a 73f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// description of the error. 74f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// The caller takes ownership of the DynTypedMatcher object returned. 75f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek virtual DynTypedMatcher * 76f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek actOnMatcherExpression(StringRef MatcherName, const SourceRange &NameRange, 77f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek ArrayRef<ParserValue> Args, Diagnostics *Error) = 0; 78f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek }; 79f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 80f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \brief Parse a matcher expression, creating matchers from the registry. 81f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 82f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// This overload creates matchers calling directly into the registry. If the 83f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// caller needs more control over how the matchers are created, then it can 84f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// use the overload below that takes a Sema. 85f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 86f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \param MatcherCode The matcher expression to parse. 87f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 88f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \return The matcher object constructed, or NULL if an error occurred. 89f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek // In that case, \c Error will contain a description of the error. 90f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// The caller takes ownership of the DynTypedMatcher object returned. 91f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek static DynTypedMatcher *parseMatcherExpression(StringRef MatcherCode, 92f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Diagnostics *Error); 93f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 94f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \brief Parse a matcher expression. 95f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 96f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \param MatcherCode The matcher expression to parse. 97f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 98f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \param S The Sema instance that will help the parser 99f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// construct the matchers. 100f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \return The matcher object constructed by the processor, or NULL 101f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// if an error occurred. In that case, \c Error will contain a 102f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// description of the error. 103f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// The caller takes ownership of the DynTypedMatcher object returned. 104f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek static DynTypedMatcher *parseMatcherExpression(StringRef MatcherCode, 105f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Sema *S, 106f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Diagnostics *Error); 107f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 108f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \brief Parse an expression, creating matchers from the registry. 109f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 110f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// Parses any expression supported by this parser. In general, the 111f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \c parseMatcherExpression function is a better approach to get a matcher 112f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// object. 113f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek static bool parseExpression(StringRef Code, VariantValue *Value, 114f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Diagnostics *Error); 115f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 116f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \brief Parse an expression. 117f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// 118f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// Parses any expression supported by this parser. In general, the 119f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// \c parseMatcherExpression function is a better approach to get a matcher 120f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek /// object. 121f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek static bool parseExpression(StringRef Code, Sema *S, 122f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek VariantValue *Value, Diagnostics *Error); 123f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 124f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekprivate: 125f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek class CodeTokenizer; 126f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek struct TokenInfo; 127f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 128f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Parser(CodeTokenizer *Tokenizer, Sema *S, 129f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Diagnostics *Error); 130f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 131f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek bool parseExpressionImpl(VariantValue *Value); 132f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek bool parseMatcherExpressionImpl(VariantValue *Value); 133f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 134f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek CodeTokenizer *const Tokenizer; 135f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Sema *const S; 136f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Diagnostics *const Error; 137f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}; 138f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 139f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // namespace dynamic 140f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // namespace ast_matchers 141f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // namespace clang 142f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 143f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#endif // LLVM_CLANG_AST_MATCHERS_DYNAMIC_PARSER_H 144