| 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)
|
|
|
|
|