| Index: src/parsing/parser.h
|
| diff --git a/src/parsing/parser.h b/src/parsing/parser.h
|
| index 5fa64b7eb1dbc962d9aa7ae3ded5c872138b7cbd..eee792de782c7fb73e80cb56e8bf42484a0a8bcf 100644
|
| --- a/src/parsing/parser.h
|
| +++ b/src/parsing/parser.h
|
| @@ -289,264 +289,6 @@ class ParseData {
|
| };
|
|
|
| // ----------------------------------------------------------------------------
|
| -// REGEXP PARSING
|
| -
|
| -// A BufferedZoneList is an automatically growing list, just like (and backed
|
| -// by) a ZoneList, that is optimized for the case of adding and removing
|
| -// a single element. The last element added is stored outside the backing list,
|
| -// and if no more than one element is ever added, the ZoneList isn't even
|
| -// allocated.
|
| -// Elements must not be NULL pointers.
|
| -template <typename T, int initial_size>
|
| -class BufferedZoneList {
|
| - public:
|
| - BufferedZoneList() : list_(NULL), last_(NULL) {}
|
| -
|
| - // Adds element at end of list. This element is buffered and can
|
| - // be read using last() or removed using RemoveLast until a new Add or until
|
| - // RemoveLast or GetList has been called.
|
| - void Add(T* value, Zone* zone) {
|
| - if (last_ != NULL) {
|
| - if (list_ == NULL) {
|
| - list_ = new(zone) ZoneList<T*>(initial_size, zone);
|
| - }
|
| - list_->Add(last_, zone);
|
| - }
|
| - last_ = value;
|
| - }
|
| -
|
| - T* last() {
|
| - DCHECK(last_ != NULL);
|
| - return last_;
|
| - }
|
| -
|
| - T* RemoveLast() {
|
| - DCHECK(last_ != NULL);
|
| - T* result = last_;
|
| - if ((list_ != NULL) && (list_->length() > 0))
|
| - last_ = list_->RemoveLast();
|
| - else
|
| - last_ = NULL;
|
| - return result;
|
| - }
|
| -
|
| - T* Get(int i) {
|
| - DCHECK((0 <= i) && (i < length()));
|
| - if (list_ == NULL) {
|
| - DCHECK_EQ(0, i);
|
| - return last_;
|
| - } else {
|
| - if (i == list_->length()) {
|
| - DCHECK(last_ != NULL);
|
| - return last_;
|
| - } else {
|
| - return list_->at(i);
|
| - }
|
| - }
|
| - }
|
| -
|
| - void Clear() {
|
| - list_ = NULL;
|
| - last_ = NULL;
|
| - }
|
| -
|
| - int length() {
|
| - int length = (list_ == NULL) ? 0 : list_->length();
|
| - return length + ((last_ == NULL) ? 0 : 1);
|
| - }
|
| -
|
| - ZoneList<T*>* GetList(Zone* zone) {
|
| - if (list_ == NULL) {
|
| - list_ = new(zone) ZoneList<T*>(initial_size, zone);
|
| - }
|
| - if (last_ != NULL) {
|
| - list_->Add(last_, zone);
|
| - last_ = NULL;
|
| - }
|
| - return list_;
|
| - }
|
| -
|
| - private:
|
| - ZoneList<T*>* list_;
|
| - T* last_;
|
| -};
|
| -
|
| -
|
| -// Accumulates RegExp atoms and assertions into lists of terms and alternatives.
|
| -class RegExpBuilder: public ZoneObject {
|
| - public:
|
| - explicit RegExpBuilder(Zone* zone);
|
| - void AddCharacter(uc16 character);
|
| - // "Adds" an empty expression. Does nothing except consume a
|
| - // following quantifier
|
| - void AddEmpty();
|
| - void AddAtom(RegExpTree* tree);
|
| - void AddAssertion(RegExpTree* tree);
|
| - void NewAlternative(); // '|'
|
| - void AddQuantifierToAtom(
|
| - int min, int max, RegExpQuantifier::QuantifierType type);
|
| - RegExpTree* ToRegExp();
|
| -
|
| - private:
|
| - void FlushCharacters();
|
| - void FlushText();
|
| - void FlushTerms();
|
| - Zone* zone() const { return zone_; }
|
| -
|
| - Zone* zone_;
|
| - bool pending_empty_;
|
| - ZoneList<uc16>* characters_;
|
| - BufferedZoneList<RegExpTree, 2> terms_;
|
| - BufferedZoneList<RegExpTree, 2> text_;
|
| - BufferedZoneList<RegExpTree, 2> alternatives_;
|
| -#ifdef DEBUG
|
| - enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_;
|
| -#define LAST(x) last_added_ = x;
|
| -#else
|
| -#define LAST(x)
|
| -#endif
|
| -};
|
| -
|
| -
|
| -class RegExpParser BASE_EMBEDDED {
|
| - public:
|
| - RegExpParser(FlatStringReader* in, Handle<String>* error, bool multiline_mode,
|
| - bool unicode, Isolate* isolate, Zone* zone);
|
| -
|
| - static bool ParseRegExp(Isolate* isolate, Zone* zone, FlatStringReader* input,
|
| - bool multiline, bool unicode,
|
| - RegExpCompileData* result);
|
| -
|
| - RegExpTree* ParsePattern();
|
| - RegExpTree* ParseDisjunction();
|
| - RegExpTree* ParseGroup();
|
| - RegExpTree* ParseCharacterClass();
|
| -
|
| - // Parses a {...,...} quantifier and stores the range in the given
|
| - // out parameters.
|
| - bool ParseIntervalQuantifier(int* min_out, int* max_out);
|
| -
|
| - // Parses and returns a single escaped character. The character
|
| - // must not be 'b' or 'B' since they are usually handle specially.
|
| - uc32 ParseClassCharacterEscape();
|
| -
|
| - // Checks whether the following is a length-digit hexadecimal number,
|
| - // and sets the value if it is.
|
| - bool ParseHexEscape(int length, uc32* value);
|
| - bool ParseUnicodeEscape(uc32* value);
|
| - bool ParseUnlimitedLengthHexNumber(int max_value, uc32* value);
|
| -
|
| - uc32 ParseOctalLiteral();
|
| -
|
| - // Tries to parse the input as a back reference. If successful it
|
| - // stores the result in the output parameter and returns true. If
|
| - // it fails it will push back the characters read so the same characters
|
| - // can be reparsed.
|
| - bool ParseBackReferenceIndex(int* index_out);
|
| -
|
| - CharacterRange ParseClassAtom(uc16* char_class);
|
| - RegExpTree* ReportError(Vector<const char> message);
|
| - void Advance();
|
| - void Advance(int dist);
|
| - void Reset(int pos);
|
| -
|
| - // Reports whether the pattern might be used as a literal search string.
|
| - // Only use if the result of the parse is a single atom node.
|
| - bool simple();
|
| - bool contains_anchor() { return contains_anchor_; }
|
| - void set_contains_anchor() { contains_anchor_ = true; }
|
| - int captures_started() { return captures_started_; }
|
| - int position() { return next_pos_ - 1; }
|
| - bool failed() { return failed_; }
|
| -
|
| - static bool IsSyntaxCharacter(uc32 c);
|
| -
|
| - static const int kMaxCaptures = 1 << 16;
|
| - static const uc32 kEndMarker = (1 << 21);
|
| -
|
| - private:
|
| - enum SubexpressionType {
|
| - INITIAL,
|
| - CAPTURE, // All positive values represent captures.
|
| - POSITIVE_LOOKAROUND,
|
| - NEGATIVE_LOOKAROUND,
|
| - GROUPING
|
| - };
|
| -
|
| - class RegExpParserState : public ZoneObject {
|
| - public:
|
| - RegExpParserState(RegExpParserState* previous_state,
|
| - SubexpressionType group_type,
|
| - RegExpLookaround::Type lookaround_type,
|
| - int disjunction_capture_index, Zone* zone)
|
| - : previous_state_(previous_state),
|
| - builder_(new (zone) RegExpBuilder(zone)),
|
| - group_type_(group_type),
|
| - lookaround_type_(lookaround_type),
|
| - disjunction_capture_index_(disjunction_capture_index) {}
|
| - // Parser state of containing expression, if any.
|
| - RegExpParserState* previous_state() { return previous_state_; }
|
| - bool IsSubexpression() { return previous_state_ != NULL; }
|
| - // RegExpBuilder building this regexp's AST.
|
| - RegExpBuilder* builder() { return builder_; }
|
| - // Type of regexp being parsed (parenthesized group or entire regexp).
|
| - SubexpressionType group_type() { return group_type_; }
|
| - // Lookahead or Lookbehind.
|
| - RegExpLookaround::Type lookaround_type() { return lookaround_type_; }
|
| - // Index in captures array of first capture in this sub-expression, if any.
|
| - // Also the capture index of this sub-expression itself, if group_type
|
| - // is CAPTURE.
|
| - int capture_index() { return disjunction_capture_index_; }
|
| -
|
| - // Check whether the parser is inside a capture group with the given index.
|
| - bool IsInsideCaptureGroup(int index);
|
| -
|
| - private:
|
| - // Linked list implementation of stack of states.
|
| - RegExpParserState* previous_state_;
|
| - // Builder for the stored disjunction.
|
| - RegExpBuilder* builder_;
|
| - // Stored disjunction type (capture, look-ahead or grouping), if any.
|
| - SubexpressionType group_type_;
|
| - // Stored read direction.
|
| - RegExpLookaround::Type lookaround_type_;
|
| - // Stored disjunction's capture index (if any).
|
| - int disjunction_capture_index_;
|
| - };
|
| -
|
| - // Return the 1-indexed RegExpCapture object, allocate if necessary.
|
| - RegExpCapture* GetCapture(int index);
|
| -
|
| - Isolate* isolate() { return isolate_; }
|
| - Zone* zone() const { return zone_; }
|
| -
|
| - uc32 current() { return current_; }
|
| - bool has_more() { return has_more_; }
|
| - bool has_next() { return next_pos_ < in()->length(); }
|
| - uc32 Next();
|
| - FlatStringReader* in() { return in_; }
|
| - void ScanForCaptures();
|
| -
|
| - Isolate* isolate_;
|
| - Zone* zone_;
|
| - Handle<String>* error_;
|
| - ZoneList<RegExpCapture*>* captures_;
|
| - FlatStringReader* in_;
|
| - uc32 current_;
|
| - int next_pos_;
|
| - int captures_started_;
|
| - // The capture count is only valid after we have scanned for captures.
|
| - int capture_count_;
|
| - bool has_more_;
|
| - bool multiline_;
|
| - bool unicode_;
|
| - bool simple_;
|
| - bool contains_anchor_;
|
| - bool is_scanned_for_captures_;
|
| - bool failed_;
|
| -};
|
| -
|
| -// ----------------------------------------------------------------------------
|
| // JAVASCRIPT PARSING
|
|
|
| class Parser;
|
|
|