| Index: pkg/front_end/lib/src/fasta/scanner/keyword.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/scanner/keyword.dart b/pkg/front_end/lib/src/fasta/scanner/keyword.dart
|
| index 1b06fb9b2d0c97df17186c679f762f4ccf41347a..48c4104724113eef9967b0d69211295a806714f4 100644
|
| --- a/pkg/front_end/lib/src/fasta/scanner/keyword.dart
|
| +++ b/pkg/front_end/lib/src/fasta/scanner/keyword.dart
|
| @@ -5,7 +5,7 @@
|
| library fasta.scanner.keywords;
|
|
|
| import 'characters.dart' show
|
| - $a;
|
| + $a, $z, $A, $Z;
|
|
|
| import 'precedence.dart' show
|
| PrecedenceInfo;
|
| @@ -77,6 +77,7 @@ class Keyword {
|
| const Keyword("async", isPseudo: true),
|
| const Keyword("await", isPseudo: true),
|
| const Keyword("deferred", isPseudo: true),
|
| + const Keyword("Function", isPseudo: true),
|
| const Keyword("hide", isPseudo: true),
|
| const Keyword("native", isPseudo: true),
|
| const Keyword("of", isPseudo: true),
|
| @@ -121,10 +122,10 @@ class Keyword {
|
| * Abstract state in a state machine for scanning keywords.
|
| */
|
| abstract class KeywordState {
|
| - KeywordState(this.keyword);
|
| -
|
| KeywordState next(int c);
|
| - final Keyword keyword;
|
| + KeywordState nextCapital(int c);
|
| +
|
| + Keyword get keyword;
|
|
|
| static KeywordState _KEYWORD_STATE;
|
| static KeywordState get KEYWORD_STATE {
|
| @@ -141,7 +142,9 @@ abstract class KeywordState {
|
|
|
| static KeywordState computeKeywordStateTable(
|
| int start, List<String> strings, int offset, int length) {
|
| - List<KeywordState> result = new List<KeywordState>(26);
|
| + bool isLowercase = true;
|
| +
|
| + List<KeywordState> table = new List<KeywordState>($z - $A + 1);
|
| assert(length != 0);
|
| int chunk = 0;
|
| int chunkStart = -1;
|
| @@ -152,10 +155,13 @@ abstract class KeywordState {
|
| }
|
| if (strings[i].length > start) {
|
| int c = strings[i].codeUnitAt(start);
|
| + if ($A <= c && c <= $Z) {
|
| + isLowercase = false;
|
| + }
|
| if (chunk != c) {
|
| if (chunkStart != -1) {
|
| - assert(result[chunk - $a] == null);
|
| - result[chunk - $a] = computeKeywordStateTable(
|
| + assert(table[chunk - $A] == null);
|
| + table[chunk - $A] = computeKeywordStateTable(
|
| start + 1, strings, chunkStart, i - chunkStart);
|
| }
|
| chunkStart = i;
|
| @@ -164,17 +170,19 @@ abstract class KeywordState {
|
| }
|
| }
|
| if (chunkStart != -1) {
|
| - assert(result[chunk - $a] == null);
|
| - result[chunk - $a] = computeKeywordStateTable(
|
| + assert(table[chunk - $A] == null);
|
| + table[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]);
|
| + String syntax = isLeaf ? strings[offset] : null;
|
| + if (isLowercase) {
|
| + table = table.sublist($a - $A);
|
| + return new LowerCaseArrayKeywordState(table, syntax);
|
| } else {
|
| - return new ArrayKeywordState(result, null);
|
| + return new UpperCaseArrayKeywordState(table, syntax);
|
| }
|
| }
|
| }
|
| @@ -182,13 +190,16 @@ abstract class KeywordState {
|
| /**
|
| * A state with multiple outgoing transitions.
|
| */
|
| -class ArrayKeywordState extends KeywordState {
|
| +abstract class ArrayKeywordState implements KeywordState {
|
| final List<KeywordState> table;
|
| + final Keyword keyword;
|
|
|
| ArrayKeywordState(List<KeywordState> this.table, String syntax)
|
| - : super((syntax == null) ? null : Keyword.keywords[syntax]);
|
| + : keyword = ((syntax == null) ? null : Keyword.keywords[syntax]);
|
|
|
| - KeywordState next(int c) => table[c - $a];
|
| + KeywordState next(int c);
|
| +
|
| + KeywordState nextCapital(int c);
|
|
|
| String toString() {
|
| StringBuffer sb = new StringBuffer();
|
| @@ -210,13 +221,42 @@ class ArrayKeywordState extends KeywordState {
|
| }
|
| }
|
|
|
| +class LowerCaseArrayKeywordState extends ArrayKeywordState {
|
| +
|
| + LowerCaseArrayKeywordState(List<KeywordState> table, String syntax)
|
| + : super(table, syntax) {
|
| + assert(table.length == $z - $a + 1);
|
| + }
|
| +
|
| + KeywordState next(int c) => table[c - $a];
|
| +
|
| + KeywordState nextCapital(int c) => null;
|
| +
|
| +}
|
| +
|
| +class UpperCaseArrayKeywordState extends ArrayKeywordState {
|
| +
|
| + UpperCaseArrayKeywordState(List<KeywordState> table, String syntax)
|
| + : super(table, syntax) {
|
| + assert(table.length == $z - $A + 1);
|
| + }
|
| +
|
| + KeywordState next(int c) => table[c - $A];
|
| +
|
| + KeywordState nextCapital(int c) => table[c - $A];
|
| +
|
| +}
|
| +
|
| /**
|
| * A state that has no outgoing transitions.
|
| */
|
| -class LeafKeywordState extends KeywordState {
|
| - LeafKeywordState(String syntax) : super(Keyword.keywords[syntax]);
|
| +class LeafKeywordState implements KeywordState {
|
| + final Keyword keyword;
|
| +
|
| + LeafKeywordState(String syntax) : keyword = Keyword.keywords[syntax];
|
|
|
| KeywordState next(int c) => null;
|
| + KeywordState nextCapital(int c) => null;
|
|
|
| String toString() => keyword.syntax;
|
| }
|
|
|