| OLD | NEW | 
|---|
| 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef VM_REGEXP_PARSER_H_ | 5 #ifndef VM_REGEXP_PARSER_H_ | 
| 6 #define VM_REGEXP_PARSER_H_ | 6 #define VM_REGEXP_PARSER_H_ | 
| 7 | 7 | 
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" | 
| 9 #include "vm/growable_array.h" | 9 #include "vm/growable_array.h" | 
| 10 #include "vm/regexp_ast.h" | 10 #include "vm/regexp_ast.h" | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 25   void NewAlternative();  // '|' | 25   void NewAlternative();  // '|' | 
| 26   void AddQuantifierToAtom( | 26   void AddQuantifierToAtom( | 
| 27       intptr_t min, intptr_t max, RegExpQuantifier::QuantifierType type); | 27       intptr_t min, intptr_t max, RegExpQuantifier::QuantifierType type); | 
| 28   RegExpTree* ToRegExp(); | 28   RegExpTree* ToRegExp(); | 
| 29 | 29 | 
| 30  private: | 30  private: | 
| 31   void FlushCharacters(); | 31   void FlushCharacters(); | 
| 32   void FlushText(); | 32   void FlushText(); | 
| 33   void FlushTerms(); | 33   void FlushTerms(); | 
| 34 | 34 | 
| 35   Isolate* isolate() const { return isolate_; } | 35   Zone* zone() const { return zone_; } | 
| 36 | 36 | 
| 37   Isolate* isolate_; | 37   Zone* zone_; | 
| 38   bool pending_empty_; | 38   bool pending_empty_; | 
| 39   ZoneGrowableArray<uint16_t>* characters_; | 39   ZoneGrowableArray<uint16_t>* characters_; | 
| 40   GrowableArray<RegExpTree*> terms_; | 40   GrowableArray<RegExpTree*> terms_; | 
| 41   GrowableArray<RegExpTree*> text_; | 41   GrowableArray<RegExpTree*> text_; | 
| 42   GrowableArray<RegExpTree*> alternatives_; | 42   GrowableArray<RegExpTree*> alternatives_; | 
| 43 #ifdef DEBUG | 43 #ifdef DEBUG | 
| 44   enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_; | 44   enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_; | 
| 45 #define LAST(x) last_added_ = x; | 45 #define LAST(x) last_added_ = x; | 
| 46 #else | 46 #else | 
| 47 #define LAST(x) | 47 #define LAST(x) | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 111     POSITIVE_LOOKAHEAD, | 111     POSITIVE_LOOKAHEAD, | 
| 112     NEGATIVE_LOOKAHEAD, | 112     NEGATIVE_LOOKAHEAD, | 
| 113     GROUPING | 113     GROUPING | 
| 114   }; | 114   }; | 
| 115 | 115 | 
| 116   class RegExpParserState : public ZoneAllocated { | 116   class RegExpParserState : public ZoneAllocated { | 
| 117    public: | 117    public: | 
| 118     RegExpParserState(RegExpParserState* previous_state, | 118     RegExpParserState(RegExpParserState* previous_state, | 
| 119                       SubexpressionType group_type, | 119                       SubexpressionType group_type, | 
| 120                       intptr_t disjunction_capture_index, | 120                       intptr_t disjunction_capture_index, | 
| 121                       Isolate *isolate) | 121                       Zone *zone) | 
| 122         : previous_state_(previous_state), | 122         : previous_state_(previous_state), | 
| 123           builder_(new(isolate) RegExpBuilder()), | 123           builder_(new(zone) RegExpBuilder()), | 
| 124           group_type_(group_type), | 124           group_type_(group_type), | 
| 125           disjunction_capture_index_(disjunction_capture_index) {} | 125           disjunction_capture_index_(disjunction_capture_index) {} | 
| 126     // Parser state of containing expression, if any. | 126     // Parser state of containing expression, if any. | 
| 127     RegExpParserState* previous_state() { return previous_state_; } | 127     RegExpParserState* previous_state() { return previous_state_; } | 
| 128     bool IsSubexpression() { return previous_state_ != NULL; } | 128     bool IsSubexpression() { return previous_state_ != NULL; } | 
| 129     // RegExpBuilder building this regexp's AST. | 129     // RegExpBuilder building this regexp's AST. | 
| 130     RegExpBuilder* builder() { return builder_; } | 130     RegExpBuilder* builder() { return builder_; } | 
| 131     // Type of regexp being parsed (parenthesized group or entire regexp). | 131     // Type of regexp being parsed (parenthesized group or entire regexp). | 
| 132     SubexpressionType group_type() { return group_type_; } | 132     SubexpressionType group_type() { return group_type_; } | 
| 133     // Index in captures array of first capture in this sub-expression, if any. | 133     // Index in captures array of first capture in this sub-expression, if any. | 
| 134     // Also the capture index of this sub-expression itself, if group_type | 134     // Also the capture index of this sub-expression itself, if group_type | 
| 135     // is CAPTURE. | 135     // is CAPTURE. | 
| 136     intptr_t capture_index() { return disjunction_capture_index_; } | 136     intptr_t capture_index() { return disjunction_capture_index_; } | 
| 137 | 137 | 
| 138    private: | 138    private: | 
| 139     // Linked list implementation of stack of states. | 139     // Linked list implementation of stack of states. | 
| 140     RegExpParserState* previous_state_; | 140     RegExpParserState* previous_state_; | 
| 141     // Builder for the stored disjunction. | 141     // Builder for the stored disjunction. | 
| 142     RegExpBuilder* builder_; | 142     RegExpBuilder* builder_; | 
| 143     // Stored disjunction type (capture, look-ahead or grouping), if any. | 143     // Stored disjunction type (capture, look-ahead or grouping), if any. | 
| 144     SubexpressionType group_type_; | 144     SubexpressionType group_type_; | 
| 145     // Stored disjunction's capture index (if any). | 145     // Stored disjunction's capture index (if any). | 
| 146     intptr_t disjunction_capture_index_; | 146     intptr_t disjunction_capture_index_; | 
| 147   }; | 147   }; | 
| 148 | 148 | 
| 149   Isolate* isolate() { return isolate_; } | 149   Zone* zone() { return zone_; } | 
| 150 | 150 | 
| 151   uint32_t current() { return current_; } | 151   uint32_t current() { return current_; } | 
| 152   bool has_more() { return has_more_; } | 152   bool has_more() { return has_more_; } | 
| 153   bool has_next() { return next_pos_ < in().Length(); } | 153   bool has_next() { return next_pos_ < in().Length(); } | 
| 154   uint32_t Next(); | 154   uint32_t Next(); | 
| 155   const String& in() { return in_; } | 155   const String& in() { return in_; } | 
| 156   void ScanForCaptures(); | 156   void ScanForCaptures(); | 
| 157 | 157 | 
| 158   Isolate* isolate_; | 158   Zone* zone_; | 
| 159   String* error_; | 159   String* error_; | 
| 160   ZoneGrowableArray<RegExpCapture*>* captures_; | 160   ZoneGrowableArray<RegExpCapture*>* captures_; | 
| 161   const String& in_; | 161   const String& in_; | 
| 162   uint32_t current_; | 162   uint32_t current_; | 
| 163   intptr_t next_pos_; | 163   intptr_t next_pos_; | 
| 164   // The capture count is only valid after we have scanned for captures. | 164   // The capture count is only valid after we have scanned for captures. | 
| 165   intptr_t capture_count_; | 165   intptr_t capture_count_; | 
| 166   bool has_more_; | 166   bool has_more_; | 
| 167   bool multiline_; | 167   bool multiline_; | 
| 168   bool simple_; | 168   bool simple_; | 
| 169   bool contains_anchor_; | 169   bool contains_anchor_; | 
| 170   bool is_scanned_for_captures_; | 170   bool is_scanned_for_captures_; | 
| 171   bool failed_; | 171   bool failed_; | 
| 172 }; | 172 }; | 
| 173 | 173 | 
| 174 }  // namespace dart | 174 }  // namespace dart | 
| 175 | 175 | 
| 176 #endif  // VM_REGEXP_PARSER_H_ | 176 #endif  // VM_REGEXP_PARSER_H_ | 
| OLD | NEW | 
|---|