// Copyright 2020 the V8 project 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 V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_COMPILER_H_
#define V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_COMPILER_H_

#include "src/regexp/experimental/experimental-bytecode.h"
#include "src/regexp/regexp-ast.h"
#include "src/zone/zone-list.h"

namespace v8 {
namespace internal {

class ExperimentalRegExpCompiler final : public AllStatic {
 public:
  // Checks whether a given RegExpTree can be compiled into an experimental
  // bytecode program.  This mostly amounts to the absence of back references,
  // but see the definition.
  // TODO(mbid,v8:10765): Currently more things are not handled, e.g. some
  // quantifiers and unicode.
  static bool CanBeHandled(RegExpTree* tree, JSRegExp::Flags flags,
                           int capture_count);
  // Compile regexp into a bytecode program.  The regexp must be handlable by
  // the experimental engine; see`CanBeHandled`.  The program is returned as a
  // ZoneList backed by the same Zone that is used in the RegExpTree argument.
  static ZoneList<RegExpInstruction> Compile(RegExpTree* tree,
                                             JSRegExp::Flags flags, Zone* zone);
};

}  // namespace internal
}  // namespace v8

#endif  // V8_REGEXP_EXPERIMENTAL_EXPERIMENTAL_COMPILER_H_
