anchor.diff:      show AbstractScanner;
   import 'package:front_end/src/scanner/errors.dart';
   import 'package:front_end/src/scanner/reader.dart';
  -import 'package:front_end/src/scanner/scanner.dart';
   import 'package:front_end/src/scanner/token.dart';
   import 'package:test/test.dart';
   import 'package:test_reflective_loader/test_reflective_loader.dart';
  
positive.code:   }
  }
  
  @reflectiveTest
  class KeywordStateTest {
    void test_KeywordState() {
      //
      // Generate the test data to be scanned.
      //
      List<Keyword> keywords = Keyword.values;
      int keywordCount = keywords.length;
      List<String> textToTest = new List<String>(keywordCount * 3);
      for (int i = 0; i < keywordCount; i++) {
        String syntax = keywords[i].lexeme;
        textToTest[i] = syntax;
        textToTest[i + keywordCount] = "${syntax}x";
        textToTest[i + keywordCount * 2] = syntax.substring(0, syntax.length - 1);
      }
      //
      // Scan each of the identifiers.
      //
      KeywordState firstState = KeywordState.KEYWORD_STATE;
      for (int i = 0; i < textToTest.length; i++) {
        String text = textToTest[i];
        int index = 0;
        int length = text.length;
        KeywordState state = firstState;
        while (index < length && state != null) {
          state = state.next(text.codeUnitAt(index));
          index++;
        }
        if (i < keywordCount) {
          // keyword
          expect(state, isNotNull);
          expect(state.keyword(), isNotNull);
          expect(state.keyword(), keywords[i]);
        } else if (i < keywordCount * 2) {
          // keyword + "x"
          expect(state, isNull);
        } else {
          // keyword.substring(0, keyword.length() - 1)
          expect(state, isNotNull);
        }
      }
    }
  }
  
  @reflectiveTest
  class ScannerTest extends ScannerTestBase {
    @override
    Token scanWithListener(String source, ErrorListener listener,
        {bool genericMethodComments: false,
        bool lazyAssignmentOperators: false}) {
      Scanner scanner =
          new _TestScanner(new CharSequenceReader(source), listener);
      scanner.scanGenericMethodComments = genericMethodComments;
      scanner.scanLazyAssignmentOperators = lazyAssignmentOperators;
      return scanner.tokenize();
    }
  }
  
  abstract class ScannerTestBase {
    bool usingFasta = false;
  
  
negative.code:     expect(token.precedingComments.next.next.previous,
          same(token.precedingComments.next));
      expect(token.precedingComments.next.next.next, isNull);
    }
  
    void test_comment_multi_unterminated() {
  