Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(182)

Side by Side Diff: src/parser.cc

Issue 155048: Reverted RegExp parser error message change that broke layout test. (Closed)
Patch Set: Created 11 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3830 matching lines...) Expand 10 before | Expand all | Expand 10 after
3841 current_ = kEndMarker; 3841 current_ = kEndMarker;
3842 next_pos_ = in()->length(); 3842 next_pos_ = in()->length();
3843 return NULL; 3843 return NULL;
3844 } 3844 }
3845 3845
3846 3846
3847 // Pattern :: 3847 // Pattern ::
3848 // Disjunction 3848 // Disjunction
3849 RegExpTree* RegExpParser::ParsePattern() { 3849 RegExpTree* RegExpParser::ParsePattern() {
3850 RegExpTree* result = ParseDisjunction(CHECK_FAILED); 3850 RegExpTree* result = ParseDisjunction(CHECK_FAILED);
3851 if (has_more()) { 3851 ASSERT(!has_more());
3852 ReportError(CStrVector("Unmatched ')'") CHECK_FAILED);
3853 }
3854 // If the result of parsing is a literal string atom, and it has the 3852 // If the result of parsing is a literal string atom, and it has the
3855 // same length as the input, then the atom is identical to the input. 3853 // same length as the input, then the atom is identical to the input.
3856 if (result->IsAtom() && result->AsAtom()->length() == in()->length()) { 3854 if (result->IsAtom() && result->AsAtom()->length() == in()->length()) {
3857 simple_ = true; 3855 simple_ = true;
3858 } 3856 }
3859 return result; 3857 return result;
3860 } 3858 }
3861 3859
3862 3860
3863 // Disjunction :: 3861 // Disjunction ::
(...skipping 17 matching lines...) Expand all
3881 case kEndMarker: 3879 case kEndMarker:
3882 if (stored_state->IsSubexpression()) { 3880 if (stored_state->IsSubexpression()) {
3883 // Inside a parenthesized group when hitting end of input. 3881 // Inside a parenthesized group when hitting end of input.
3884 ReportError(CStrVector("Unterminated group") CHECK_FAILED); 3882 ReportError(CStrVector("Unterminated group") CHECK_FAILED);
3885 } 3883 }
3886 ASSERT_EQ(INITIAL, stored_state->group_type()); 3884 ASSERT_EQ(INITIAL, stored_state->group_type());
3887 // Parsing completed successfully. 3885 // Parsing completed successfully.
3888 return builder->ToRegExp(); 3886 return builder->ToRegExp();
3889 case ')': { 3887 case ')': {
3890 if (!stored_state->IsSubexpression()) { 3888 if (!stored_state->IsSubexpression()) {
3891 ReportError(CStrVector("Unexpected ')'") CHECK_FAILED); 3889 ReportError(CStrVector("Unmatched ')'") CHECK_FAILED);
3892 } 3890 }
3893 ASSERT_NE(INITIAL, stored_state->group_type()); 3891 ASSERT_NE(INITIAL, stored_state->group_type());
3894 3892
3895 Advance(); 3893 Advance();
3896 // End disjunction parsing and convert builder content to new single 3894 // End disjunction parsing and convert builder content to new single
3897 // regexp atom. 3895 // regexp atom.
3898 RegExpTree* body = builder->ToRegExp(); 3896 RegExpTree* body = builder->ToRegExp();
3899 3897
3900 int end_capture_index = captures_started(); 3898 int end_capture_index = captures_started();
3901 3899
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
4021 // 4019 //
4022 // CharacterClassEscape :: one of 4020 // CharacterClassEscape :: one of
4023 // d D s S w W 4021 // d D s S w W
4024 case 'd': case 'D': case 's': case 'S': case 'w': case 'W': { 4022 case 'd': case 'D': case 's': case 'S': case 'w': case 'W': {
4025 uc32 c = Next(); 4023 uc32 c = Next();
4026 Advance(2); 4024 Advance(2);
4027 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2); 4025 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2);
4028 CharacterRange::AddClassEscape(c, ranges); 4026 CharacterRange::AddClassEscape(c, ranges);
4029 RegExpTree* atom = new RegExpCharacterClass(ranges, false); 4027 RegExpTree* atom = new RegExpCharacterClass(ranges, false);
4030 builder->AddAtom(atom); 4028 builder->AddAtom(atom);
4031 goto has_read_atom; // Avoid setting has_character_escapes_. 4029 break;
4032 } 4030 }
4033 case '1': case '2': case '3': case '4': case '5': case '6': 4031 case '1': case '2': case '3': case '4': case '5': case '6':
4034 case '7': case '8': case '9': { 4032 case '7': case '8': case '9': {
4035 int index = 0; 4033 int index = 0;
4036 if (ParseBackReferenceIndex(&index)) { 4034 if (ParseBackReferenceIndex(&index)) {
4037 RegExpCapture* capture = NULL; 4035 RegExpCapture* capture = NULL;
4038 if (captures_ != NULL && index <= captures_->length()) { 4036 if (captures_ != NULL && index <= captures_->length()) {
4039 capture = captures_->at(index - 1); 4037 capture = captures_->at(index - 1);
4040 } 4038 }
4041 if (capture == NULL) { 4039 if (capture == NULL) {
4042 builder->AddEmpty(); 4040 builder->AddEmpty();
4043 goto has_read_atom; 4041 break;
4044 } 4042 }
4045 RegExpTree* atom = new RegExpBackReference(capture); 4043 RegExpTree* atom = new RegExpBackReference(capture);
4046 builder->AddAtom(atom); 4044 builder->AddAtom(atom);
4047 goto has_read_atom; // Avoid setting has_character_escapes_. 4045 break;
4048 } 4046 }
4049 uc32 first_digit = Next(); 4047 uc32 first_digit = Next();
4050 if (first_digit == '8' || first_digit == '9') { 4048 if (first_digit == '8' || first_digit == '9') {
4051 // Treat as identity escape 4049 // Treat as identity escape
4052 builder->AddCharacter(first_digit); 4050 builder->AddCharacter(first_digit);
4053 Advance(2); 4051 Advance(2);
4054 break; 4052 break;
4055 } 4053 }
4056 } 4054 }
4057 // FALLTHROUGH 4055 // FALLTHROUGH
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
4122 ReportError(CStrVector("Nothing to repeat") CHECK_FAILED); 4120 ReportError(CStrVector("Nothing to repeat") CHECK_FAILED);
4123 } 4121 }
4124 // fallthrough 4122 // fallthrough
4125 } 4123 }
4126 default: 4124 default:
4127 builder->AddCharacter(current()); 4125 builder->AddCharacter(current());
4128 Advance(); 4126 Advance();
4129 break; 4127 break;
4130 } // end switch(current()) 4128 } // end switch(current())
4131 4129
4132 has_read_atom:
4133 int min; 4130 int min;
4134 int max; 4131 int max;
4135 switch (current()) { 4132 switch (current()) {
4136 // QuantifierPrefix :: 4133 // QuantifierPrefix ::
4137 // * 4134 // *
4138 // + 4135 // +
4139 // ? 4136 // ?
4140 // { 4137 // {
4141 case '*': 4138 case '*':
4142 min = 0; 4139 min = 0;
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
4679 start_position, 4676 start_position,
4680 is_expression); 4677 is_expression);
4681 return result; 4678 return result;
4682 } 4679 }
4683 4680
4684 4681
4685 #undef NEW 4682 #undef NEW
4686 4683
4687 4684
4688 } } // namespace v8::internal 4685 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698