blob: f0f11e0257c186ad1f8984959deb96908a0a6f5d [file] [log] [blame]
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of scanner;
/**
* Scanner that reads from a String and creates tokens that points to
* substrings.
*/
class StringScanner extends ArrayBasedScanner {
/** The file content. */
String string;
/** The current offset in [string]. */
int scanOffset = -1;
StringScanner(SourceFile file, {bool includeComments: false})
: string = file.slowText(),
super(file, includeComments) {
ensureZeroTermination();
}
StringScanner.fromString(this.string, {bool includeComments: false})
: super(null, includeComments) {
ensureZeroTermination();
}
void ensureZeroTermination() {
if (string.isEmpty || string.codeUnitAt(string.length - 1) != 0) {
// TODO(lry): abort instead of copying the array, or warn?
string = string + '\x00';
}
}
int advance() => string.codeUnitAt(++scanOffset);
int peek() => string.codeUnitAt(scanOffset + 1);
int get stringOffset => scanOffset;
int currentAsUnicode(int next) => next;
void handleUnicode(int startScanOffset) { }
Token firstToken() => tokens.next;
Token previousToken() => tail;
void appendSubstringToken(PrecedenceInfo info, int start,
bool asciiOnly, [int extraOffset = 0]) {
tail.next = new StringToken.fromSubstring(info, string, start,
scanOffset + extraOffset, tokenStart, canonicalize: true);
tail = tail.next;
}
}