| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of scanner; | 5 part of scanner; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * A keyword in the Dart programming language. | 8 * A keyword in the Dart programming language. |
| 9 */ | 9 */ |
| 10 class Keyword implements SourceString { | 10 class Keyword extends Iterable<int> implements SourceString { |
| 11 static const List<Keyword> values = const <Keyword> [ | 11 static const List<Keyword> values = const <Keyword> [ |
| 12 const Keyword("assert"), | 12 const Keyword("assert"), |
| 13 const Keyword("break"), | 13 const Keyword("break"), |
| 14 const Keyword("case"), | 14 const Keyword("case"), |
| 15 const Keyword("catch"), | 15 const Keyword("catch"), |
| 16 const Keyword("class"), | 16 const Keyword("class"), |
| 17 const Keyword("const"), | 17 const Keyword("const"), |
| 18 const Keyword("continue"), | 18 const Keyword("continue"), |
| 19 const Keyword("default"), | 19 const Keyword("default"), |
| 20 const Keyword("do"), | 20 const Keyword("do"), |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 } | 95 } |
| 96 return result; | 96 return result; |
| 97 } | 97 } |
| 98 | 98 |
| 99 int get hashCode => syntax.hashCode; | 99 int get hashCode => syntax.hashCode; |
| 100 | 100 |
| 101 bool operator ==(other) { | 101 bool operator ==(other) { |
| 102 return other is SourceString && toString() == other.slowToString(); | 102 return other is SourceString && toString() == other.slowToString(); |
| 103 } | 103 } |
| 104 | 104 |
| 105 Iterator<int> iterator() => new StringCodeIterator(syntax); | 105 Iterator<int> get iterator => new StringCodeIterator(syntax); |
| 106 | 106 |
| 107 void printOn(StringBuffer sb) { | 107 void printOn(StringBuffer sb) { |
| 108 sb.add(syntax); | 108 sb.add(syntax); |
| 109 } | 109 } |
| 110 | 110 |
| 111 String toString() => syntax; | 111 String toString() => syntax; |
| 112 String slowToString() => syntax; | 112 String slowToString() => syntax; |
| 113 String get stringValue => syntax; | 113 String get stringValue => syntax; |
| 114 | 114 |
| 115 SourceString copyWithoutQuotes(int initial, int terminal) { | 115 SourceString copyWithoutQuotes(int initial, int terminal) { |
| 116 // TODO(lrn): consider remodelling to avoid having this method in keywords. | 116 // TODO(lrn): consider remodelling to avoid having this method in keywords. |
| 117 return this; | 117 return this; |
| 118 } | 118 } |
| 119 | 119 |
| 120 bool get isEmpty => false; | 120 bool get isEmpty => false; |
| 121 bool isPrivate() => false; | 121 bool isPrivate() => false; |
| 122 } | 122 } |
| 123 | 123 |
| 124 /** | 124 /** |
| 125 * Abstract state in a state machine for scanning keywords. | 125 * Abstract state in a state machine for scanning keywords. |
| 126 */ | 126 */ |
| 127 abstract class KeywordState { | 127 abstract class KeywordState { |
| 128 bool isLeaf(); | 128 bool isLeaf(); |
| 129 KeywordState next(int c); | 129 KeywordState next(int c); |
| 130 Keyword get keyword; | 130 Keyword get keyword; |
| 131 | 131 |
| 132 static KeywordState _KEYWORD_STATE; | 132 static KeywordState _KEYWORD_STATE; |
| 133 static KeywordState get KEYWORD_STATE { | 133 static KeywordState get KEYWORD_STATE { |
| 134 if (_KEYWORD_STATE == null) { | 134 if (_KEYWORD_STATE == null) { |
| 135 List<String> strings = new List<String>(Keyword.values.length); | 135 List<String> strings = |
| 136 new List<String>.fixedLength(Keyword.values.length); |
| 136 for (int i = 0; i < Keyword.values.length; i++) { | 137 for (int i = 0; i < Keyword.values.length; i++) { |
| 137 strings[i] = Keyword.values[i].syntax; | 138 strings[i] = Keyword.values[i].syntax; |
| 138 } | 139 } |
| 139 strings.sort((a,b) => a.compareTo(b)); | 140 strings.sort((a,b) => a.compareTo(b)); |
| 140 _KEYWORD_STATE = computeKeywordStateTable(0, strings, 0, strings.length); | 141 _KEYWORD_STATE = computeKeywordStateTable(0, strings, 0, strings.length); |
| 141 } | 142 } |
| 142 return _KEYWORD_STATE; | 143 return _KEYWORD_STATE; |
| 143 } | 144 } |
| 144 | 145 |
| 145 static KeywordState computeKeywordStateTable(int start, List<String> strings, | 146 static KeywordState computeKeywordStateTable(int start, List<String> strings, |
| 146 int offset, int length) { | 147 int offset, int length) { |
| 147 List<KeywordState> result = new List<KeywordState>(26); | 148 List<KeywordState> result = new List<KeywordState>.fixedLength(26); |
| 148 assert(length != 0); | 149 assert(length != 0); |
| 149 int chunk = 0; | 150 int chunk = 0; |
| 150 int chunkStart = -1; | 151 int chunkStart = -1; |
| 151 bool isLeaf = false; | 152 bool isLeaf = false; |
| 152 for (int i = offset; i < offset + length; i++) { | 153 for (int i = offset; i < offset + length; i++) { |
| 153 if (strings[i].length == start) { | 154 if (strings[i].length == start) { |
| 154 isLeaf = true; | 155 isLeaf = true; |
| 155 } | 156 } |
| 156 if (strings[i].length > start) { | 157 if (strings[i].length > start) { |
| 157 int c = strings[i].charCodeAt(start); | 158 int c = strings[i].charCodeAt(start); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 final Keyword keyword; | 225 final Keyword keyword; |
| 225 | 226 |
| 226 LeafKeywordState(String syntax) : keyword = Keyword.keywords[syntax]; | 227 LeafKeywordState(String syntax) : keyword = Keyword.keywords[syntax]; |
| 227 | 228 |
| 228 bool isLeaf() => true; | 229 bool isLeaf() => true; |
| 229 | 230 |
| 230 KeywordState next(int c) => null; | 231 KeywordState next(int c) => null; |
| 231 | 232 |
| 232 String toString() => keyword.syntax; | 233 String toString() => keyword.syntax; |
| 233 } | 234 } |
| OLD | NEW |