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

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

Issue 9271037: Inserted string validation as separate task in compiler. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments. 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 | Annotate | Revision Log
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;
11 bool mayParseFunctionExpressions = true; 11 bool mayParseFunctionExpressions = true;
12 12
13 Parser(Listener this.listener); 13 Parser(Listener this.listener);
14 14
15 void parseUnit(Token token) { 15 void parseUnit(Token token) {
16 while (token.kind !== EOF_TOKEN) { 16 while (token.kind !== EOF_TOKEN) {
17 final String value = token.stringValue; 17 final String value = token.stringValue;
18 if (value === 'interface') { 18 if (value === 'interface') {
19 token = parseInterface(token); 19 token = parseInterface(token);
20 } else if ((value === 'abstract') || (value === 'class')) { 20 } else if ((value === 'abstract') || (value === 'class')) {
21 token = parseClass(token); 21 token = parseClass(token);
22 } else if (value === 'typedef') { 22 } else if (value === 'typedef') {
23 token = parseNamedFunctionAlias(token); 23 token = parseNamedFunctionAlias(token);
24 } else if (value === '#') { 24 } else if (value === '#') {
25 token = parseLibraryTags(token); 25 token = parseLibraryTags(token);
Lasse Reichstein Nielsen 2012/01/26 12:06:31 changed LibraryTags to ScriptTags here and in list
26 } else { 26 } else {
27 token = parseTopLevelMember(token); 27 token = parseTopLevelMember(token);
28 } 28 }
29 } 29 }
30 } 30 }
31 31
32 Token parseInterface(Token token) { 32 Token parseInterface(Token token) {
33 Token interfaceKeyword = token; 33 Token interfaceKeyword = token;
34 listener.beginInterface(token); 34 listener.beginInterface(token);
35 token = parseIdentifier(token.next); 35 token = parseIdentifier(token.next);
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 ++interfacesCount; 226 ++interfacesCount;
227 } while (optional(',', token)); 227 } while (optional(',', token));
228 } 228 }
229 token = parseClassBody(token); 229 token = parseClassBody(token);
230 listener.endClassDeclaration(interfacesCount, begin, extendsKeyword, 230 listener.endClassDeclaration(interfacesCount, begin, extendsKeyword,
231 implementsKeyword, token); 231 implementsKeyword, token);
232 return token.next; 232 return token.next;
233 } 233 }
234 234
235 235
236 Token parseString(Token token) { 236 Token parseStringPart(Token token) {
237 if (token.kind === STRING_TOKEN) { 237 if (token.kind === STRING_TOKEN) {
238 listener.handleLiteralString(token); 238 listener.handleStringPart(token);
239 return token.next; 239 return token.next;
240 } else { 240 } else {
241 return listener.expected('string', token); 241 return listener.expected('string', token);
242 } 242 }
243 } 243 }
244 244
245 Token parseIdentifier(Token token) { 245 Token parseIdentifier(Token token) {
246 if (isIdentifier(token)) { 246 if (isIdentifier(token)) {
247 listener.handleIdentifier(token); 247 listener.handleIdentifier(token);
248 } else { 248 } else {
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 mayParseFunctionExpressions = old; 431 mayParseFunctionExpressions = old;
432 listener.endInitializers(count, begin, token); 432 listener.endInitializers(count, begin, token);
433 return token; 433 return token;
434 } 434 }
435 435
436 Token parseLibraryTags(Token token) { 436 Token parseLibraryTags(Token token) {
437 Token begin = token; 437 Token begin = token;
438 listener.beginLibraryTag(token); 438 listener.beginLibraryTag(token);
439 token = parseIdentifier(token.next); 439 token = parseIdentifier(token.next);
440 token = expect('(', token); 440 token = expect('(', token);
441 token = parseString(token); 441 token = parseLiteralString(token);
442 bool hasPrefix = false; 442 bool hasPrefix = false;
443 if (optional(',', token)) { 443 if (optional(',', token)) {
444 hasPrefix = true; 444 hasPrefix = true;
445 token = parseIdentifier(token.next); 445 token = parseIdentifier(token.next);
446 token = expect(':', token); 446 token = expect(':', token);
447 token = parseString(token); 447 token = parseLiteralString(token);
448 } 448 }
449 token = expect(')', token); 449 token = expect(')', token);
450 listener.endLibraryTag(hasPrefix, begin, token); 450 listener.endLibraryTag(hasPrefix, begin, token);
451 return expectSemicolon(token); 451 return expectSemicolon(token);
452 } 452 }
453 453
454 Token expectSemicolon(Token token) { 454 Token expectSemicolon(Token token) {
455 return expect(';', token); 455 return expect(';', token);
456 } 456 }
457 457
(...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 listener.handleLiteralInt(token); 1188 listener.handleLiteralInt(token);
1189 return token.next; 1189 return token.next;
1190 } 1190 }
1191 1191
1192 Token parseLiteralDouble(Token token) { 1192 Token parseLiteralDouble(Token token) {
1193 listener.handleLiteralDouble(token); 1193 listener.handleLiteralDouble(token);
1194 return token.next; 1194 return token.next;
1195 } 1195 }
1196 1196
1197 Token parseLiteralString(Token token) { 1197 Token parseLiteralString(Token token) {
1198 listener.handleLiteralString(token); 1198 listener.beginLiteralString(token);
1199 token = token.next; 1199 token = token.next;
1200 int interpolationCount = 0; 1200 int interpolationCount = 0;
1201 while (optional('\${', token)) { 1201 while (optional('\${', token)) {
1202 token = parseExpression(token.next); 1202 token = token.next;
1203 token = parseExpression(token);
1203 token = expect('}', token); 1204 token = expect('}', token);
1204 token = parseString(token); 1205 token = parseStringPart(token);
1205 ++interpolationCount; 1206 ++interpolationCount;
1206 } 1207 }
1207 listener.handleStringInterpolationParts(interpolationCount); 1208 listener.endLiteralString(interpolationCount);
1208 return token; 1209 return token;
1209 } 1210 }
1210 1211
1211 Token parseLiteralBool(Token token) { 1212 Token parseLiteralBool(Token token) {
1212 listener.handleLiteralBool(token); 1213 listener.handleLiteralBool(token);
1213 return token.next; 1214 return token.next;
1214 } 1215 }
1215 1216
1216 Token parseLiteralNull(Token token) { 1217 Token parseLiteralNull(Token token) {
1217 listener.handleLiteralNull(token); 1218 listener.handleLiteralNull(token);
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 } 1592 }
1592 listener.handleContinueStatement(hasTarget, continueKeyword, token); 1593 listener.handleContinueStatement(hasTarget, continueKeyword, token);
1593 return expectSemicolon(token); 1594 return expectSemicolon(token);
1594 } 1595 }
1595 1596
1596 Token parseEmptyStatement(Token token) { 1597 Token parseEmptyStatement(Token token) {
1597 listener.handleEmptyStatement(token); 1598 listener.handleEmptyStatement(token);
1598 return expectSemicolon(token); 1599 return expectSemicolon(token);
1599 } 1600 }
1600 } 1601 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698