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

Unified Diff: src/scanner.h

Issue 160073006: Implement handling of arrow functions in the parser (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Extra parens in parameter lists now recognized, no longer segfaults on "()" Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698