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