Index: chrome/tools/profile_reset/jtl_parser.h |
diff --git a/chrome/tools/profile_reset/jtl_parser.h b/chrome/tools/profile_reset/jtl_parser.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e758211ecbc9449c00b0b3bf8aef479b0c1fd223 |
--- /dev/null |
+++ b/chrome/tools/profile_reset/jtl_parser.h |
@@ -0,0 +1,83 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_TOOLS_PROFILE_RESET_JTL_PARSER_H_ |
+#define CHROME_TOOLS_PROFILE_RESET_JTL_PARSER_H_ |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/values.h" |
+ |
+// Parses text-based JTL source code into a stream of operation names, arguments |
+// and separator kinds. |
+class JtlParser { |
+ public: |
+ // Creates a new parser to parse |compacted_source_code|, which should already |
+ // be stripped of all comments and whitespace (except inside string literals). |
+ // Use RemoveCommentsAndAllWhitespace() to manufacture these arguments, also |
+ // see its comments for a description of |newline_indices|. |
+ JtlParser(const std::string& compacted_source_code, |
+ const std::vector<size_t>& newline_indices); |
+ ~JtlParser(); |
+ |
+ // Removes comments from |verbose_text| and compacts it into whitespace-free |
+ // format (except inside string literals). Elements in |newline_indices| will |
+ // be monotonically increasing and will refer to positions in |compacted_text| |
+ // such that a new line has been removed before that position. |
+ // Example: |
+ // verbose_text = "H e l l o // my\n" |
+ // " dear \n" |
+ // "\n" |
+ // "world\" ! \"" |
+ // compacted_text = "Hellodearworld\" ! \"" |
+ // 01234567890123... |
+ // newline_indices = {5, 9, 9} |
+ // Returns true on success, false if there were unmatched quotes in a line, in |
+ // which case |error_line_number| will be set accordingly if it is non-NULL. |
+ static bool RemoveCommentsAndAllWhitespace( |
+ const std::string& verbose_text, |
+ std::string* compacted_text, |
+ std::vector<size_t>* newline_indices, |
+ size_t* error_line_number); |
+ |
+ // Returns true if the entire input has been successfully consumed. Note that |
+ // even when this returns false, a subsequent call to ParseNextOperation() |
+ // might still fail if the next operation cannot be parsed. |
+ bool HasFinished(); |
+ |
+ // Fetches the |name| and the |argument_list| of the next operation, and also |
+ // whether or not it |ends_the_sentence|, i.e. it is followed by the |
+ // end-of-sentence separator. |
+ // Returns false if there is a parsing error, in which case the values for the |
+ // output parameters are undefined, and |this| parser shall no longer be used. |
+ bool ParseNextOperation(std::string* name, |
+ base::ListValue* argument_list, |
+ bool* ends_the_sentence); |
+ |
+ // Returns the compacted source code that was passed in to the constructor. |
+ const std::string& compacted_source() const { return compacted_source_; } |
+ |
+ // Returns at which line the character at position |compacted_index| in the |
+ // |compacted_source()| was originally located. |
+ size_t GetOriginalLineNumber(size_t compacted_index) const; |
+ |
+ size_t GetLastLineNumber() const; |
+ std::string GetLastContext() const; |
+ |
+ private: |
+ // Contains pre-compiled regular expressions and related state. Factored out |
+ // to avoid this header depending on RE2 headers. |
+ struct ParsingState; |
+ |
+ std::string compacted_source_; |
+ std::vector<size_t> newline_indices_; |
+ scoped_ptr<ParsingState> state_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(JtlParser); |
+}; |
+ |
+#endif // CHROME_TOOLS_PROFILE_RESET_JTL_PARSER_H_ |