OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 part of scanner; | |
6 | |
7 /** | |
8 * Scanner that reads from a String and creates tokens that points to | |
9 * substrings. | |
10 */ | |
11 class StringScanner extends ArrayBasedScanner { | |
12 /** The file content. */ | |
13 String string; | |
14 | |
15 /** The current offset in [string]. */ | |
16 int scanOffset = -1; | |
17 | |
18 StringScanner(SourceFile file, {bool includeComments: false}) | |
19 : string = file.slowText(), | |
20 super(file, includeComments) { | |
21 ensureZeroTermination(); | |
22 } | |
23 | |
24 StringScanner.fromString(this.string, {bool includeComments: false}) | |
25 : super(null, includeComments) { | |
26 ensureZeroTermination(); | |
27 } | |
28 | |
29 void ensureZeroTermination() { | |
30 if (string.isEmpty || string.codeUnitAt(string.length - 1) != 0) { | |
31 // TODO(lry): abort instead of copying the array, or warn? | |
32 string = string + '\x00'; | |
33 } | |
34 } | |
35 | |
36 int advance() => string.codeUnitAt(++scanOffset); | |
37 int peek() => string.codeUnitAt(scanOffset + 1); | |
38 | |
39 int get stringOffset => scanOffset; | |
40 | |
41 int currentAsUnicode(int next) => next; | |
42 | |
43 void handleUnicode(int startScanOffset) { } | |
44 | |
45 Token firstToken() => tokens.next; | |
46 Token previousToken() => tail; | |
47 | |
48 void appendSubstringToken(PrecedenceInfo info, int start, | |
49 bool asciiOnly, [int extraOffset = 0]) { | |
50 tail.next = new StringToken.fromSubstring(info, string, start, | |
51 scanOffset + extraOffset, tokenStart, canonicalize: true); | |
52 tail = tail.next; | |
53 } | |
54 | |
55 bool atEndOfFile() => scanOffset >= string.length - 1; | |
56 } | |
OLD | NEW |