| Index: lib/src/backend/platform_selector/scanner.dart
|
| diff --git a/lib/src/backend/platform_selector/scanner.dart b/lib/src/backend/platform_selector/scanner.dart
|
| deleted file mode 100644
|
| index 44dddca43d596637f87f1224705903490077b672..0000000000000000000000000000000000000000
|
| --- a/lib/src/backend/platform_selector/scanner.dart
|
| +++ /dev/null
|
| @@ -1,146 +0,0 @@
|
| -// Copyright (c) 2015, 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.
|
| -
|
| -import 'package:string_scanner/string_scanner.dart';
|
| -
|
| -import '../../utils.dart';
|
| -import 'token.dart';
|
| -
|
| -/// A regular expression matching both whitespace and single-line comments.
|
| -///
|
| -/// This will only match if consumes at least one character.
|
| -final _whitespaceAndSingleLineComments =
|
| - new RegExp(r"([ \t\n]+|//[^\n]*(\n|$))+");
|
| -
|
| -/// A regular expression matching the body of a multi-line comment, after `/*`
|
| -/// but before `*/` or a nested `/*`.
|
| -///
|
| -/// This will only match if it consumes at least one character.
|
| -final _multiLineCommentBody = new RegExp(r"([^/*]|/[^*]|\*[^/])+");
|
| -
|
| -/// A scanner that converts a platform selector string into a stream of
|
| -/// tokens.
|
| -class Scanner {
|
| - /// The underlying string scanner.
|
| - final SpanScanner _scanner;
|
| -
|
| - /// The next token to emit.
|
| - Token _next;
|
| -
|
| - /// Whether the scanner has emitted a [TokenType.endOfFile] token.
|
| - bool _endOfFileEmitted = false;
|
| -
|
| - Scanner(String selector)
|
| - : _scanner = new SpanScanner(selector);
|
| -
|
| - /// Returns the next token that will be returned by [next].
|
| - ///
|
| - /// Throws a [StateError] if a [TokenType.endOfFile] token has already been
|
| - /// consumed.
|
| - Token peek() {
|
| - if (_next == null) _next = _getNext();
|
| - return _next;
|
| - }
|
| -
|
| - /// Consumes and returns the next token in the stream.
|
| - ///
|
| - /// Throws a [StateError] if a [TokenType.endOfFile] token has already been
|
| - /// consumed.
|
| - Token next() {
|
| - var token = _next == null ? _getNext() : _next;
|
| - _endOfFileEmitted = token.type == TokenType.endOfFile;
|
| - _next = null;
|
| - return token;
|
| - }
|
| -
|
| - /// If the next token matches [type], consumes it and returns `true`;
|
| - /// otherwise, returns `false`.
|
| - ///
|
| - /// Throws a [StateError] if a [TokenType.endOfFile] token has already been
|
| - /// consumed.
|
| - bool scan(TokenType type) {
|
| - if (peek().type != type) return false;
|
| - next();
|
| - return true;
|
| - }
|
| -
|
| - /// Scan and return the next token in the stream.
|
| - Token _getNext() {
|
| - if (_endOfFileEmitted) throw new StateError("No more tokens.");
|
| -
|
| - _consumeWhitespace();
|
| - if (_scanner.isDone) {
|
| - return new Token(
|
| - TokenType.endOfFile, _scanner.spanFrom(_scanner.state));
|
| - }
|
| -
|
| - switch (_scanner.peekChar()) {
|
| - case 0x28 /* ( */: return _scanOperator(TokenType.leftParen);
|
| - case 0x29 /* ) */: return _scanOperator(TokenType.rightParen);
|
| - case 0x3F /* ? */: return _scanOperator(TokenType.questionMark);
|
| - case 0x3A /* : */: return _scanOperator(TokenType.colon);
|
| - case 0x21 /* ! */: return _scanOperator(TokenType.not);
|
| - case 0x7C /* | */: return _scanOr();
|
| - case 0x26 /* & */: return _scanAnd();
|
| - default: return _scanIdentifier();
|
| - }
|
| - }
|
| -
|
| - /// Scans a single-character operator and returns a token of type [type].
|
| - ///
|
| - /// This assumes that the caller has already verified that the next character
|
| - /// is correct for the given operator.
|
| - Token _scanOperator(TokenType type) {
|
| - var start = _scanner.state;
|
| - _scanner.readChar();
|
| - return new Token(type, _scanner.spanFrom(start));
|
| - }
|
| -
|
| - /// Scans a `||` operator and returns the appropriate token.
|
| - ///
|
| - /// This validates that the next two characters are `||`.
|
| - Token _scanOr() {
|
| - var start = _scanner.state;
|
| - _scanner.expect("||");
|
| - return new Token(TokenType.or, _scanner.spanFrom(start));
|
| - }
|
| -
|
| - /// Scans a `&&` operator and returns the appropriate token.
|
| - ///
|
| - /// This validates that the next two characters are `&&`.
|
| - Token _scanAnd() {
|
| - var start = _scanner.state;
|
| - _scanner.expect("&&");
|
| - return new Token(TokenType.and, _scanner.spanFrom(start));
|
| - }
|
| -
|
| - /// Scans and returns an identifier token.
|
| - Token _scanIdentifier() {
|
| - _scanner.expect(hyphenatedIdentifier, name: "expression");
|
| - return new IdentifierToken(_scanner.lastMatch[0], _scanner.lastSpan);
|
| - }
|
| -
|
| - /// Consumes all whitespace and comments immediately following the cursor's
|
| - /// current position.
|
| - void _consumeWhitespace() {
|
| - while (_scanner.scan(_whitespaceAndSingleLineComments) ||
|
| - _multiLineComment()) {
|
| - // Do nothing.
|
| - }
|
| - }
|
| -
|
| - /// Consumes a single multi-line comment.
|
| - ///
|
| - /// Returns whether or not a comment was consumed.
|
| - bool _multiLineComment() {
|
| - if (!_scanner.scan("/*")) return false;
|
| -
|
| - while (_scanner.scan(_multiLineCommentBody) || _multiLineComment()) {
|
| - // Do nothing.
|
| - }
|
| - _scanner.expect("*/");
|
| -
|
| - return true;
|
| - }
|
| -}
|
|
|