Index: frog/leg/scanner/keyword.dart |
=================================================================== |
--- frog/leg/scanner/keyword.dart (revision 5925) |
+++ frog/leg/scanner/keyword.dart (working copy) |
@@ -1,255 +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. |
- |
-/** |
- * A keyword in the Dart programming language. |
- */ |
-class Keyword implements SourceString { |
- static final Keyword BREAK = const Keyword("break"); |
- static final Keyword CASE = const Keyword("case"); |
- static final Keyword CATCH = const Keyword("catch"); |
- static final Keyword CLASS = const Keyword("class"); |
- static final Keyword CONST = const Keyword("const"); |
- static final Keyword CONTINUE = const Keyword("continue"); |
- static final Keyword DEFAULT = const Keyword("default"); |
- static final Keyword DO = const Keyword("do"); |
- static final Keyword ELSE = const Keyword("else"); |
- static final Keyword EXTENDS = const Keyword("extends"); |
- static final Keyword FALSE = const Keyword("false"); |
- static final Keyword FINAL = const Keyword("final"); |
- static final Keyword FINALLY = const Keyword("finally"); |
- static final Keyword FOR = const Keyword("for"); |
- static final Keyword IF = const Keyword("if"); |
- static final Keyword IN = const Keyword("in"); |
- static final Keyword IS = const Keyword("is", info: IS_INFO); |
- static final Keyword NEW = const Keyword("new"); |
- static final Keyword NULL = const Keyword("null"); |
- static final Keyword RETURN = const Keyword("return"); |
- static final Keyword SUPER = const Keyword("super"); |
- static final Keyword SWITCH = const Keyword("switch"); |
- static final Keyword THIS = const Keyword("this"); |
- static final Keyword THROW = const Keyword("throw"); |
- static final Keyword TRUE = const Keyword("true"); |
- static final Keyword TRY = const Keyword("try"); |
- static final Keyword VAR = const Keyword("var"); |
- static final Keyword VOID = const Keyword("void"); |
- static final Keyword WHILE = const Keyword("while"); |
- |
- // Pseudo keywords: |
- static final Keyword ABSTRACT = const Keyword("abstract", isPseudo: true); |
- static final Keyword ASSERT = const Keyword("assert", isPseudo: true); |
- static final Keyword FACTORY = const Keyword("factory", isPseudo: true); |
- static final Keyword GET = const Keyword("get", isPseudo: true); |
- static final Keyword IMPLEMENTS = const Keyword("implements", isPseudo: true); |
- static final Keyword IMPORT = const Keyword("import", isPseudo: true); |
- static final Keyword INTERFACE = const Keyword("interface", isPseudo: true); |
- static final Keyword LIBRARY = const Keyword("library", isPseudo: true); |
- static final Keyword NATIVE = const Keyword("native", isPseudo: true); |
- static final Keyword NEGATE = const Keyword("negate", isPseudo: true); |
- static final Keyword OPERATOR = const Keyword("operator", isPseudo: true); |
- static final Keyword SET = const Keyword("set", isPseudo: true); |
- static final Keyword SOURCE = const Keyword("source", isPseudo: true); |
- static final Keyword STATIC = const Keyword("static", isPseudo: true); |
- static final Keyword TYPEDEF = const Keyword("typedef", isPseudo: true); |
- |
- static final List<Keyword> values = const <Keyword> [ |
- BREAK, |
- CASE, |
- CATCH, |
- CONST, |
- CONTINUE, |
- DEFAULT, |
- DO, |
- ELSE, |
- FALSE, |
- FINAL, |
- FINALLY, |
- FOR, |
- IF, |
- IN, |
- IS, |
- NEW, |
- NULL, |
- RETURN, |
- SUPER, |
- SWITCH, |
- THIS, |
- THROW, |
- TRUE, |
- TRY, |
- VAR, |
- VOID, |
- WHILE, |
- ABSTRACT, |
- ASSERT, |
- CLASS, |
- EXTENDS, |
- FACTORY, |
- GET, |
- IMPLEMENTS, |
- IMPORT, |
- INTERFACE, |
- LIBRARY, |
- NATIVE, |
- NEGATE, |
- OPERATOR, |
- SET, |
- SOURCE, |
- STATIC, |
- TYPEDEF ]; |
- |
- final String syntax; |
- final bool isPseudo; |
- final PrecedenceInfo info; |
- |
- static Map<String, Keyword> _keywords; |
- static Map<String, Keyword> get keywords() { |
- if (_keywords === null) { |
- _keywords = computeKeywordMap(); |
- } |
- return _keywords; |
- } |
- |
- const Keyword(String this.syntax, |
- [bool this.isPseudo = false, |
- PrecedenceInfo this.info = KEYWORD_INFO]); |
- |
- static Map<String, Keyword> computeKeywordMap() { |
- Map<String, Keyword> result = new LinkedHashMap<String, Keyword>(); |
- for (Keyword keyword in values) { |
- result[keyword.syntax] = keyword; |
- } |
- return result; |
- } |
- |
- int hashCode() => syntax.hashCode(); |
- |
- bool operator ==(other) { |
- return other is SourceString && toString() == other.slowToString(); |
- } |
- |
- Iterator<int> iterator() => new StringCodeIterator(syntax); |
- |
- void printOn(StringBuffer sb) { |
- sb.add(syntax); |
- } |
- |
- String toString() => syntax; |
- String slowToString() => syntax; |
- String get stringValue() => syntax; |
- |
- bool isEmpty() => false; |
- bool isPrivate() => false; |
-} |
- |
-/** |
- * Abstract state in a state machine for scanning keywords. |
- */ |
-class KeywordState { |
- abstract bool isLeaf(); |
- abstract KeywordState next(int c); |
- abstract Keyword get keyword(); |
- |
- static KeywordState _KEYWORD_STATE; |
- static KeywordState get KEYWORD_STATE() { |
- if (_KEYWORD_STATE === null) { |
- List<String> strings = new List<String>(Keyword.values.length); |
- for (int i = 0; i < Keyword.values.length; i++) { |
- strings[i] = Keyword.values[i].syntax; |
- } |
- strings.sort((a,b) => a.compareTo(b)); |
- _KEYWORD_STATE = computeKeywordStateTable(0, strings, 0, strings.length); |
- } |
- return _KEYWORD_STATE; |
- } |
- |
- static KeywordState computeKeywordStateTable(int start, List<String> strings, |
- int offset, int length) { |
- List<KeywordState> result = new List<KeywordState>(26); |
- assert(length != 0); |
- int chunk = 0; |
- int chunkStart = -1; |
- bool isLeaf = false; |
- for (int i = offset; i < offset + length; i++) { |
- if (strings[i].length == start) { |
- isLeaf = true; |
- } |
- if (strings[i].length > start) { |
- int c = strings[i].charCodeAt(start); |
- if (chunk != c) { |
- if (chunkStart != -1) { |
- assert(result[chunk - $a] === null); |
- result[chunk - $a] = computeKeywordStateTable(start + 1, strings, |
- chunkStart, |
- i - chunkStart); |
- } |
- chunkStart = i; |
- chunk = c; |
- } |
- } |
- } |
- if (chunkStart != -1) { |
- assert(result[chunk - $a] === null); |
- result[chunk - $a] = |
- computeKeywordStateTable(start + 1, strings, chunkStart, |
- offset + length - chunkStart); |
- } else { |
- assert(length == 1); |
- return new LeafKeywordState(strings[offset]); |
- } |
- if (isLeaf) { |
- return new ArrayKeywordState(result, strings[offset]); |
- } else { |
- return new ArrayKeywordState(result, null); |
- } |
- } |
-} |
- |
-/** |
- * A state with multiple outgoing transitions. |
- */ |
-class ArrayKeywordState extends KeywordState { |
- final List<KeywordState> table; |
- final Keyword keyword; |
- |
- ArrayKeywordState(List<KeywordState> this.table, String syntax) |
- : keyword = (syntax === null) ? null : Keyword.keywords[syntax]; |
- |
- bool isLeaf() => false; |
- |
- KeywordState next(int c) => table[c - $a]; |
- |
- String toString() { |
- StringBuffer sb = new StringBuffer(); |
- sb.add("["); |
- if (keyword !== null) { |
- sb.add("*"); |
- sb.add(keyword); |
- sb.add(" "); |
- } |
- List<KeywordState> foo = table; |
- for (int i = 0; i < foo.length; i++) { |
- if (foo[i] != null) { |
- sb.add("${new String.fromCharCodes([i + $a])}: ${foo[i]}; "); |
- } |
- } |
- sb.add("]"); |
- return sb.toString(); |
- } |
-} |
- |
-/** |
- * A state that has no outgoing transitions. |
- */ |
-class LeafKeywordState extends KeywordState { |
- final Keyword keyword; |
- |
- LeafKeywordState(String syntax) : keyword = Keyword.keywords[syntax]; |
- |
- bool isLeaf() => true; |
- |
- KeywordState next(int c) => null; |
- |
- String toString() => keyword.syntax; |
-} |