Index: vm/parser.h |
=================================================================== |
--- vm/parser.h (revision 9042) |
+++ vm/parser.h (working copy) |
@@ -79,7 +79,7 @@ |
bool has_expression_temp_var() const { |
return expression_temp_var_ != NULL; |
} |
- static LocalVariable* CreateExpressionTempVar(intptr_t token_index); |
+ static LocalVariable* CreateExpressionTempVar(intptr_t token_pos); |
int first_parameter_index() const { return first_parameter_index_; } |
int first_stack_local_index() const { return first_stack_local_index_; } |
@@ -105,12 +105,38 @@ |
}; |
+// The class TokenStreamIterator encapsulates iteration over the TokenStream |
+// object. The parser uses this to iterate over tokens while parsing a script |
+// or a function. |
+class TokenStreamIterator : ValueObject { |
+ public: |
+ TokenStreamIterator(const TokenStream& tokens, intptr_t token_pos) |
+ : tokens_(tokens), token_position_(token_pos) { } |
+ |
+ intptr_t NumberOfTokens() const { return tokens_.Length(); } |
+ bool IsValid() const; |
+ |
+ inline Token::Kind CurrentTokenKind() const; |
+ Token::Kind LookaheadTokenKind(intptr_t num_tokens) const; |
+ |
+ intptr_t CurrentPosition() const { return token_position_; } |
+ void SetCurrentPosition(intptr_t value) { token_position_ = value; } |
+ |
+ void Advance() { token_position_ += 1; } |
+ |
+ RawObject* CurrentToken() const; |
+ RawString* CurrentLiteral() const; |
+ |
+ private: |
+ const TokenStream& tokens_; |
+ intptr_t token_position_; |
+}; |
+ |
+ |
class Parser : ValueObject { |
public: |
Parser(const Script& script, const Library& library); |
- Parser(const Script& script, |
- const Function& function, |
- intptr_t token_index); |
+ Parser(const Script& script, const Function& function, intptr_t token_pos); |
// Parse the top level of a whole script file and register declared classes |
// and interfaces in the given library. |
@@ -120,9 +146,9 @@ |
static void ParseFunction(ParsedFunction* parsed_function); |
// Build an error object containing a formatted error or warning message. |
- // A null script means no source and a negative token_index means no position. |
+ // A null script means no source and a negative token_pos means no position. |
static RawError* FormatError(const Script& script, |
- intptr_t token_index, |
+ intptr_t token_pos, |
const char* message_header, |
const char* format, |
va_list args); |
@@ -130,7 +156,7 @@ |
// Same as FormatError, but appends the new error to the 'prev_error'. |
static RawError* FormatErrorWithAppend(const Error& prev_error, |
const Script& script, |
- intptr_t token_index, |
+ intptr_t token_pos, |
const char* message_header, |
const char* format, |
va_list args); |
@@ -170,6 +196,7 @@ |
(script_.kind() == RawScript::kLibrary); |
} |
+ intptr_t TokenPos() const { return tokens_iterator_.CurrentPosition(); } |
inline Token::Kind CurrentToken(); |
Token::Kind LookaheadToken(int num_tokens); |
String* CurrentLiteral() const; |
@@ -182,7 +209,7 @@ |
void ConsumeToken() { |
// Reset cache and advance the token. |
token_kind_ = Token::kILLEGAL; |
- token_index_++; |
+ tokens_iterator_.Advance(); |
CompilerStats::num_tokens_consumed++; |
} |
void ConsumeRightAngleBracket(); |
@@ -221,9 +248,9 @@ |
const AbstractTypeArguments& type_arguments); |
// Format an error or warning message into the message_buffer. |
- // A null script means no source and a negative token_index means no position. |
+ // A null script means no source and a negative token_pos means no position. |
static void FormatMessage(const Script& script, |
- intptr_t token_index, |
+ intptr_t token_pos, |
const char* message_header, |
char* message_buffer, |
intptr_t message_buffer_size, |
@@ -236,15 +263,15 @@ |
void Unimplemented(const char* msg); |
// Reports error message at given location. |
- void ErrorMsg(intptr_t token_index, const char* msg, ...); |
- void Warning(intptr_t token_index, const char* msg, ...); |
+ void ErrorMsg(intptr_t token_pos, const char* msg, ...); |
+ void Warning(intptr_t token_pos, const char* msg, ...); |
// Reports an already formatted error message. |
void ErrorMsg(const Error& error); |
// Concatenates two error messages, the previous and the current one. |
void AppendErrorMsg( |
- const Error& prev_error, intptr_t token_index, const char* format, ...); |
+ const Error& prev_error, intptr_t token_pos, const char* format, ...); |
const Instance& EvaluateConstExpr(AstNode* expr); |
AstNode* RunStaticFieldInitializer(const Field& field); |
@@ -345,12 +372,10 @@ |
LocalVariable* LookupPhaseParameter(); |
LocalVariable* LookupReceiver(LocalScope* from_scope, bool test_only); |
void CaptureReceiver(); |
- AstNode* LoadReceiver(intptr_t token_index); |
+ AstNode* LoadReceiver(intptr_t token_pos); |
AstNode* LoadFieldIfUnresolved(AstNode* node); |
AstNode* LoadClosure(PrimaryNode* primary); |
- AstNode* CallGetter(intptr_t token_index, |
- AstNode* object, |
- const String& name); |
+ AstNode* CallGetter(intptr_t token_pos, AstNode* object, const String& name); |
AstNode* ParseAssertStatement(); |
AstNode* ParseJump(String* label_name); |
@@ -465,7 +490,7 @@ |
AstNode* lhs, |
AstNode* rhs); |
AstNode* PrepareCompoundAssignmentNodes(AstNode** expr); |
- LocalVariable* CreateTempConstVariable(intptr_t token_index, |
+ LocalVariable* CreateTempConstVariable(intptr_t token_pos, |
intptr_t token_id, |
const char* s); |
@@ -486,7 +511,7 @@ |
AstNode* MakeAssertCall(intptr_t begin, intptr_t end); |
AstNode* ThrowTypeError(intptr_t type_pos, const AbstractType& type); |
- void CheckFunctionIsCallable(intptr_t token_index, const Function& function); |
+ void CheckFunctionIsCallable(intptr_t token_pos, const Function& function); |
void CheckOperatorArity(const MemberDesc& member, Token::Kind operator_token); |
const LocalVariable& GetIncrementTempLocal(); |
@@ -495,16 +520,15 @@ |
AstNode* InsertClosureCallNodes(AstNode* condition); |
ConstructorCallNode* CreateConstructorCallNode( |
- intptr_t token_index, |
+ intptr_t token_pos, |
const AbstractTypeArguments& type_arguments, |
const Function& constructor, |
ArgumentListNode* arguments); |
const Script& script_; |
- const TokenStream& tokens_; |
- intptr_t token_index_; |
- Token::Kind token_kind_; // Cached token kind for the token_index_. |
+ TokenStreamIterator tokens_iterator_; |
+ Token::Kind token_kind_; // Cached token kind for current token. |
Block* current_block_; |
// is_top_level_ is true if parsing the "top level" of a compilation unit, |