kwd-lsc.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #ifndef KEYWORD
  6. #define KEYWORD(tk,f,prec2,nop2,prec1,nop1,name)
  7. #endif //!KEYWORD
  8. #ifndef S_KEYWORD
  9. #define S_KEYWORD(name,f,lab)
  10. #endif //!S_KEYWORD
  11. // token reserved word? (see fidXXX values in enum, in hash.h)
  12. // binary operator precedence
  13. // binary operator
  14. // unary operator precedence
  15. // unary operator
  16. // name
  17. KEYWORD(tkABSTRACT ,0, No, knopNone , No, knopNone , abstract)
  18. KEYWORD(tkASSERT ,0, No, knopNone , No, knopNone , assert)
  19. KEYWORD(tkAWAIT ,1, No, knopNone ,Uni, knopAwait , await)
  20. KEYWORD(tkBOOLEAN ,0, No, knopNone , No, knopNone , boolean)
  21. KEYWORD(tkBREAK ,1, No, knopNone , No, knopNone , break)
  22. KEYWORD(tkBYTE ,0, No, knopNone , No, knopNone , byte)
  23. KEYWORD(tkCASE ,1, No, knopNone , No, knopNone , case)
  24. KEYWORD(tkCATCH ,1, No, knopNone , No, knopNone , catch)
  25. KEYWORD(tkCHAR ,0, No, knopNone , No, knopNone , char)
  26. KEYWORD(tkCONTINUE ,1, No, knopNone , No, knopNone , continue)
  27. KEYWORD(tkDEBUGGER ,1, No, knopNone , No, knopNone , debugger)
  28. KEYWORD(tkDECIMAL ,0, No, knopNone , No, knopNone , decimal)
  29. KEYWORD(tkDEFAULT ,1, No, knopNone , No, knopNone , default)
  30. KEYWORD(tkDELETE ,1, No, knopNone ,Uni, knopDelete , delete)
  31. KEYWORD(tkDO ,1, No, knopNone , No, knopNone , do)
  32. KEYWORD(tkDOUBLE ,0, No, knopNone , No, knopNone , double)
  33. KEYWORD(tkELSE ,1, No, knopNone , No, knopNone , else)
  34. KEYWORD(tkENSURE ,0, No, knopNone , No, knopNone , ensure)
  35. KEYWORD(tkEVENT ,0, No, knopNone , No, knopNone , event)
  36. KEYWORD(tkFALSE ,1, No, knopNone , No, knopNone , false)
  37. KEYWORD(tkFINAL ,0, No, knopNone , No, knopNone , final)
  38. KEYWORD(tkFINALLY ,1, No, knopNone , No, knopNone , finally)
  39. KEYWORD(tkFLOAT ,0, No, knopNone , No, knopNone , float)
  40. KEYWORD(tkFOR ,1, No, knopNone , No, knopNone , for)
  41. KEYWORD(tkFUNCTION ,1, No, knopNone , No, knopNone , function)
  42. KEYWORD(tkGET ,0, No, knopNone , No, knopNone , get)
  43. KEYWORD(tkGOTO ,0, No, knopNone , No, knopNone , goto)
  44. KEYWORD(tkIF ,1, No, knopNone , No, knopNone , if)
  45. KEYWORD(tkIN ,1, Cmp, knopIn , No, knopNone , in)
  46. KEYWORD(tkINSTANCEOF ,1, Cmp,knopInstOf , No, knopNone , instanceof)
  47. KEYWORD(tkINT ,0, No, knopNone , No, knopNone , int)
  48. KEYWORD(tkINTERNAL ,0, No, knopNone , No, knopNone , internal)
  49. KEYWORD(tkINVARIANT ,0, No, knopNone , No, knopNone , invariant)
  50. KEYWORD(tkLONG ,0, No, knopNone , No, knopNone , long)
  51. KEYWORD(tkNAMESPACE ,0, No, knopNone , No, knopNone , namespace)
  52. KEYWORD(tkNATIVE ,0, No, knopNone , No, knopNone , native)
  53. KEYWORD(tkNEW ,1, No, knopNone , No, knopNone , new)
  54. KEYWORD(tkNULL ,1, No, knopNone , No, knopNone , null)
  55. KEYWORD(tkREQUIRE ,0, No, knopNone , No, knopNone , require)
  56. KEYWORD(tkRETURN ,1, No, knopNone , No, knopNone , return)
  57. KEYWORD(tkSBYTE ,0, No, knopNone , No, knopNone , sbyte)
  58. KEYWORD(tkSET ,0, No, knopNone , No, knopNone , set)
  59. KEYWORD(tkSHORT ,0, No, knopNone , No, knopNone , short)
  60. KEYWORD(tkSWITCH ,1, No, knopNone , No, knopNone , switch)
  61. KEYWORD(tkSYNCHRONIZED,0, No, knopNone , No, knopNone , synchronized)
  62. KEYWORD(tkTHIS ,1, No, knopNone , No, knopNone , this)
  63. KEYWORD(tkTHROW ,1, No, knopNone , No, knopNone , throw)
  64. KEYWORD(tkTHROWS ,0, No, knopNone , No, knopNone , throws)
  65. KEYWORD(tkTRANSIENT ,0, No, knopNone , No, knopNone , transient)
  66. KEYWORD(tkTRUE ,1, No, knopNone , No, knopNone , true)
  67. KEYWORD(tkTRY ,1, No, knopNone , No, knopNone , try)
  68. KEYWORD(tkTYPEOF ,1, No, knopNone ,Uni, knopTypeof , typeof)
  69. KEYWORD(tkUINT ,0, No, knopNone , No, knopNone , uint)
  70. KEYWORD(tkULONG ,0, No, knopNone , No, knopNone , ulong)
  71. KEYWORD(tkUSE ,0, No, knopNone , No, knopNone , use)
  72. KEYWORD(tkUSHORT ,0, No, knopNone , No, knopNone , ushort)
  73. KEYWORD(tkVAR ,1, No, knopNone , No, knopNone , var)
  74. KEYWORD(tkVOID ,1, No, knopNone ,Uni, knopVoid , void)
  75. KEYWORD(tkVOLATILE ,0, No, knopNone , No, knopNone , volatile)
  76. KEYWORD(tkWHILE ,1, No, knopNone , No, knopNone , while)
  77. KEYWORD(tkWITH ,1, No, knopNone , No, knopNone , with)
  78. // Future reserved words that become keywords in ES6
  79. KEYWORD(tkCLASS ,1, No, knopNone , No, knopNone , class)
  80. KEYWORD(tkCONST ,1, No, knopNone , No, knopNone , const)
  81. KEYWORD(tkEXPORT ,1, No, knopNone , No, knopNone , export)
  82. KEYWORD(tkEXTENDS ,1, No, knopNone , No, knopNone , extends)
  83. KEYWORD(tkIMPORT ,1, No, knopNone , No, knopNone , import)
  84. KEYWORD(tkSUPER ,1, No, knopNone , No, knopNone , super)
  85. // Note: yield is still treated as an identifier in non-strict, non-generator functions
  86. // and is special cased in jsscan.js when generating kwd-swtch.h
  87. // Note: yield is a weird operator in that it has assignment expression level precedence
  88. // but looks like a unary operator
  89. KEYWORD(tkYIELD ,1, No, knopNone ,Asg, knopYield , yield)
  90. // Future reserved words in strict and non-strict modes
  91. KEYWORD(tkENUM ,1, No, knopNone , No, knopNone , enum)
  92. // Additional future reserved words in strict mode
  93. KEYWORD(tkIMPLEMENTS ,2, No, knopNone , No, knopNone , implements)
  94. KEYWORD(tkINTERFACE ,2, No, knopNone , No, knopNone , interface)
  95. KEYWORD(tkLET ,2, No, knopNone , No, knopNone , let)
  96. KEYWORD(tkPACKAGE ,2, No, knopNone , No, knopNone , package)
  97. KEYWORD(tkPRIVATE ,2, No, knopNone , No, knopNone , private)
  98. KEYWORD(tkPROTECTED ,2, No, knopNone , No, knopNone , protected)
  99. KEYWORD(tkPUBLIC ,2, No, knopNone , No, knopNone , public)
  100. KEYWORD(tkSTATIC ,2, No, knopNone , No, knopNone , static)
  101. S_KEYWORD(LEval ,3, eval)
  102. S_KEYWORD(LArguments ,3, arguments)
  103. S_KEYWORD(LTarget ,3, target)
  104. #undef KEYWORD
  105. #ifndef TOK_DCL
  106. #define TOK_DCL(tk,prec2,nop2,prec1,nop1)
  107. #endif //!TOK_DCL
  108. // The identifier token must follow the last identifier keyword
  109. TOK_DCL(tkID , No, knopNone , No, knopNone)
  110. // Non-operator non-identifier tokens
  111. TOK_DCL(tkSColon , No, knopNone , No, knopNone ) // ;
  112. TOK_DCL(tkRParen , No, knopNone , No, knopNone ) // )
  113. TOK_DCL(tkRBrack , No, knopNone , No, knopNone ) // ]
  114. TOK_DCL(tkLCurly , No, knopNone , No, knopNone ) // {
  115. TOK_DCL(tkRCurly , No, knopNone , No, knopNone ) // }
  116. // Operator non-identifier tokens
  117. TOK_DCL(tkComma ,Cma, knopComma , No, knopNone ) // ,
  118. TOK_DCL(tkDArrow ,Asg, knopFncDecl, No, knopNone ) // =>
  119. TOK_DCL(tkAsg ,Asg, knopAsg , No, knopNone ) // =
  120. TOK_DCL(tkAsgAdd ,Asg, knopAsgAdd , No, knopNone ) // +=
  121. TOK_DCL(tkAsgSub ,Asg, knopAsgSub , No, knopNone ) // -=
  122. TOK_DCL(tkAsgMul ,Asg, knopAsgMul , No, knopNone ) // *=
  123. TOK_DCL(tkAsgDiv ,Asg, knopAsgDiv , No, knopNone ) // /=
  124. TOK_DCL(tkAsgExpo ,Asg, knopAsgExpo, No, knopNone ) // **=
  125. TOK_DCL(tkAsgMod ,Asg, knopAsgMod , No, knopNone ) // %=
  126. TOK_DCL(tkAsgAnd ,Asg, knopAsgAnd , No, knopNone ) // &=
  127. TOK_DCL(tkAsgXor ,Asg, knopAsgXor , No, knopNone ) // ^=
  128. TOK_DCL(tkAsgOr ,Asg, knopAsgOr , No, knopNone ) // |=
  129. TOK_DCL(tkAsgLsh ,Asg, knopAsgLsh , No, knopNone ) // <<=
  130. TOK_DCL(tkAsgRsh ,Asg, knopAsgRsh , No, knopNone ) // >>=
  131. TOK_DCL(tkAsgRs2 ,Asg, knopAsgRs2 , No, knopNone ) // >>>=
  132. TOK_DCL(tkQMark ,Que, knopQmark , No, knopNone ) // ?
  133. TOK_DCL(tkColon , No, knopNone , No, knopNone ) // :
  134. TOK_DCL(tkLogOr ,Lor, knopLogOr , No, knopNone ) // ||
  135. TOK_DCL(tkLogAnd ,Lan, knopLogAnd , No, knopNone ) // &&
  136. TOK_DCL(tkOr ,Bor, knopOr , No, knopNone ) // |
  137. TOK_DCL(tkXor ,Xor, knopXor , No, knopNone ) // ^
  138. TOK_DCL(tkAnd ,Ban, knopAnd , No, knopNone ) // &
  139. TOK_DCL(tkEQ ,Equ, knopEq , No, knopNone ) // ==
  140. TOK_DCL(tkNE ,Equ, knopNe , No, knopNone ) // !=
  141. TOK_DCL(tkEqv ,Equ, knopEqv , No, knopNone ) // ===
  142. TOK_DCL(tkNEqv ,Equ, knopNEqv , No, knopNone ) // !==
  143. TOK_DCL(tkLT ,Cmp, knopLt , No, knopNone ) // <
  144. TOK_DCL(tkLE ,Cmp, knopLe , No, knopNone ) // <=
  145. TOK_DCL(tkGT ,Cmp, knopGt , No, knopNone ) // >
  146. TOK_DCL(tkGE ,Cmp, knopGe , No, knopNone ) // >=
  147. TOK_DCL(tkLsh ,Shf, knopLsh , No, knopNone ) // <<
  148. TOK_DCL(tkRsh ,Shf, knopRsh , No, knopNone ) // >>
  149. TOK_DCL(tkRs2 ,Shf, knopRs2 , No, knopNone ) // >>>
  150. TOK_DCL(tkAdd ,Add, knopAdd ,Uni, knopPos ) // +
  151. TOK_DCL(tkSub ,Add, knopSub ,Uni, knopNeg ) // -
  152. TOK_DCL(tkExpo ,Expo, knopExpo , No, knopNone ) // **
  153. TOK_DCL(tkStar ,Mul, knopMul , No, knopNone ) // *
  154. TOK_DCL(tkDiv ,Mul, knopDiv , No, knopNone ) // /
  155. TOK_DCL(tkPct ,Mul, knopMod , No, knopNone ) // %
  156. TOK_DCL(tkTilde , No, knopNone ,Uni, knopNot ) // ~
  157. TOK_DCL(tkBang , No, knopNone ,Uni, knopLogNot ) // !
  158. TOK_DCL(tkInc , No, knopNone ,Uni, knopIncPre ) // ++
  159. TOK_DCL(tkDec , No, knopNone ,Uni, knopDecPre ) // --
  160. TOK_DCL(tkEllipsis , No, knopNone ,Spr, knopEllipsis ) // ...
  161. TOK_DCL(tkLParen , No, knopNone , No, knopNone ) // (
  162. TOK_DCL(tkLBrack , No, knopNone , No, knopNone ) // [
  163. TOK_DCL(tkDot , No, knopNone , No, knopNone ) // .
  164. // String template tokens
  165. TOK_DCL(tkStrTmplBasic , No, knopNone , No, knopNone ) // `...`
  166. TOK_DCL(tkStrTmplBegin , No, knopNone , No, knopNone ) // `...${
  167. TOK_DCL(tkStrTmplMid , No, knopNone , No, knopNone ) // }...${ Note: tkStrTmplMid and tkStrTmplEnd tokens do not actually contain the opening '}' character.
  168. TOK_DCL(tkStrTmplEnd , No, knopNone , No, knopNone ) // }...` Since the scanner can't disambiguate a tkRCurly which is part of the expression, literal, or string template syntax
  169. // we check to make sure the token after parsing the expression is a tkRCurly and put the scanner into a string template
  170. // scanning mode which will scan the string literal and search for the closing '${' or '`'.
  171. TOK_DCL(tkComment , No, knopNone, No, knopNone ) // Comment for syntax coloring
  172. TOK_DCL(tkScanError , No, knopNone, No, knopNone ) // Error in syntax coloring
  173. #undef TOK_DCL