| Index: frog/leg/scanner/array_based_scanner.dart
|
| ===================================================================
|
| --- frog/leg/scanner/array_based_scanner.dart (revision 5925)
|
| +++ frog/leg/scanner/array_based_scanner.dart (working copy)
|
| @@ -1,171 +0,0 @@
|
| -// 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.
|
| -
|
| -class ArrayBasedScanner<S> extends AbstractScanner<S> {
|
| - int get charOffset() => byteOffset + extraCharOffset;
|
| - final Token tokens;
|
| - Token tail;
|
| - int tokenStart;
|
| - int byteOffset;
|
| -
|
| - /** Since the input is UTF8, some characters are represented by more
|
| - * than one byte. [extraCharOffset] tracks the difference. */
|
| - int extraCharOffset;
|
| - Link<BeginGroupToken> groupingStack = const EmptyLink<BeginGroupToken>();
|
| -
|
| - ArrayBasedScanner()
|
| - : this.extraCharOffset = 0,
|
| - this.tokenStart = -1,
|
| - this.byteOffset = -1,
|
| - this.tokens = new Token(EOF_INFO, -1) {
|
| - this.tail = this.tokens;
|
| - }
|
| -
|
| - int advance() {
|
| - int next = nextByte();
|
| - return next;
|
| - }
|
| -
|
| - int select(int choice, PrecedenceInfo yes, PrecedenceInfo no) {
|
| - int next = advance();
|
| - if (next === choice) {
|
| - appendPrecenceToken(yes);
|
| - return advance();
|
| - } else {
|
| - appendPrecenceToken(no);
|
| - return next;
|
| - }
|
| - }
|
| -
|
| - void appendPrecenceToken(PrecedenceInfo info) {
|
| - tail.next = new Token(info, tokenStart);
|
| - tail = tail.next;
|
| - }
|
| -
|
| - void appendStringToken(PrecedenceInfo info, String value) {
|
| - tail.next = new StringToken(info, value, tokenStart);
|
| - tail = tail.next;
|
| - }
|
| -
|
| - void appendKeywordToken(Keyword keyword) {
|
| - tail.next = new KeywordToken(keyword, tokenStart);
|
| - tail = tail.next;
|
| - }
|
| -
|
| - void appendEofToken() {
|
| - tail.next = new Token(EOF_INFO, charOffset);
|
| - tail = tail.next;
|
| - // EOF points to itself so there's always infinite look-ahead.
|
| - tail.next = tail;
|
| - discardOpenLt();
|
| - if (!groupingStack.isEmpty()) {
|
| - BeginGroupToken begin = groupingStack.head;
|
| - throw new MalformedInputException('Unbalanced ${begin.stringValue}',
|
| - begin);
|
| - }
|
| - }
|
| -
|
| - void beginToken() {
|
| - tokenStart = charOffset;
|
| - }
|
| -
|
| - Token firstToken() {
|
| - return tokens.next;
|
| - }
|
| -
|
| - void addToCharOffset(int offset) {
|
| - extraCharOffset += offset;
|
| - }
|
| -
|
| - void appendWhiteSpace(int next) {
|
| - // Do nothing, we don't collect white space.
|
| - }
|
| -
|
| - void appendBeginGroup(PrecedenceInfo info, String value) {
|
| - Token token = new BeginGroupToken(info, value, tokenStart);
|
| - tail.next = token;
|
| - tail = tail.next;
|
| - while (info.kind !== LT_TOKEN &&
|
| - !groupingStack.isEmpty() &&
|
| - groupingStack.head.kind === LT_TOKEN) {
|
| - groupingStack = groupingStack.tail;
|
| - }
|
| - groupingStack = groupingStack.prepend(token);
|
| - }
|
| -
|
| - int appendEndGroup(PrecedenceInfo info, String value, int openKind) {
|
| - assert(openKind !== LT_TOKEN);
|
| - appendStringToken(info, value);
|
| - discardOpenLt();
|
| - if (groupingStack.isEmpty()) {
|
| - return advance();
|
| - }
|
| - BeginGroupToken begin = groupingStack.head;
|
| - if (begin.kind !== openKind) {
|
| - if (openKind !== OPEN_CURLY_BRACKET_TOKEN ||
|
| - begin.kind !== STRING_INTERPOLATION_TOKEN) {
|
| - // Not ending string interpolation.
|
| - throw new MalformedInputException('Unmatched ${begin.stringValue}',
|
| - begin);
|
| - }
|
| - // We're ending an interpolated expression.
|
| - begin.endGroup = tail;
|
| - groupingStack = groupingStack.tail;
|
| - // Using "start-of-text" to signal that we're back in string
|
| - // scanning mode.
|
| - return $STX;
|
| - }
|
| - begin.endGroup = tail;
|
| - groupingStack = groupingStack.tail;
|
| - return advance();
|
| - }
|
| -
|
| - void appendGt(PrecedenceInfo info, String value) {
|
| - appendStringToken(info, value);
|
| - if (groupingStack.isEmpty()) return;
|
| - if (groupingStack.head.kind === LT_TOKEN) {
|
| - groupingStack.head.endGroup = tail;
|
| - groupingStack = groupingStack.tail;
|
| - }
|
| - }
|
| -
|
| - void appendGtGt(PrecedenceInfo info, String value) {
|
| - appendStringToken(info, value);
|
| - if (groupingStack.isEmpty()) return;
|
| - if (groupingStack.head.kind === LT_TOKEN) {
|
| - groupingStack = groupingStack.tail;
|
| - }
|
| - if (groupingStack.isEmpty()) return;
|
| - if (groupingStack.head.kind === LT_TOKEN) {
|
| - groupingStack.head.endGroup = tail;
|
| - groupingStack = groupingStack.tail;
|
| - }
|
| - }
|
| -
|
| - void appendGtGtGt(PrecedenceInfo info, String value) {
|
| - appendStringToken(info, value);
|
| - if (groupingStack.isEmpty()) return;
|
| - if (groupingStack.head.kind === LT_TOKEN) {
|
| - groupingStack = groupingStack.tail;
|
| - }
|
| - if (groupingStack.isEmpty()) return;
|
| - if (groupingStack.head.kind === LT_TOKEN) {
|
| - groupingStack = groupingStack.tail;
|
| - }
|
| - if (groupingStack.isEmpty()) return;
|
| - if (groupingStack.head.kind === LT_TOKEN) {
|
| - groupingStack.head.endGroup = tail;
|
| - groupingStack = groupingStack.tail;
|
| - }
|
| - }
|
| -
|
| - void discardOpenLt() {
|
| - while (!groupingStack.isEmpty() && groupingStack.head.kind === LT_TOKEN) {
|
| - groupingStack = groupingStack.tail;
|
| - }
|
| - }
|
| -
|
| - // TODO(ahe): make class abstract instead of adding an abstract method.
|
| - abstract peek();
|
| -}
|
|
|