| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
| 7 | 7 |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/hashmap.h" | 10 #include "src/hashmap.h" |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 } | 575 } |
| 576 | 576 |
| 577 void ReportMessageAt(Scanner::Location location, | 577 void ReportMessageAt(Scanner::Location location, |
| 578 MessageTemplate::Template message, | 578 MessageTemplate::Template message, |
| 579 ParseErrorType error_type = kSyntaxError) { | 579 ParseErrorType error_type = kSyntaxError) { |
| 580 Traits::ReportMessageAt(location, message, reinterpret_cast<const char*>(0), | 580 Traits::ReportMessageAt(location, message, reinterpret_cast<const char*>(0), |
| 581 error_type); | 581 error_type); |
| 582 } | 582 } |
| 583 | 583 |
| 584 void GetUnexpectedTokenMessage( | 584 void GetUnexpectedTokenMessage( |
| 585 Token::Value token, MessageTemplate::Template* message, const char** arg, | 585 Token::Value token, MessageTemplate::Template* message, |
| 586 Scanner::Location* location, const char** arg, |
| 586 MessageTemplate::Template default_ = MessageTemplate::kUnexpectedToken); | 587 MessageTemplate::Template default_ = MessageTemplate::kUnexpectedToken); |
| 587 | 588 |
| 588 void ReportUnexpectedToken(Token::Value token); | 589 void ReportUnexpectedToken(Token::Value token); |
| 589 void ReportUnexpectedTokenAt( | 590 void ReportUnexpectedTokenAt( |
| 590 Scanner::Location location, Token::Value token, | 591 Scanner::Location location, Token::Value token, |
| 591 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken); | 592 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken); |
| 592 | 593 |
| 593 void ReportClassifierError( | 594 void ReportClassifierError( |
| 594 const typename ExpressionClassifier::Error& error) { | 595 const typename ExpressionClassifier::Error& error) { |
| 595 Traits::ReportMessageAt(error.location, error.message, error.arg, | 596 Traits::ReportMessageAt(error.location, error.message, error.arg, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 void ValidateLetPattern(const ExpressionClassifier* classifier, bool* ok) { | 677 void ValidateLetPattern(const ExpressionClassifier* classifier, bool* ok) { |
| 677 if (!classifier->is_valid_let_pattern()) { | 678 if (!classifier->is_valid_let_pattern()) { |
| 678 ReportClassifierError(classifier->let_pattern_error()); | 679 ReportClassifierError(classifier->let_pattern_error()); |
| 679 *ok = false; | 680 *ok = false; |
| 680 } | 681 } |
| 681 } | 682 } |
| 682 | 683 |
| 683 void ExpressionUnexpectedToken(ExpressionClassifier* classifier) { | 684 void ExpressionUnexpectedToken(ExpressionClassifier* classifier) { |
| 684 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; | 685 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; |
| 685 const char* arg; | 686 const char* arg; |
| 686 GetUnexpectedTokenMessage(peek(), &message, &arg); | 687 Scanner::Location location = scanner()->peek_location(); |
| 687 classifier->RecordExpressionError(scanner()->peek_location(), message, arg); | 688 GetUnexpectedTokenMessage(peek(), &message, &location, &arg); |
| 689 classifier->RecordExpressionError(location, message, arg); |
| 688 } | 690 } |
| 689 | 691 |
| 690 void BindingPatternUnexpectedToken(ExpressionClassifier* classifier) { | 692 void BindingPatternUnexpectedToken(ExpressionClassifier* classifier) { |
| 691 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; | 693 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; |
| 692 const char* arg; | 694 const char* arg; |
| 693 GetUnexpectedTokenMessage(peek(), &message, &arg); | 695 Scanner::Location location = scanner()->peek_location(); |
| 694 classifier->RecordBindingPatternError(scanner()->peek_location(), message, | 696 GetUnexpectedTokenMessage(peek(), &message, &location, &arg); |
| 695 arg); | 697 classifier->RecordBindingPatternError(location, message, arg); |
| 696 } | 698 } |
| 697 | 699 |
| 698 void ArrowFormalParametersUnexpectedToken(ExpressionClassifier* classifier) { | 700 void ArrowFormalParametersUnexpectedToken(ExpressionClassifier* classifier) { |
| 699 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; | 701 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; |
| 700 const char* arg; | 702 const char* arg; |
| 701 GetUnexpectedTokenMessage(peek(), &message, &arg); | 703 Scanner::Location location = scanner()->peek_location(); |
| 702 classifier->RecordArrowFormalParametersError(scanner()->peek_location(), | 704 GetUnexpectedTokenMessage(peek(), &message, &location, &arg); |
| 703 message, arg); | 705 classifier->RecordArrowFormalParametersError(location, message, arg); |
| 704 } | 706 } |
| 705 | 707 |
| 706 void FormalParameterInitializerUnexpectedToken( | 708 void FormalParameterInitializerUnexpectedToken( |
| 707 ExpressionClassifier* classifier) { | 709 ExpressionClassifier* classifier) { |
| 708 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; | 710 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; |
| 709 const char* arg; | 711 const char* arg; |
| 710 GetUnexpectedTokenMessage(peek(), &message, &arg); | 712 Scanner::Location location = scanner()->peek_location(); |
| 711 classifier->RecordFormalParameterInitializerError( | 713 GetUnexpectedTokenMessage(peek(), &message, &location, &arg); |
| 712 scanner()->peek_location(), message, arg); | 714 classifier->RecordFormalParameterInitializerError(location, message, arg); |
| 713 } | 715 } |
| 714 | 716 |
| 715 // Recursive descent functions: | 717 // Recursive descent functions: |
| 716 | 718 |
| 717 // Parses an identifier that is valid for the current scope, in particular it | 719 // Parses an identifier that is valid for the current scope, in particular it |
| 718 // fails on strict mode future reserved keywords in a strict scope. If | 720 // fails on strict mode future reserved keywords in a strict scope. If |
| 719 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or | 721 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or |
| 720 // "arguments" as identifier even in strict mode (this is needed in cases like | 722 // "arguments" as identifier even in strict mode (this is needed in cases like |
| 721 // "var foo = eval;"). | 723 // "var foo = eval;"). |
| 722 IdentifierT ParseIdentifier(AllowRestrictedIdentifiers, bool* ok); | 724 IdentifierT ParseIdentifier(AllowRestrictedIdentifiers, bool* ok); |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 950 *function_state_stack = this; | 952 *function_state_stack = this; |
| 951 } | 953 } |
| 952 | 954 |
| 953 | 955 |
| 954 template <class Traits> | 956 template <class Traits> |
| 955 ParserBase<Traits>::FunctionState::~FunctionState() { | 957 ParserBase<Traits>::FunctionState::~FunctionState() { |
| 956 *scope_stack_ = outer_scope_; | 958 *scope_stack_ = outer_scope_; |
| 957 *function_state_stack_ = outer_function_state_; | 959 *function_state_stack_ = outer_function_state_; |
| 958 } | 960 } |
| 959 | 961 |
| 960 | |
| 961 template <class Traits> | 962 template <class Traits> |
| 962 void ParserBase<Traits>::GetUnexpectedTokenMessage( | 963 void ParserBase<Traits>::GetUnexpectedTokenMessage( |
| 963 Token::Value token, MessageTemplate::Template* message, const char** arg, | 964 Token::Value token, MessageTemplate::Template* message, |
| 965 Scanner::Location* location, const char** arg, |
| 964 MessageTemplate::Template default_) { | 966 MessageTemplate::Template default_) { |
| 965 *arg = nullptr; | 967 *arg = nullptr; |
| 966 switch (token) { | 968 switch (token) { |
| 967 case Token::EOS: | 969 case Token::EOS: |
| 968 *message = MessageTemplate::kUnexpectedEOS; | 970 *message = MessageTemplate::kUnexpectedEOS; |
| 969 break; | 971 break; |
| 970 case Token::SMI: | 972 case Token::SMI: |
| 971 case Token::NUMBER: | 973 case Token::NUMBER: |
| 972 *message = MessageTemplate::kUnexpectedTokenNumber; | 974 *message = MessageTemplate::kUnexpectedTokenNumber; |
| 973 break; | 975 break; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 990 break; | 992 break; |
| 991 case Token::TEMPLATE_SPAN: | 993 case Token::TEMPLATE_SPAN: |
| 992 case Token::TEMPLATE_TAIL: | 994 case Token::TEMPLATE_TAIL: |
| 993 *message = MessageTemplate::kUnexpectedTemplateString; | 995 *message = MessageTemplate::kUnexpectedTemplateString; |
| 994 break; | 996 break; |
| 995 case Token::ESCAPED_STRICT_RESERVED_WORD: | 997 case Token::ESCAPED_STRICT_RESERVED_WORD: |
| 996 case Token::ESCAPED_KEYWORD: | 998 case Token::ESCAPED_KEYWORD: |
| 997 *message = MessageTemplate::kInvalidEscapedReservedWord; | 999 *message = MessageTemplate::kInvalidEscapedReservedWord; |
| 998 break; | 1000 break; |
| 999 case Token::ILLEGAL: | 1001 case Token::ILLEGAL: |
| 1000 *message = MessageTemplate::kInvalidOrUnexpectedToken; | 1002 if (scanner()->has_error()) { |
| 1003 *message = scanner()->error(); |
| 1004 *location = scanner()->error_location(); |
| 1005 } else { |
| 1006 *message = MessageTemplate::kInvalidOrUnexpectedToken; |
| 1007 } |
| 1001 break; | 1008 break; |
| 1002 default: | 1009 default: |
| 1003 const char* name = Token::String(token); | 1010 const char* name = Token::String(token); |
| 1004 DCHECK(name != NULL); | 1011 DCHECK(name != NULL); |
| 1005 *arg = name; | 1012 *arg = name; |
| 1006 break; | 1013 break; |
| 1007 } | 1014 } |
| 1008 } | 1015 } |
| 1009 | 1016 |
| 1010 | 1017 |
| 1011 template <class Traits> | 1018 template <class Traits> |
| 1012 void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) { | 1019 void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) { |
| 1013 return ReportUnexpectedTokenAt(scanner_->location(), token); | 1020 return ReportUnexpectedTokenAt(scanner_->location(), token); |
| 1014 } | 1021 } |
| 1015 | 1022 |
| 1016 | 1023 |
| 1017 template <class Traits> | 1024 template <class Traits> |
| 1018 void ParserBase<Traits>::ReportUnexpectedTokenAt( | 1025 void ParserBase<Traits>::ReportUnexpectedTokenAt( |
| 1019 Scanner::Location source_location, Token::Value token, | 1026 Scanner::Location source_location, Token::Value token, |
| 1020 MessageTemplate::Template message) { | 1027 MessageTemplate::Template message) { |
| 1021 const char* arg; | 1028 const char* arg; |
| 1022 GetUnexpectedTokenMessage(token, &message, &arg); | 1029 GetUnexpectedTokenMessage(token, &message, &source_location, &arg); |
| 1023 Traits::ReportMessageAt(source_location, message, arg); | 1030 Traits::ReportMessageAt(source_location, message, arg); |
| 1024 } | 1031 } |
| 1025 | 1032 |
| 1026 | 1033 |
| 1027 template <class Traits> | 1034 template <class Traits> |
| 1028 typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( | 1035 typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( |
| 1029 AllowRestrictedIdentifiers allow_restricted_identifiers, bool* ok) { | 1036 AllowRestrictedIdentifiers allow_restricted_identifiers, bool* ok) { |
| 1030 ExpressionClassifier classifier(this); | 1037 ExpressionClassifier classifier(this); |
| 1031 auto result = ParseAndClassifyIdentifier(&classifier, ok); | 1038 auto result = ParseAndClassifyIdentifier(&classifier, ok); |
| 1032 if (!*ok) return Traits::EmptyIdentifier(); | 1039 if (!*ok) return Traits::EmptyIdentifier(); |
| (...skipping 2078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3111 has_seen_constructor_ = true; | 3118 has_seen_constructor_ = true; |
| 3112 return; | 3119 return; |
| 3113 } | 3120 } |
| 3114 } | 3121 } |
| 3115 | 3122 |
| 3116 | 3123 |
| 3117 } // namespace internal | 3124 } // namespace internal |
| 3118 } // namespace v8 | 3125 } // namespace v8 |
| 3119 | 3126 |
| 3120 #endif // V8_PARSING_PARSER_BASE_H | 3127 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |