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

Side by Side Diff: dart/frog/leg/scanner/parser.dart

Issue 9112008: Improve error recovery in parser. (Closed) Base URL: ssh://aaricia.aar/home/ahe/Dart/all/dart.googlecode.com.git@master
Patch Set: Update language-leg.status Created 8 years, 11 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
« no previous file with comments | « dart/frog/leg/scanner/listener.dart ('k') | dart/frog/leg/tools/find_file_to_parse.sh » ('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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 /** 5 /**
6 * An event generating parser of Dart programs. This parser expects 6 * An event generating parser of Dart programs. This parser expects
7 * all tokens in a linked list. 7 * all tokens in a linked list.
8 */ 8 */
9 class Parser { 9 class Parser {
10 final Listener listener; 10 final Listener listener;
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 token = parseType(token.next); 270 token = parseType(token.next);
271 } else { 271 } else {
272 listener.handleNoType(token); 272 listener.handleNoType(token);
273 } 273 }
274 listener.endTypeVariable(token); 274 listener.endTypeVariable(token);
275 return token; 275 return token;
276 } 276 }
277 277
278 bool optional(String value, Token token) => value === token.stringValue; 278 bool optional(String value, Token token) => value === token.stringValue;
279 279
280 bool notEofOrValue(String value, Token token) {
281 return token.kind !== EOF_TOKEN && value !== token.stringValue;
282 }
283
280 Token parseType(Token token) { 284 Token parseType(Token token) {
281 // TODO(ahe): Rename this method to parseTypeOrVar? 285 // TODO(ahe): Rename this method to parseTypeOrVar?
282 Token begin = token; 286 Token begin = token;
283 int identifierCount = 1; 287 int identifierCount = 1;
284 if (isIdentifier(token)) { 288 if (isIdentifier(token)) {
285 token = parseIdentifier(token); 289 token = parseIdentifier(token);
286 while (optional('.', token)) { 290 while (optional('.', token)) {
287 // TODO(ahe): Validate that there are at most two identifiers. 291 // TODO(ahe): Validate that there are at most two identifiers.
288 token = parseIdentifier(token.next); 292 token = parseIdentifier(token.next);
289 ++identifierCount; 293 ++identifierCount;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 // error handling. 359 // error handling.
356 final String value = token.stringValue; 360 final String value = token.stringValue;
357 if (value === '(') { 361 if (value === '(') {
358 isField = false; 362 isField = false;
359 break; 363 break;
360 } else if ((value === '=') || (value === ';') || (value === ',')) { 364 } else if ((value === '=') || (value === ';') || (value === ',')) {
361 isField = true; 365 isField = true;
362 break; 366 break;
363 } else { 367 } else {
364 token = listener.unexpected(token); 368 token = listener.unexpected(token);
369 if (token.kind === EOF_TOKEN) {
370 // TODO(ahe): This is a hack. It would be better to tell the
371 // listener more explicitly that it must pop an identifier.
372 listener.endTopLevelFields(0, start, token);
373 return token;
374 }
365 } 375 }
366 } 376 }
367 if (isField) { 377 if (isField) {
368 int fieldCount = 1; 378 int fieldCount = 1;
369 token = parseVariableInitializerOpt(token); 379 token = parseVariableInitializerOpt(token);
370 while (optional(',', token)) { 380 while (optional(',', token)) {
371 token = parseIdentifier(token.next); 381 token = parseIdentifier(token.next);
372 token = parseVariableInitializerOpt(token); 382 token = parseVariableInitializerOpt(token);
373 ++fieldCount; 383 ++fieldCount;
374 } 384 }
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 } 504 }
495 505
496 Token parseClassBody(Token token) { 506 Token parseClassBody(Token token) {
497 Token begin = token; 507 Token begin = token;
498 listener.beginClassBody(token); 508 listener.beginClassBody(token);
499 if (!optional('{', token)) { 509 if (!optional('{', token)) {
500 return listener.expectedBlock(token); 510 return listener.expectedBlock(token);
501 } 511 }
502 token = token.next; 512 token = token.next;
503 int count = 0; 513 int count = 0;
504 while (!optional('}', token)) { 514 while (notEofOrValue('}', token)) {
505 token = parseMember(token); 515 token = parseMember(token);
506 ++count; 516 ++count;
507 } 517 }
508 listener.endClassBody(count, begin, token); 518 listener.endClassBody(count, begin, token);
509 return token; 519 return token;
510 } 520 }
511 521
512 Token parseMember(Token token) { 522 Token parseMember(Token token) {
513 if (optional('factory', token)) { 523 if (optional('factory', token)) {
514 return parseFactoryMethod(token); 524 return parseFactoryMethod(token);
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 listener.endReturnStatement(true, begin, token); 687 listener.endReturnStatement(true, begin, token);
678 } else { 688 } else {
679 listener.endReturnStatement(true, begin, null); 689 listener.endReturnStatement(true, begin, null);
680 } 690 }
681 return token; 691 return token;
682 } 692 }
683 Token begin = token; 693 Token begin = token;
684 int statementCount = 0; 694 int statementCount = 0;
685 listener.beginFunctionBody(begin); 695 listener.beginFunctionBody(begin);
686 token = expect('{', token); 696 token = expect('{', token);
687 while (!optional('}', token)) { 697 while (notEofOrValue('}', token)) {
688 token = parseStatement(token); 698 token = parseStatement(token);
689 ++statementCount; 699 ++statementCount;
690 } 700 }
691 listener.endFunctionBody(statementCount, begin, token); 701 listener.endFunctionBody(statementCount, begin, token);
692 expect('}', token); 702 expect('}', token);
693 return token; 703 return token;
694 } 704 }
695 705
696 Token parseStatement(Token token) { 706 Token parseStatement(Token token) {
697 final value = token.stringValue; 707 final value = token.stringValue;
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after
1351 token = parseParenthesizedExpression(token); 1361 token = parseParenthesizedExpression(token);
1352 listener.endDoWhileStatement(doToken, whileToken, token); 1362 listener.endDoWhileStatement(doToken, whileToken, token);
1353 return expectSemicolon(token); 1363 return expectSemicolon(token);
1354 } 1364 }
1355 1365
1356 Token parseBlock(Token token) { 1366 Token parseBlock(Token token) {
1357 Token begin = token; 1367 Token begin = token;
1358 listener.beginBlock(begin); 1368 listener.beginBlock(begin);
1359 int statementCount = 0; 1369 int statementCount = 0;
1360 token = expect('{', token); 1370 token = expect('{', token);
1361 while (!optional('}', token)) { 1371 while (notEofOrValue('}', token)) {
1362 token = parseStatement(token); 1372 token = parseStatement(token);
1363 ++statementCount; 1373 ++statementCount;
1364 } 1374 }
1365 listener.endBlock(statementCount, begin, token); 1375 listener.endBlock(statementCount, begin, token);
1366 return expect('}', token); 1376 return expect('}', token);
1367 } 1377 }
1368 1378
1369 Token parseThrowStatement(Token token) { 1379 Token parseThrowStatement(Token token) {
1370 Token throwToken = token; 1380 Token throwToken = token;
1371 listener.beginThrowStatement(throwToken); 1381 listener.beginThrowStatement(throwToken);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 } 1453 }
1444 listener.handleContinueStatement(hasTarget, continueKeyword, token); 1454 listener.handleContinueStatement(hasTarget, continueKeyword, token);
1445 return expectSemicolon(token); 1455 return expectSemicolon(token);
1446 } 1456 }
1447 1457
1448 Token parseEmptyStatement(Token token) { 1458 Token parseEmptyStatement(Token token) {
1449 listener.handleEmptyStatement(token); 1459 listener.handleEmptyStatement(token);
1450 return expectSemicolon(token); 1460 return expectSemicolon(token);
1451 } 1461 }
1452 } 1462 }
OLDNEW
« no previous file with comments | « dart/frog/leg/scanner/listener.dart ('k') | dart/frog/leg/tools/find_file_to_parse.sh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698