The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ JSKeyword

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     internal sealed class JSKeyword
  19.     {
  20.         private JSKeyword next;
  21.         private JSToken token;
  22.         private string name;
  23.         private int length;
  24.        
  25.         private JSKeyword(JSToken token, string name)
  26.         {
  27.             this.name = name;
  28.             this.next = null;
  29.             this.token = token;
  30.             this.length = this.name.Length;
  31.         }
  32.        
  33.         private JSKeyword(JSToken token, string name, JSKeyword next)
  34.         {
  35.             this.name = name;
  36.             this.next = next;
  37.             this.token = token;
  38.             this.length = this.name.Length;
  39.         }
  40.        
  41.         static internal string CanBeIdentifier(JSToken keyword)
  42.         {
  43.             switch (keyword) {
  44.                 case JSToken.Abstract:
  45.                     return "abstract";
  46.                 case JSToken.Assert:
  47.                     return "assert";
  48.                 case JSToken.Boolean:
  49.                     return "boolean";
  50.                 case JSToken.Byte:
  51.                     return "byte";
  52.                 case JSToken.Char:
  53.                     return "char";
  54.                 case JSToken.Decimal:
  55.                     return "decimal";
  56.                 case JSToken.Double:
  57.                     return "double";
  58.                 case JSToken.Ensure:
  59.                     return "ensure";
  60.                 case JSToken.Enum:
  61.                     return "enum";
  62.                 case JSToken.Event:
  63.                     return "event";
  64.                 case JSToken.Final:
  65.                     return "final";
  66.                 case JSToken.Float:
  67.                     return "float";
  68.                 case JSToken.Get:
  69.                     return "get";
  70.                 case JSToken.Goto:
  71.                     return "goto";
  72.                 case JSToken.Implements:
  73.                     return "implements";
  74.                 case JSToken.Int:
  75.                     return "int";
  76.                 case JSToken.Interface:
  77.                     return "interface";
  78.                 case JSToken.Internal:
  79.                     return "internal";
  80.                 case JSToken.Invariant:
  81.                     return "invariant";
  82.                 case JSToken.Long:
  83.                     return "long";
  84.                 case JSToken.Namespace:
  85.                     return "namespace";
  86.                 case JSToken.Native:
  87.                     return "native";
  88.                 case JSToken.Package:
  89.                     return "package";
  90.                 case JSToken.Private:
  91.                     return "private";
  92.                 case JSToken.Protected:
  93.                     return "protected";
  94.                 case JSToken.Public:
  95.                     return "public";
  96.                 case JSToken.Require:
  97.                     return "require";
  98.                 case JSToken.Sbyte:
  99.                     return "sbyte";
  100.                 case JSToken.Set:
  101.                     return "set";
  102.                 case JSToken.Short:
  103.                     return "short";
  104.                 case JSToken.Static:
  105.                     return "static";
  106.                 case JSToken.Synchronized:
  107.                     return "synchronized";
  108.                 case JSToken.Throws:
  109.                     return "throws";
  110.                 case JSToken.Transient:
  111.                     return "transient";
  112.                 case JSToken.Void:
  113.                     return "void";
  114.                 case JSToken.Volatile:
  115.                     return "volatile";
  116.                 case JSToken.Uint:
  117.                     return "uint";
  118.                 case JSToken.Ulong:
  119.                     return "ulong";
  120.                 case JSToken.Ushort:
  121.                     return "ushort";
  122.                 case JSToken.Use:
  123.                     return "use";
  124.                 default:
  125.                     return null;
  126.             }
  127.         }
  128.        
  129.         internal JSToken GetKeyword(Context token, int length)
  130.         {
  131.             JSKeyword keyword = this;
  132.             nextToken:
  133.            
  134.             while (null != keyword) {
  135.                 if (length == keyword.length) {
  136.                     // we know the first char has to match
  137.                     for (int i = 1int j = token.startPos + 1; i < length; i++,j++) {
  138.                         char ch1 = keyword.name[i];
  139.                         char ch2 = token.source_string[j];
  140.                         if (ch1 == ch2)
  141.                             continue;
  142.                         else if (ch2 < ch1)
  143.                             return JSToken.Identifier;
  144.                         else {
  145.                             keyword = keyword.next;
  146.                             goto nextToken;
  147.                         }
  148.                     }
  149.                     return keyword.token;
  150.                 }
  151.                 else if (length < keyword.length)
  152.                     return JSToken.Identifier;
  153.                
  154.                 keyword = keyword.next;
  155.             }
  156.             return JSToken.Identifier;
  157.         }
  158.        
  159.         static internal JSKeyword[] InitKeywords()
  160.         {
  161.             JSKeyword[] keywords = new JSKeyword[26];
  162.             JSKeyword keyword;
  163.             // a
  164.             keyword = new JSKeyword(JSToken.Abstract, "abstract");
  165.             keyword = new JSKeyword(JSToken.Assert, "assert", keyword);
  166.             keywords['a' - 'a'] = keyword;
  167.             // b
  168.             keyword = new JSKeyword(JSToken.Boolean, "boolean");
  169.             keyword = new JSKeyword(JSToken.Break, "break", keyword);
  170.             keyword = new JSKeyword(JSToken.Byte, "byte", keyword);
  171.             keywords['b' - 'a'] = keyword;
  172.             // c
  173.             keyword = new JSKeyword(JSToken.Continue, "continue");
  174.             keyword = new JSKeyword(JSToken.Const, "const", keyword);
  175.             keyword = new JSKeyword(JSToken.Class, "class", keyword);
  176.             keyword = new JSKeyword(JSToken.Catch, "catch", keyword);
  177.             keyword = new JSKeyword(JSToken.Char, "char", keyword);
  178.             keyword = new JSKeyword(JSToken.Case, "case", keyword);
  179.             keywords['c' - 'a'] = keyword;
  180.             // d
  181.             keyword = new JSKeyword(JSToken.Debugger, "debugger");
  182.             keyword = new JSKeyword(JSToken.Default, "default", keyword);
  183.             keyword = new JSKeyword(JSToken.Double, "double", keyword);
  184.             keyword = new JSKeyword(JSToken.Delete, "delete", keyword);
  185.             keyword = new JSKeyword(JSToken.Do, "do", keyword);
  186.             keywords['d' - 'a'] = keyword;
  187.             // e
  188.             keyword = new JSKeyword(JSToken.Extends, "extends");
  189.             keyword = new JSKeyword(JSToken.Export, "export", keyword);
  190.             keyword = new JSKeyword(JSToken.Ensure, "ensure", keyword);
  191.             keyword = new JSKeyword(JSToken.Event, "event", keyword);
  192.             keyword = new JSKeyword(JSToken.Enum, "enum", keyword);
  193.             keyword = new JSKeyword(JSToken.Else, "else", keyword);
  194.             keywords['e' - 'a'] = keyword;
  195.             // f
  196.             keyword = new JSKeyword(JSToken.Function, "function");
  197.             keyword = new JSKeyword(JSToken.Finally, "finally", keyword);
  198.             keyword = new JSKeyword(JSToken.Float, "float", keyword);
  199.             keyword = new JSKeyword(JSToken.Final, "final", keyword);
  200.             keyword = new JSKeyword(JSToken.False, "false", keyword);
  201.             keyword = new JSKeyword(JSToken.For, "for", keyword);
  202.             keywords['f' - 'a'] = keyword;
  203.             // g
  204.             keyword = new JSKeyword(JSToken.Goto, "goto");
  205.             keyword = new JSKeyword(JSToken.Get, "get", keyword);
  206.             keywords['g' - 'a'] = keyword;
  207.             // i
  208.             keyword = new JSKeyword(JSToken.Instanceof, "instanceof");
  209.             keyword = new JSKeyword(JSToken.Implements, "implements", keyword);
  210.             keyword = new JSKeyword(JSToken.Invariant, "invariant", keyword);
  211.             keyword = new JSKeyword(JSToken.Interface, "interface", keyword);
  212.             keyword = new JSKeyword(JSToken.Internal, "internal", keyword);
  213.             keyword = new JSKeyword(JSToken.Import, "import", keyword);
  214.             keyword = new JSKeyword(JSToken.Int, "int", keyword);
  215.             keyword = new JSKeyword(JSToken.In, "in", keyword);
  216.             keyword = new JSKeyword(JSToken.If, "if", keyword);
  217.             keywords['i' - 'a'] = keyword;
  218.             // l
  219.             keyword = new JSKeyword(JSToken.Long, "long");
  220.             keywords['l' - 'a'] = keyword;
  221.             // n
  222.             keyword = new JSKeyword(JSToken.Namespace, "namespace");
  223.             keyword = new JSKeyword(JSToken.Native, "native", keyword);
  224.             keyword = new JSKeyword(JSToken.Null, "null", keyword);
  225.             keyword = new JSKeyword(JSToken.New, "new", keyword);
  226.             keywords['n' - 'a'] = keyword;
  227.             // p
  228.             keyword = new JSKeyword(JSToken.Protected, "protected");
  229.             keyword = new JSKeyword(JSToken.Private, "private", keyword);
  230.             keyword = new JSKeyword(JSToken.Package, "package", keyword);
  231.             keyword = new JSKeyword(JSToken.Public, "public", keyword);
  232.             keywords['p' - 'a'] = keyword;
  233.             // r
  234.             keyword = new JSKeyword(JSToken.Require, "require");
  235.             keyword = new JSKeyword(JSToken.Return, "return", keyword);
  236.             keywords['r' - 'a'] = keyword;
  237.             // s
  238.             keyword = new JSKeyword(JSToken.Synchronized, "synchronized");
  239.             keyword = new JSKeyword(JSToken.Switch, "switch", keyword);
  240.             keyword = new JSKeyword(JSToken.Static, "static", keyword);
  241.             keyword = new JSKeyword(JSToken.Super, "super", keyword);
  242.             keyword = new JSKeyword(JSToken.Short, "short", keyword);
  243.             keyword = new JSKeyword(JSToken.Set, "set", keyword);
  244.             keywords['s' - 'a'] = keyword;
  245.             // t
  246.             keyword = new JSKeyword(JSToken.Transient, "transient");
  247.             keyword = new JSKeyword(JSToken.Typeof, "typeof", keyword);
  248.             keyword = new JSKeyword(JSToken.Throws, "throws", keyword);
  249.             keyword = new JSKeyword(JSToken.Throw, "throw", keyword);
  250.             keyword = new JSKeyword(JSToken.True, "true", keyword);
  251.             keyword = new JSKeyword(JSToken.This, "this", keyword);
  252.             keyword = new JSKeyword(JSToken.Try, "try", keyword);
  253.             keywords['t' - 'a'] = keyword;
  254.             // v
  255.             keyword = new JSKeyword(JSToken.Volatile, "volatile");
  256.             keyword = new JSKeyword(JSToken.Void, "void", keyword);
  257.             keyword = new JSKeyword(JSToken.Var, "var", keyword);
  258.             keywords['v' - 'a'] = keyword;
  259.             // u
  260.             keyword = new JSKeyword(JSToken.Use, "use");
  261.             keywords['u' - 'a'] = keyword;
  262.             // w
  263.             keyword = new JSKeyword(JSToken.While, "while");
  264.             keyword = new JSKeyword(JSToken.With, "with", keyword);
  265.             keywords['w' - 'a'] = keyword;
  266.            
  267.             return keywords;
  268.         }
  269.        
  270.     }
  271. }

Developer Fusion