Index: src/scanner.h |
diff --git a/src/scanner.h b/src/scanner.h |
index 8c575dfc1356578d028cce75c7e785b507963c0a..1f49fd0e6ec97564164b8ea162e45d7239a6afa3 100644 |
--- a/src/scanner.h |
+++ b/src/scanner.h |
@@ -30,6 +30,7 @@ |
#include "token.h" |
#include "char-predicates-inl.h" |
+#include "scanner-base.h" |
namespace v8 { |
namespace internal { |
@@ -142,126 +143,6 @@ class ExternalStringUTF16Buffer: public UTF16Buffer { |
}; |
-class KeywordMatcher { |
-// Incrementally recognize keywords. |
-// |
-// Recognized keywords: |
-// break case catch const* continue debugger* default delete do else |
-// finally false for function if in instanceof native* new null |
-// return switch this throw true try typeof var void while with |
-// |
-// *: Actually "future reserved keywords". These are the only ones we |
-// recognized, the remaining are allowed as identifiers. |
- public: |
- KeywordMatcher() |
- : state_(INITIAL), |
- token_(Token::IDENTIFIER), |
- keyword_(NULL), |
- counter_(0), |
- keyword_token_(Token::ILLEGAL) {} |
- |
- Token::Value token() { return token_; } |
- |
- inline void AddChar(uc32 input) { |
- if (state_ != UNMATCHABLE) { |
- Step(input); |
- } |
- } |
- |
- void Fail() { |
- token_ = Token::IDENTIFIER; |
- state_ = UNMATCHABLE; |
- } |
- |
- private: |
- enum State { |
- UNMATCHABLE, |
- INITIAL, |
- KEYWORD_PREFIX, |
- KEYWORD_MATCHED, |
- C, |
- CA, |
- CO, |
- CON, |
- D, |
- DE, |
- F, |
- I, |
- IN, |
- N, |
- T, |
- TH, |
- TR, |
- V, |
- W |
- }; |
- |
- struct FirstState { |
- const char* keyword; |
- State state; |
- Token::Value token; |
- }; |
- |
- // Range of possible first characters of a keyword. |
- static const unsigned int kFirstCharRangeMin = 'b'; |
- static const unsigned int kFirstCharRangeMax = 'w'; |
- static const unsigned int kFirstCharRangeLength = |
- kFirstCharRangeMax - kFirstCharRangeMin + 1; |
- // State map for first keyword character range. |
- static FirstState first_states_[kFirstCharRangeLength]; |
- |
- // If input equals keyword's character at position, continue matching keyword |
- // from that position. |
- inline bool MatchKeywordStart(uc32 input, |
- const char* keyword, |
- int position, |
- Token::Value token_if_match) { |
- if (input == keyword[position]) { |
- state_ = KEYWORD_PREFIX; |
- this->keyword_ = keyword; |
- this->counter_ = position + 1; |
- this->keyword_token_ = token_if_match; |
- return true; |
- } |
- return false; |
- } |
- |
- // If input equals match character, transition to new state and return true. |
- inline bool MatchState(uc32 input, char match, State new_state) { |
- if (input == match) { |
- state_ = new_state; |
- return true; |
- } |
- return false; |
- } |
- |
- inline bool MatchKeyword(uc32 input, |
- char match, |
- State new_state, |
- Token::Value keyword_token) { |
- if (input != match) { |
- return false; |
- } |
- state_ = new_state; |
- token_ = keyword_token; |
- return true; |
- } |
- |
- void Step(uc32 input); |
- |
- // Current state. |
- State state_; |
- // Token for currently added characters. |
- Token::Value token_; |
- |
- // Matching a specific keyword string (there is only one possible valid |
- // keyword with the current prefix). |
- const char* keyword_; |
- int counter_; |
- Token::Value keyword_token_; |
-}; |
- |
- |
enum ParserLanguage { JAVASCRIPT, JSON }; |