1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ostreams.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-ast.h" 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAKE_ACCEPT(Name) \ 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* RegExp##Name::Accept(RegExpVisitor* visitor, void* data) { \ 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return visitor->Visit##Name(this, data); \ 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochFOR_EACH_REG_EXP_TREE_TYPE(MAKE_ACCEPT) 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef MAKE_ACCEPT 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAKE_TYPE_CASE(Name) \ 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExp##Name* RegExpTree::As##Name() { return NULL; } \ 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool RegExpTree::Is##Name() { return false; } 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochFOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE) 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef MAKE_TYPE_CASE 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAKE_TYPE_CASE(Name) \ 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExp##Name* RegExp##Name::As##Name() { return this; } \ 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool RegExp##Name::Is##Name() { return true; } 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochFOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE) 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef MAKE_TYPE_CASE 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic Interval ListCaptureRegisters(ZoneList<RegExpTree*>* children) { 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Interval result = Interval::Empty(); 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < children->length(); i++) 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result = result.Union(children->at(i)->CaptureRegisters()); 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return result; 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInterval RegExpAlternative::CaptureRegisters() { 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ListCaptureRegisters(nodes()); 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInterval RegExpDisjunction::CaptureRegisters() { 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ListCaptureRegisters(alternatives()); 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInterval RegExpLookaround::CaptureRegisters() { 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return body()->CaptureRegisters(); 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInterval RegExpCapture::CaptureRegisters() { 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Interval self(StartRegister(index()), EndRegister(index())); 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return self.Union(body()->CaptureRegisters()); 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInterval RegExpQuantifier::CaptureRegisters() { 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return body()->CaptureRegisters(); 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpAssertion::IsAnchoredAtStart() { 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return assertion_type() == RegExpAssertion::START_OF_INPUT; 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpAssertion::IsAnchoredAtEnd() { 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return assertion_type() == RegExpAssertion::END_OF_INPUT; 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpAlternative::IsAnchoredAtStart() { 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ZoneList<RegExpTree*>* nodes = this->nodes(); 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < nodes->length(); i++) { 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExpTree* node = nodes->at(i); 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (node->IsAnchoredAtStart()) { 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (node->max_match() > 0) { 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpAlternative::IsAnchoredAtEnd() { 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ZoneList<RegExpTree*>* nodes = this->nodes(); 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = nodes->length() - 1; i >= 0; i--) { 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExpTree* node = nodes->at(i); 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (node->IsAnchoredAtEnd()) { 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (node->max_match() > 0) { 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpDisjunction::IsAnchoredAtStart() { 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ZoneList<RegExpTree*>* alternatives = this->alternatives(); 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < alternatives->length(); i++) { 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!alternatives->at(i)->IsAnchoredAtStart()) return false; 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpDisjunction::IsAnchoredAtEnd() { 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ZoneList<RegExpTree*>* alternatives = this->alternatives(); 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < alternatives->length(); i++) { 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!alternatives->at(i)->IsAnchoredAtEnd()) return false; 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpLookaround::IsAnchoredAtStart() { 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return is_positive() && type() == LOOKAHEAD && body()->IsAnchoredAtStart(); 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpCapture::IsAnchoredAtStart() { return body()->IsAnchoredAtStart(); } 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool RegExpCapture::IsAnchoredAtEnd() { return body()->IsAnchoredAtEnd(); } 132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Convert regular expression trees to a simple sexp representation. 135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// This representation should be different from the input grammar 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// in as many cases as possible, to make it more difficult for incorrect 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// parses to look as correct ones which is likely if the input and 138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// output formats are alike. 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass RegExpUnparser final : public RegExpVisitor { 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExpUnparser(std::ostream& os, Zone* zone) : os_(os), zone_(zone) {} 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void VisitCharacterRange(CharacterRange that); 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAKE_CASE(Name) void* Visit##Name(RegExp##Name*, void* data) override; 144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE) 145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef MAKE_CASE 146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch std::ostream& os_; 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Zone* zone_; 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitDisjunction(RegExpDisjunction* that, void* data) { 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "(|"; 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < that->alternatives()->length(); i++) { 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << " "; 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch that->alternatives()->at(i)->Accept(this, data); 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << ")"; 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitAlternative(RegExpAlternative* that, void* data) { 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "(:"; 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < that->nodes()->length(); i++) { 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << " "; 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch that->nodes()->at(i)->Accept(this, data); 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << ")"; 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid RegExpUnparser::VisitCharacterRange(CharacterRange that) { 175342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch os_ << AsUC32(that.from()); 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!that.IsSingleton()) { 177342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch os_ << "-" << AsUC32(that.to()); 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that, 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* data) { 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (that->is_negated()) os_ << "^"; 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "["; 186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < that->ranges(zone_)->length(); i++) { 187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (i > 0) os_ << " "; 188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch VisitCharacterRange(that->ranges(zone_)->at(i)); 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "]"; 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitAssertion(RegExpAssertion* that, void* data) { 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (that->assertion_type()) { 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RegExpAssertion::START_OF_INPUT: 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "@^i"; 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RegExpAssertion::END_OF_INPUT: 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "@$i"; 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RegExpAssertion::START_OF_LINE: 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "@^l"; 205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RegExpAssertion::END_OF_LINE: 207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "@$l"; 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RegExpAssertion::BOUNDARY: 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "@b"; 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case RegExpAssertion::NON_BOUNDARY: 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "@B"; 214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitAtom(RegExpAtom* that, void* data) { 221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "'"; 222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Vector<const uc16> chardata = that->data(); 223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < chardata.length(); i++) { 224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << AsUC16(chardata[i]); 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "'"; 227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitText(RegExpText* that, void* data) { 232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (that->elements()->length() == 1) { 233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch that->elements()->at(0).tree()->Accept(this, data); 234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "(!"; 236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < that->elements()->length(); i++) { 237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << " "; 238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch that->elements()->at(i).tree()->Accept(this, data); 239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << ")"; 241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitQuantifier(RegExpQuantifier* that, void* data) { 247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "(# " << that->min() << " "; 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (that->max() == RegExpTree::kInfinity) { 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "- "; 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << that->max() << " "; 252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << (that->is_greedy() ? "g " : that->is_possessive() ? "p " : "n "); 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch that->body()->Accept(this, data); 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << ")"; 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitCapture(RegExpCapture* that, void* data) { 261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "(^ "; 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch that->body()->Accept(this, data); 263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << ")"; 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitLookaround(RegExpLookaround* that, void* data) { 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "("; 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << (that->type() == RegExpLookaround::LOOKAHEAD ? "->" : "<-"); 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << (that->is_positive() ? " + " : " - "); 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch that->body()->Accept(this, data); 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << ")"; 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitBackReference(RegExpBackReference* that, 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* data) { 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << "(<- " << that->index() << ")"; 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* RegExpUnparser::VisitEmpty(RegExpEmpty* that, void* data) { 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch os_ << '%'; 287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& RegExpTree::Print(std::ostream& os, Zone* zone) { // NOLINT 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExpUnparser unparser(os, zone); 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Accept(&unparser, NULL); 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os; 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRegExpDisjunction::RegExpDisjunction(ZoneList<RegExpTree*>* alternatives) 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : alternatives_(alternatives) { 300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(alternatives->length() > 1); 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExpTree* first_alternative = alternatives->at(0); 302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch min_match_ = first_alternative->min_match(); 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch max_match_ = first_alternative->max_match(); 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 1; i < alternatives->length(); i++) { 305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExpTree* alternative = alternatives->at(i); 306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch min_match_ = Min(min_match_, alternative->min_match()); 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch max_match_ = Max(max_match_, alternative->max_match()); 308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic int IncreaseBy(int previous, int increase) { 313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (RegExpTree::kInfinity - previous < increase) { 314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return RegExpTree::kInfinity; 315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return previous + increase; 317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRegExpAlternative::RegExpAlternative(ZoneList<RegExpTree*>* nodes) 322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : nodes_(nodes) { 323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(nodes->length() > 1); 324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch min_match_ = 0; 325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch max_match_ = 0; 326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < nodes->length(); i++) { 327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RegExpTree* node = nodes->at(i); 328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int node_min_match = node->min_match(); 329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch min_match_ = IncreaseBy(min_match_, node_min_match); 330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int node_max_match = node->max_match(); 331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch max_match_ = IncreaseBy(max_match_, node_max_match); 332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 338