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

Side by Side Diff: vm/parser.h

Issue 10632009: Make the parser agnostic to the TokenStream implementation. This is the first step towards compacti… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « vm/opt_code_generator_ia32.cc ('k') | vm/parser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_PARSER_H_ 5 #ifndef VM_PARSER_H_
6 #define VM_PARSER_H_ 6 #define VM_PARSER_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 9
10 #include "vm/ast.h" 10 #include "vm/ast.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 ASSERT(has_expression_temp_var()); 72 ASSERT(has_expression_temp_var());
73 return expression_temp_var_; 73 return expression_temp_var_;
74 } 74 }
75 void set_expression_temp_var(LocalVariable* value) { 75 void set_expression_temp_var(LocalVariable* value) {
76 ASSERT(!has_expression_temp_var()); 76 ASSERT(!has_expression_temp_var());
77 expression_temp_var_ = value; 77 expression_temp_var_ = value;
78 } 78 }
79 bool has_expression_temp_var() const { 79 bool has_expression_temp_var() const {
80 return expression_temp_var_ != NULL; 80 return expression_temp_var_ != NULL;
81 } 81 }
82 static LocalVariable* CreateExpressionTempVar(intptr_t token_index); 82 static LocalVariable* CreateExpressionTempVar(intptr_t token_pos);
83 83
84 int first_parameter_index() const { return first_parameter_index_; } 84 int first_parameter_index() const { return first_parameter_index_; }
85 int first_stack_local_index() const { return first_stack_local_index_; } 85 int first_stack_local_index() const { return first_stack_local_index_; }
86 int copied_parameter_count() const { return copied_parameter_count_; } 86 int copied_parameter_count() const { return copied_parameter_count_; }
87 int stack_local_count() const { return stack_local_count_; } 87 int stack_local_count() const { return stack_local_count_; }
88 88
89 void AllocateVariables(); 89 void AllocateVariables();
90 90
91 private: 91 private:
92 const Function& function_; 92 const Function& function_;
93 SequenceNode* node_sequence_; 93 SequenceNode* node_sequence_;
94 AstNode* instantiator_; 94 AstNode* instantiator_;
95 Array& default_parameter_values_; 95 Array& default_parameter_values_;
96 LocalVariable* saved_context_var_; 96 LocalVariable* saved_context_var_;
97 LocalVariable* expression_temp_var_; 97 LocalVariable* expression_temp_var_;
98 98
99 int first_parameter_index_; 99 int first_parameter_index_;
100 int first_stack_local_index_; 100 int first_stack_local_index_;
101 int copied_parameter_count_; 101 int copied_parameter_count_;
102 int stack_local_count_; 102 int stack_local_count_;
103 103
104 DISALLOW_COPY_AND_ASSIGN(ParsedFunction); 104 DISALLOW_COPY_AND_ASSIGN(ParsedFunction);
105 }; 105 };
106 106
107 107
108 // The class TokenStreamIterator encapsulates iteration over the TokenStream
109 // object. The parser uses this to iterate over tokens while parsing a script
110 // or a function.
111 class TokenStreamIterator : ValueObject {
112 public:
113 TokenStreamIterator(const TokenStream& tokens, intptr_t token_pos)
114 : tokens_(tokens), token_position_(token_pos) { }
115
116 intptr_t NumberOfTokens() const { return tokens_.Length(); }
117 bool IsValid() const;
118
119 inline Token::Kind CurrentTokenKind() const;
120 Token::Kind LookaheadTokenKind(intptr_t num_tokens) const;
121
122 intptr_t CurrentPosition() const { return token_position_; }
123 void SetCurrentPosition(intptr_t value) { token_position_ = value; }
124
125 void Advance() { token_position_ += 1; }
126
127 RawObject* CurrentToken() const;
128 RawString* CurrentLiteral() const;
129
130 private:
131 const TokenStream& tokens_;
132 intptr_t token_position_;
133 };
134
135
108 class Parser : ValueObject { 136 class Parser : ValueObject {
109 public: 137 public:
110 Parser(const Script& script, const Library& library); 138 Parser(const Script& script, const Library& library);
111 Parser(const Script& script, 139 Parser(const Script& script, const Function& function, intptr_t token_pos);
112 const Function& function,
113 intptr_t token_index);
114 140
115 // Parse the top level of a whole script file and register declared classes 141 // Parse the top level of a whole script file and register declared classes
116 // and interfaces in the given library. 142 // and interfaces in the given library.
117 static void ParseCompilationUnit(const Library& library, 143 static void ParseCompilationUnit(const Library& library,
118 const Script& script); 144 const Script& script);
119 145
120 static void ParseFunction(ParsedFunction* parsed_function); 146 static void ParseFunction(ParsedFunction* parsed_function);
121 147
122 // Build an error object containing a formatted error or warning message. 148 // Build an error object containing a formatted error or warning message.
123 // A null script means no source and a negative token_index means no position. 149 // A null script means no source and a negative token_pos means no position.
124 static RawError* FormatError(const Script& script, 150 static RawError* FormatError(const Script& script,
125 intptr_t token_index, 151 intptr_t token_pos,
126 const char* message_header, 152 const char* message_header,
127 const char* format, 153 const char* format,
128 va_list args); 154 va_list args);
129 155
130 // Same as FormatError, but appends the new error to the 'prev_error'. 156 // Same as FormatError, but appends the new error to the 'prev_error'.
131 static RawError* FormatErrorWithAppend(const Error& prev_error, 157 static RawError* FormatErrorWithAppend(const Error& prev_error,
132 const Script& script, 158 const Script& script,
133 intptr_t token_index, 159 intptr_t token_pos,
134 const char* message_header, 160 const char* message_header,
135 const char* format, 161 const char* format,
136 va_list args); 162 va_list args);
137 163
138 private: 164 private:
139 struct Block; 165 struct Block;
140 class TryBlocks; 166 class TryBlocks;
141 167
142 // The function being parsed. 168 // The function being parsed.
143 const Function& current_function() const; 169 const Function& current_function() const;
(...skipping 19 matching lines...) Expand all
163 // The class or interface being parsed. 189 // The class or interface being parsed.
164 const Class& current_class() const; 190 const Class& current_class() const;
165 void set_current_class(const Class& value); 191 void set_current_class(const Class& value);
166 192
167 // Parsing a library or a regular source script. 193 // Parsing a library or a regular source script.
168 bool is_library_source() const { 194 bool is_library_source() const {
169 return (script_.kind() == RawScript::kScript) || 195 return (script_.kind() == RawScript::kScript) ||
170 (script_.kind() == RawScript::kLibrary); 196 (script_.kind() == RawScript::kLibrary);
171 } 197 }
172 198
199 intptr_t TokenPos() const { return tokens_iterator_.CurrentPosition(); }
173 inline Token::Kind CurrentToken(); 200 inline Token::Kind CurrentToken();
174 Token::Kind LookaheadToken(int num_tokens); 201 Token::Kind LookaheadToken(int num_tokens);
175 String* CurrentLiteral() const; 202 String* CurrentLiteral() const;
176 RawDouble* CurrentDoubleLiteral() const; 203 RawDouble* CurrentDoubleLiteral() const;
177 RawInteger* CurrentIntegerLiteral() const; 204 RawInteger* CurrentIntegerLiteral() const;
178 205
179 // Sets parser to given token position in the stream. 206 // Sets parser to given token position in the stream.
180 void SetPosition(intptr_t position); 207 void SetPosition(intptr_t position);
181 208
182 void ConsumeToken() { 209 void ConsumeToken() {
183 // Reset cache and advance the token. 210 // Reset cache and advance the token.
184 token_kind_ = Token::kILLEGAL; 211 token_kind_ = Token::kILLEGAL;
185 token_index_++; 212 tokens_iterator_.Advance();
186 CompilerStats::num_tokens_consumed++; 213 CompilerStats::num_tokens_consumed++;
187 } 214 }
188 void ConsumeRightAngleBracket(); 215 void ConsumeRightAngleBracket();
189 void ExpectToken(Token::Kind token_expected); 216 void ExpectToken(Token::Kind token_expected);
190 void ExpectSemicolon(); 217 void ExpectSemicolon();
191 void UnexpectedToken(); 218 void UnexpectedToken();
192 String* ExpectTypeIdentifier(const char* msg); 219 String* ExpectTypeIdentifier(const char* msg);
193 String* ExpectIdentifier(const char* msg); 220 String* ExpectIdentifier(const char* msg);
194 bool IsLiteral(const char* literal); 221 bool IsLiteral(const char* literal);
195 222
(...skipping 18 matching lines...) Expand all
214 void SkipFunctionLiteral(); 241 void SkipFunctionLiteral();
215 void SkipStringLiteral(); 242 void SkipStringLiteral();
216 void SkipQualIdent(); 243 void SkipQualIdent();
217 244
218 void CheckConstructorCallTypeArguments( 245 void CheckConstructorCallTypeArguments(
219 intptr_t pos, 246 intptr_t pos,
220 Function& constructor, 247 Function& constructor,
221 const AbstractTypeArguments& type_arguments); 248 const AbstractTypeArguments& type_arguments);
222 249
223 // Format an error or warning message into the message_buffer. 250 // Format an error or warning message into the message_buffer.
224 // A null script means no source and a negative token_index means no position. 251 // A null script means no source and a negative token_pos means no position.
225 static void FormatMessage(const Script& script, 252 static void FormatMessage(const Script& script,
226 intptr_t token_index, 253 intptr_t token_pos,
227 const char* message_header, 254 const char* message_header,
228 char* message_buffer, 255 char* message_buffer,
229 intptr_t message_buffer_size, 256 intptr_t message_buffer_size,
230 const char* format, 257 const char* format,
231 va_list args); 258 va_list args);
232 259
233 // Reports error/warning message at location of current token. 260 // Reports error/warning message at location of current token.
234 void ErrorMsg(const char* msg, ...); 261 void ErrorMsg(const char* msg, ...);
235 void Warning(const char* msg, ...); 262 void Warning(const char* msg, ...);
236 void Unimplemented(const char* msg); 263 void Unimplemented(const char* msg);
237 264
238 // Reports error message at given location. 265 // Reports error message at given location.
239 void ErrorMsg(intptr_t token_index, const char* msg, ...); 266 void ErrorMsg(intptr_t token_pos, const char* msg, ...);
240 void Warning(intptr_t token_index, const char* msg, ...); 267 void Warning(intptr_t token_pos, const char* msg, ...);
241 268
242 // Reports an already formatted error message. 269 // Reports an already formatted error message.
243 void ErrorMsg(const Error& error); 270 void ErrorMsg(const Error& error);
244 271
245 // Concatenates two error messages, the previous and the current one. 272 // Concatenates two error messages, the previous and the current one.
246 void AppendErrorMsg( 273 void AppendErrorMsg(
247 const Error& prev_error, intptr_t token_index, const char* format, ...); 274 const Error& prev_error, intptr_t token_pos, const char* format, ...);
248 275
249 const Instance& EvaluateConstExpr(AstNode* expr); 276 const Instance& EvaluateConstExpr(AstNode* expr);
250 AstNode* RunStaticFieldInitializer(const Field& field); 277 AstNode* RunStaticFieldInitializer(const Field& field);
251 RawObject* EvaluateConstConstructorCall( 278 RawObject* EvaluateConstConstructorCall(
252 const Class& type_class, 279 const Class& type_class,
253 const AbstractTypeArguments& type_arguments, 280 const AbstractTypeArguments& type_arguments,
254 const Function& constructor, 281 const Function& constructor,
255 ArgumentListNode* arguments); 282 ArgumentListNode* arguments);
256 AstNode* FoldConstExpr(intptr_t expr_pos, AstNode* expr); 283 AstNode* FoldConstExpr(intptr_t expr_pos, AstNode* expr);
257 284
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 365
339 void ChainNewBlock(LocalScope* outer_scope); 366 void ChainNewBlock(LocalScope* outer_scope);
340 void OpenBlock(); 367 void OpenBlock();
341 void OpenLoopBlock(); 368 void OpenLoopBlock();
342 void OpenFunctionBlock(const Function& func); 369 void OpenFunctionBlock(const Function& func);
343 SequenceNode* CloseBlock(); 370 SequenceNode* CloseBlock();
344 371
345 LocalVariable* LookupPhaseParameter(); 372 LocalVariable* LookupPhaseParameter();
346 LocalVariable* LookupReceiver(LocalScope* from_scope, bool test_only); 373 LocalVariable* LookupReceiver(LocalScope* from_scope, bool test_only);
347 void CaptureReceiver(); 374 void CaptureReceiver();
348 AstNode* LoadReceiver(intptr_t token_index); 375 AstNode* LoadReceiver(intptr_t token_pos);
349 AstNode* LoadFieldIfUnresolved(AstNode* node); 376 AstNode* LoadFieldIfUnresolved(AstNode* node);
350 AstNode* LoadClosure(PrimaryNode* primary); 377 AstNode* LoadClosure(PrimaryNode* primary);
351 AstNode* CallGetter(intptr_t token_index, 378 AstNode* CallGetter(intptr_t token_pos, AstNode* object, const String& name);
352 AstNode* object,
353 const String& name);
354 379
355 AstNode* ParseAssertStatement(); 380 AstNode* ParseAssertStatement();
356 AstNode* ParseJump(String* label_name); 381 AstNode* ParseJump(String* label_name);
357 AstNode* ParseIfStatement(String* label_name); 382 AstNode* ParseIfStatement(String* label_name);
358 AstNode* ParseWhileStatement(String* label_name); 383 AstNode* ParseWhileStatement(String* label_name);
359 AstNode* ParseDoWhileStatement(String* label_name); 384 AstNode* ParseDoWhileStatement(String* label_name);
360 AstNode* ParseForStatement(String* label_name); 385 AstNode* ParseForStatement(String* label_name);
361 AstNode* ParseForInStatement(intptr_t forin_pos, SourceLabel* label); 386 AstNode* ParseForInStatement(intptr_t forin_pos, SourceLabel* label);
362 CaseNode* ParseCaseClause(LocalVariable* switch_expr_value, 387 CaseNode* ParseCaseClause(LocalVariable* switch_expr_value,
363 SourceLabel* case_label); 388 SourceLabel* case_label);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 RawString* ResolveImportVar(intptr_t ident_pos, const String& ident); 483 RawString* ResolveImportVar(intptr_t ident_pos, const String& ident);
459 AstNode* OptimizeBinaryOpNode(intptr_t op_pos, 484 AstNode* OptimizeBinaryOpNode(intptr_t op_pos,
460 Token::Kind binary_op, 485 Token::Kind binary_op,
461 AstNode* lhs, 486 AstNode* lhs,
462 AstNode* rhs); 487 AstNode* rhs);
463 AstNode* ExpandAssignableOp(intptr_t op_pos, 488 AstNode* ExpandAssignableOp(intptr_t op_pos,
464 Token::Kind assignment_op, 489 Token::Kind assignment_op,
465 AstNode* lhs, 490 AstNode* lhs,
466 AstNode* rhs); 491 AstNode* rhs);
467 AstNode* PrepareCompoundAssignmentNodes(AstNode** expr); 492 AstNode* PrepareCompoundAssignmentNodes(AstNode** expr);
468 LocalVariable* CreateTempConstVariable(intptr_t token_index, 493 LocalVariable* CreateTempConstVariable(intptr_t token_pos,
469 intptr_t token_id, 494 intptr_t token_id,
470 const char* s); 495 const char* s);
471 496
472 static bool IsAssignableExpr(AstNode* expr); 497 static bool IsAssignableExpr(AstNode* expr);
473 498
474 static bool IsPrefixOperator(Token::Kind token); 499 static bool IsPrefixOperator(Token::Kind token);
475 static bool IsIncrementOperator(Token::Kind token); 500 static bool IsIncrementOperator(Token::Kind token);
476 501
477 static SequenceNode* NodeAsSequenceNode(intptr_t sequence_pos, 502 static SequenceNode* NodeAsSequenceNode(intptr_t sequence_pos,
478 AstNode* node, 503 AstNode* node,
479 LocalScope* scope); 504 LocalScope* scope);
480 505
481 SequenceNode* MakeImplicitConstructor(const Function& func); 506 SequenceNode* MakeImplicitConstructor(const Function& func);
482 AstNode* MakeStaticCall(const char* class_name, 507 AstNode* MakeStaticCall(const char* class_name,
483 const char* function_name, 508 const char* function_name,
484 ArgumentListNode* arguments); 509 ArgumentListNode* arguments);
485 String& Interpolate(ArrayNode* values); 510 String& Interpolate(ArrayNode* values);
486 AstNode* MakeAssertCall(intptr_t begin, intptr_t end); 511 AstNode* MakeAssertCall(intptr_t begin, intptr_t end);
487 AstNode* ThrowTypeError(intptr_t type_pos, const AbstractType& type); 512 AstNode* ThrowTypeError(intptr_t type_pos, const AbstractType& type);
488 513
489 void CheckFunctionIsCallable(intptr_t token_index, const Function& function); 514 void CheckFunctionIsCallable(intptr_t token_pos, const Function& function);
490 void CheckOperatorArity(const MemberDesc& member, Token::Kind operator_token); 515 void CheckOperatorArity(const MemberDesc& member, Token::Kind operator_token);
491 516
492 const LocalVariable& GetIncrementTempLocal(); 517 const LocalVariable& GetIncrementTempLocal();
493 void EnsureExpressionTemp(); 518 void EnsureExpressionTemp();
494 AstNode* CreateAssignmentNode(AstNode* original, AstNode* rhs); 519 AstNode* CreateAssignmentNode(AstNode* original, AstNode* rhs);
495 AstNode* InsertClosureCallNodes(AstNode* condition); 520 AstNode* InsertClosureCallNodes(AstNode* condition);
496 521
497 ConstructorCallNode* CreateConstructorCallNode( 522 ConstructorCallNode* CreateConstructorCallNode(
498 intptr_t token_index, 523 intptr_t token_pos,
499 const AbstractTypeArguments& type_arguments, 524 const AbstractTypeArguments& type_arguments,
500 const Function& constructor, 525 const Function& constructor,
501 ArgumentListNode* arguments); 526 ArgumentListNode* arguments);
502 527
503 528
504 const Script& script_; 529 const Script& script_;
505 const TokenStream& tokens_; 530 TokenStreamIterator tokens_iterator_;
506 intptr_t token_index_; 531 Token::Kind token_kind_; // Cached token kind for current token.
507 Token::Kind token_kind_; // Cached token kind for the token_index_.
508 Block* current_block_; 532 Block* current_block_;
509 533
510 // is_top_level_ is true if parsing the "top level" of a compilation unit, 534 // is_top_level_ is true if parsing the "top level" of a compilation unit,
511 // that is interface and class definitions. 535 // that is interface and class definitions.
512 bool is_top_level_; 536 bool is_top_level_;
513 537
514 // The member currently being parsed during "top level" parsing. 538 // The member currently being parsed during "top level" parsing.
515 MemberDesc* current_member_; 539 MemberDesc* current_member_;
516 540
517 // Parser mode to allow/disallow function literals. This is used in 541 // Parser mode to allow/disallow function literals. This is used in
(...skipping 18 matching lines...) Expand all
536 560
537 // Allocate temporary only once per function. 561 // Allocate temporary only once per function.
538 LocalVariable* expression_temp_; 562 LocalVariable* expression_temp_;
539 563
540 DISALLOW_COPY_AND_ASSIGN(Parser); 564 DISALLOW_COPY_AND_ASSIGN(Parser);
541 }; 565 };
542 566
543 } // namespace dart 567 } // namespace dart
544 568
545 #endif // VM_PARSER_H_ 569 #endif // VM_PARSER_H_
OLDNEW
« no previous file with comments | « vm/opt_code_generator_ia32.cc ('k') | vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698