Index: src/scanner.h |
diff --git a/src/scanner.h b/src/scanner.h |
index 037da5b1739a302cbdda71ce50e82a3055c0d712..2c0f687f6625b2c7f4820b79ab28ab717e8c48c6 100644 |
--- a/src/scanner.h |
+++ b/src/scanner.h |
@@ -187,6 +187,84 @@ class DuplicateFinder { |
// ---------------------------------------------------------------------------- |
+// ParamListFinder discovers sequences of tokens which form a valid function |
+// parameter list. |
+ |
+class ParamListFinder { |
+ public: |
+ ParamListFinder(): state_(Invalid), start_pos_(-1) { } |
+ |
+ void Update(Token::Value token, int pos) { |
+ switch (state_) { |
+ case Valid: |
+ state_ = Invalid; |
+ start_pos_ = -1; |
+ // Fall-through. |
+ case Invalid: |
+ if (token == Token::LPAREN) { |
+ state_ = LeftParen; |
+ start_pos_ = pos; |
+ } |
+ break; |
+ |
+ case LeftParen: |
+ switch (token) { |
+ case Token::LPAREN: |
+ start_pos_ = pos; |
+ break; |
+ case Token::RPAREN: |
+ state_ = Valid; |
+ break; |
+ case Token::IDENTIFIER: |
+ state_ = Identifier; |
+ break; |
+ default: |
+ state_ = Invalid; |
+ } |
+ break; |
+ |
+ case Identifier: |
+ switch (token) { |
+ case Token::RPAREN: |
+ state_ = Valid; |
+ break; |
+ case Token::COMMA: |
+ state_ = Comma; |
+ break; |
+ default: |
+ state_ = Invalid; |
+ } |
+ break; |
+ |
+ case Comma: |
+ if (token == Token::IDENTIFIER) { |
+ state_ = Identifier; |
+ } else { |
+ state_ = Invalid; |
+ } |
+ break; |
+ } |
+ } |
+ |
+ bool IsValid(int pos) const { |
+ return state_ == Valid && start_pos_ == pos; |
+ } |
+ |
+ private: |
+ enum State { |
+ Invalid, |
+ Valid, |
+ LeftParen, |
+ Identifier, |
+ Comma |
+ }; |
+ |
+ State state_; |
+ int start_pos_; |
+}; |
+ |
+ |
+// ---------------------------------------------------------------------------- |
// LiteralBuffer - Collector of chars of literals. |
class LiteralBuffer { |
@@ -402,6 +480,10 @@ class Scanner { |
} |
} |
+ bool IsValidParameterList(int pos) const { |
+ return param_list_finder_.IsValid(pos); |
+ } |
+ |
int FindNumber(DuplicateFinder* finder, int value); |
int FindSymbol(DuplicateFinder* finder, int value); |
@@ -605,6 +687,8 @@ class Scanner { |
LiteralBuffer literal_buffer1_; |
LiteralBuffer literal_buffer2_; |
+ ParamListFinder param_list_finder_; |
+ |
TokenDesc current_; // desc for current token (as returned by Next()) |
TokenDesc next_; // desc for next token (one token look-ahead) |