77f7b64611
includeComments option argument added to the ByteArrayScanner. default is false. Test of charOffset, charLength invariants on scanner output added. Calls to beginToken() moved to fix invalid Token.charOffset values for string interpolations. BUG= TEST= Review URL: https://chromiumcodereview.appspot.com//10539021 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@9059 260f80e4-7a28-3924-810f-c04153c831b5
76 lines
2.2 KiB
Dart
76 lines
2.2 KiB
Dart
// 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.
|
|
|
|
/**
|
|
* Scanner that reads from a String and creates tokens that points to
|
|
* substrings.
|
|
*/
|
|
class StringScanner extends ArrayBasedScanner<SourceString> {
|
|
final String string;
|
|
|
|
StringScanner(String this.string, [bool includeComments = false])
|
|
: super(includeComments);
|
|
|
|
int nextByte() => charAt(++byteOffset);
|
|
|
|
int peek() => charAt(byteOffset + 1);
|
|
|
|
int charAt(index)
|
|
=> (string.length > index) ? string.charCodeAt(index) : $EOF;
|
|
|
|
SourceString asciiString(int start, int offset) {
|
|
return new SubstringWrapper(string, start, byteOffset + offset);
|
|
}
|
|
|
|
SourceString utf8String(int start, int offset) {
|
|
return new SubstringWrapper(string, start, byteOffset + offset + 1);
|
|
}
|
|
|
|
void appendByteStringToken(PrecedenceInfo info, SourceString value) {
|
|
// assert(kind != $a || keywords.get(value) == null);
|
|
tail.next = new StringToken.fromSource(info, value, tokenStart);
|
|
tail = tail.next;
|
|
}
|
|
}
|
|
|
|
class SubstringWrapper implements SourceString {
|
|
final String internalString;
|
|
final int begin;
|
|
final int end;
|
|
|
|
const SubstringWrapper(String this.internalString,
|
|
int this.begin, int this.end);
|
|
|
|
int hashCode() => slowToString().hashCode();
|
|
|
|
bool operator ==(other) {
|
|
return other is SourceString && slowToString() == other.slowToString();
|
|
}
|
|
|
|
void printOn(StringBuffer sb) {
|
|
sb.add(internalString.substring(begin, end));
|
|
}
|
|
|
|
String slowToString() => internalString.substring(begin, end);
|
|
|
|
String toString() => "SubstringWrapper(${slowToString()})";
|
|
|
|
String get stringValue() => null;
|
|
|
|
Iterator<int> iterator() =>
|
|
new StringCodeIterator.substring(internalString, begin, end);
|
|
|
|
SourceString copyWithoutQuotes(int initial, int terminal) {
|
|
assert(0 <= initial);
|
|
assert(0 <= terminal);
|
|
assert(initial + terminal <= internalString.length);
|
|
return new SubstringWrapper(internalString,
|
|
begin + initial, end - terminal);
|
|
}
|
|
|
|
bool isEmpty() => begin == end;
|
|
|
|
bool isPrivate() => !isEmpty() && internalString.charCodeAt(begin) === $_;
|
|
}
|