Home | History | Annotate | Download | only in profile_reset
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_TOOLS_PROFILE_RESET_JTL_COMPILER_H_
      6 #define CHROME_TOOLS_PROFILE_RESET_JTL_COMPILER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 
     12 // Compiles text-based JTL source code into JTL byte-code.
     13 //
     14 // For an overview of JTL (JSON Traversal Language), and the exhaustive list of
     15 // instructions, please see "chrome/browser/profile_resetter/jtl_foundation.h".
     16 //
     17 // The text-based JTL syntax itself much resembles C/C++. A program consists of
     18 // zero or more sentences. Each sentence is terminated by a semi-colon (;), and
     19 // is composed of *one* or more operations, separated by periods (.).
     20 //
     21 // Each operation resembles a C/C++ function call and consists of an instruction
     22 // name, and an optional argument list, which takes Boolean values and/or string
     23 // literals. The text-based instruction names are defined in "jtl_compiler.cc".
     24 //
     25 // Whitespace does not matter, except for inside string literals. C++-style,
     26 // double-slash-introduced comments are also supported.
     27 //
     28 // Example source code:
     29 //
     30 //   // Store "x"=true if path "foo.bar" is found.
     31 //   go("foo").go("bar").store_bool("x", true);
     32 //
     33 //   // Store "y"="1" if the above value is set.
     34 //   compare_stored_bool("x", true, false).store_hash("y", "1");
     35 //
     36 class JtlCompiler {
     37  public:
     38   struct CompileError {
     39     enum ErrorCode {
     40       ERROR_NONE,
     41       MISMATCHED_DOUBLE_QUOTES,
     42       PARSING_ERROR,
     43       INVALID_OPERATION_NAME,
     44       INVALID_ARGUMENT_COUNT,
     45       INVALID_ARGUMENT_TYPE,
     46       INVALID_ARGUMENT_VALUE
     47     };
     48 
     49     CompileError() : line_number(0), error_code(ERROR_NONE) {}
     50     CompileError(size_t line_number,
     51                  const std::string& context,
     52                  ErrorCode error_code)
     53         : line_number(line_number), context(context), error_code(error_code) {}
     54 
     55     size_t line_number;  // 0-based.
     56     std::string context;
     57     ErrorCode error_code;
     58   };
     59 
     60   // Compiles text-based JTL source code contained in |source_code| into JTL
     61   // byte-code to |output_bytecode|. Variable, node names, and string literals
     62   // will be hashed using the seed in |hash_seed|.
     63   // On success, returns true. Otherwise, returns false and fills |error| with
     64   // more information (if it is non-NULL).
     65   static bool Compile(const std::string& source_code,
     66                       const std::string& hash_seed,
     67                       std::string* output_bytecode,
     68                       CompileError* error);
     69 
     70  private:
     71   DISALLOW_IMPLICIT_CONSTRUCTORS(JtlCompiler);
     72 };
     73 
     74 #endif  // CHROME_TOOLS_PROFILE_RESET_JTL_COMPILER_H_
     75