blob: c8de57c0333973370ffa4f847da6688b997610a5 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#ifndef KEYWORD
#define KEYWORD(tk,f,prec2,nop2,prec1,nop1,name)
#endif //!KEYWORD
#ifndef S_KEYWORD
#define S_KEYWORD(name,f,lab)
#endif //!S_KEYWORD
// token reserved word? (see fidXXX values in enum, in hash.h)
// binary operator precedence
// binary operator
// unary operator precedence
// unary operator
// name
KEYWORD(tkABSTRACT ,0, No, knopNone , No, knopNone , abstract)
KEYWORD(tkASSERT ,0, No, knopNone , No, knopNone , assert)
KEYWORD(tkAWAIT ,1, No, knopNone ,Uni, knopAwait , await)
KEYWORD(tkBOOLEAN ,0, No, knopNone , No, knopNone , boolean)
KEYWORD(tkBREAK ,1, No, knopNone , No, knopNone , break)
KEYWORD(tkBYTE ,0, No, knopNone , No, knopNone , byte)
KEYWORD(tkCASE ,1, No, knopNone , No, knopNone , case)
KEYWORD(tkCATCH ,1, No, knopNone , No, knopNone , catch)
KEYWORD(tkCHAR ,0, No, knopNone , No, knopNone , char)
KEYWORD(tkCONTINUE ,1, No, knopNone , No, knopNone , continue)
KEYWORD(tkDEBUGGER ,1, No, knopNone , No, knopNone , debugger)
KEYWORD(tkDECIMAL ,0, No, knopNone , No, knopNone , decimal)
KEYWORD(tkDEFAULT ,1, No, knopNone , No, knopNone , default)
KEYWORD(tkDELETE ,1, No, knopNone ,Uni, knopDelete , delete)
KEYWORD(tkDO ,1, No, knopNone , No, knopNone , do)
KEYWORD(tkDOUBLE ,0, No, knopNone , No, knopNone , double)
KEYWORD(tkELSE ,1, No, knopNone , No, knopNone , else)
KEYWORD(tkENSURE ,0, No, knopNone , No, knopNone , ensure)
KEYWORD(tkEVENT ,0, No, knopNone , No, knopNone , event)
KEYWORD(tkFALSE ,1, No, knopNone , No, knopNone , false)
KEYWORD(tkFINAL ,0, No, knopNone , No, knopNone , final)
KEYWORD(tkFINALLY ,1, No, knopNone , No, knopNone , finally)
KEYWORD(tkFLOAT ,0, No, knopNone , No, knopNone , float)
KEYWORD(tkFOR ,1, No, knopNone , No, knopNone , for)
KEYWORD(tkFUNCTION ,1, No, knopNone , No, knopNone , function)
KEYWORD(tkGET ,0, No, knopNone , No, knopNone , get)
KEYWORD(tkGOTO ,0, No, knopNone , No, knopNone , goto)
KEYWORD(tkIF ,1, No, knopNone , No, knopNone , if)
KEYWORD(tkIN ,1, Cmp, knopIn , No, knopNone , in)
KEYWORD(tkINSTANCEOF ,1, Cmp,knopInstOf , No, knopNone , instanceof)
KEYWORD(tkINT ,0, No, knopNone , No, knopNone , int)
KEYWORD(tkINTERNAL ,0, No, knopNone , No, knopNone , internal)
KEYWORD(tkINVARIANT ,0, No, knopNone , No, knopNone , invariant)
KEYWORD(tkLONG ,0, No, knopNone , No, knopNone , long)
KEYWORD(tkNAMESPACE ,0, No, knopNone , No, knopNone , namespace)
KEYWORD(tkNATIVE ,0, No, knopNone , No, knopNone , native)
KEYWORD(tkNEW ,1, No, knopNone , No, knopNone , new)
KEYWORD(tkNULL ,1, No, knopNone , No, knopNone , null)
KEYWORD(tkREQUIRE ,0, No, knopNone , No, knopNone , require)
KEYWORD(tkRETURN ,1, No, knopNone , No, knopNone , return)
KEYWORD(tkSBYTE ,0, No, knopNone , No, knopNone , sbyte)
KEYWORD(tkSET ,0, No, knopNone , No, knopNone , set)
KEYWORD(tkSHORT ,0, No, knopNone , No, knopNone , short)
KEYWORD(tkSWITCH ,1, No, knopNone , No, knopNone , switch)
KEYWORD(tkSYNCHRONIZED,0, No, knopNone , No, knopNone , synchronized)
KEYWORD(tkTHIS ,1, No, knopNone , No, knopNone , this)
KEYWORD(tkTHROW ,1, No, knopNone , No, knopNone , throw)
KEYWORD(tkTHROWS ,0, No, knopNone , No, knopNone , throws)
KEYWORD(tkTRANSIENT ,0, No, knopNone , No, knopNone , transient)
KEYWORD(tkTRUE ,1, No, knopNone , No, knopNone , true)
KEYWORD(tkTRY ,1, No, knopNone , No, knopNone , try)
KEYWORD(tkTYPEOF ,1, No, knopNone ,Uni, knopTypeof , typeof)
KEYWORD(tkUINT ,0, No, knopNone , No, knopNone , uint)
KEYWORD(tkULONG ,0, No, knopNone , No, knopNone , ulong)
KEYWORD(tkUSE ,0, No, knopNone , No, knopNone , use)
KEYWORD(tkUSHORT ,0, No, knopNone , No, knopNone , ushort)
KEYWORD(tkVAR ,1, No, knopNone , No, knopNone , var)
KEYWORD(tkVOID ,1, No, knopNone ,Uni, knopVoid , void)
KEYWORD(tkVOLATILE ,0, No, knopNone , No, knopNone , volatile)
KEYWORD(tkWHILE ,1, No, knopNone , No, knopNone , while)
KEYWORD(tkWITH ,1, No, knopNone , No, knopNone , with)
// Future reserved words that become keywords in ES6
KEYWORD(tkCLASS ,1, No, knopNone , No, knopNone , class)
KEYWORD(tkCONST ,1, No, knopNone , No, knopNone , const)
KEYWORD(tkEXPORT ,1, No, knopNone , No, knopNone , export)
KEYWORD(tkEXTENDS ,1, No, knopNone , No, knopNone , extends)
KEYWORD(tkIMPORT ,1, No, knopNone , No, knopNone , import)
KEYWORD(tkSUPER ,1, No, knopNone , No, knopNone , super)
// Note: yield is still treated as an identifier in non-strict, non-generator functions
// and is special cased in jsscan.js when generating kwd-swtch.h
// Note: yield is a weird operator in that it has assignment expression level precedence
// but looks like a unary operator
KEYWORD(tkYIELD ,1, No, knopNone ,Asg, knopYield , yield)
// Future reserved words in strict and non-strict modes
KEYWORD(tkENUM ,1, No, knopNone , No, knopNone , enum)
// Additional future reserved words in strict mode
KEYWORD(tkIMPLEMENTS ,2, No, knopNone , No, knopNone , implements)
KEYWORD(tkINTERFACE ,2, No, knopNone , No, knopNone , interface)
KEYWORD(tkLET ,2, No, knopNone , No, knopNone , let)
KEYWORD(tkPACKAGE ,2, No, knopNone , No, knopNone , package)
KEYWORD(tkPRIVATE ,2, No, knopNone , No, knopNone , private)
KEYWORD(tkPROTECTED ,2, No, knopNone , No, knopNone , protected)
KEYWORD(tkPUBLIC ,2, No, knopNone , No, knopNone , public)
KEYWORD(tkSTATIC ,2, No, knopNone , No, knopNone , static)
S_KEYWORD(LEval ,3, eval)
S_KEYWORD(LArguments ,3, arguments)
S_KEYWORD(LTarget ,3, target)
#undef KEYWORD
#ifndef TOK_DCL
#define TOK_DCL(tk,prec2,nop2,prec1,nop1)
#endif //!TOK_DCL
// The identifier token must follow the last identifier keyword
TOK_DCL(tkID , No, knopNone , No, knopNone)
// Non-operator non-identifier tokens
TOK_DCL(tkSColon , No, knopNone , No, knopNone ) // ;
TOK_DCL(tkRParen , No, knopNone , No, knopNone ) // )
TOK_DCL(tkRBrack , No, knopNone , No, knopNone ) // ]
TOK_DCL(tkLCurly , No, knopNone , No, knopNone ) // {
TOK_DCL(tkRCurly , No, knopNone , No, knopNone ) // }
// Operator non-identifier tokens
TOK_DCL(tkComma ,Cma, knopComma , No, knopNone ) // ,
TOK_DCL(tkDArrow ,Asg, knopFncDecl, No, knopNone ) // =>
TOK_DCL(tkAsg ,Asg, knopAsg , No, knopNone ) // =
TOK_DCL(tkAsgAdd ,Asg, knopAsgAdd , No, knopNone ) // +=
TOK_DCL(tkAsgSub ,Asg, knopAsgSub , No, knopNone ) // -=
TOK_DCL(tkAsgMul ,Asg, knopAsgMul , No, knopNone ) // *=
TOK_DCL(tkAsgDiv ,Asg, knopAsgDiv , No, knopNone ) // /=
TOK_DCL(tkAsgExpo ,Asg, knopAsgExpo, No, knopNone ) // **=
TOK_DCL(tkAsgMod ,Asg, knopAsgMod , No, knopNone ) // %=
TOK_DCL(tkAsgAnd ,Asg, knopAsgAnd , No, knopNone ) // &=
TOK_DCL(tkAsgXor ,Asg, knopAsgXor , No, knopNone ) // ^=
TOK_DCL(tkAsgOr ,Asg, knopAsgOr , No, knopNone ) // |=
TOK_DCL(tkAsgLsh ,Asg, knopAsgLsh , No, knopNone ) // <<=
TOK_DCL(tkAsgRsh ,Asg, knopAsgRsh , No, knopNone ) // >>=
TOK_DCL(tkAsgRs2 ,Asg, knopAsgRs2 , No, knopNone ) // >>>=
TOK_DCL(tkQMark ,Que, knopQmark , No, knopNone ) // ?
TOK_DCL(tkColon , No, knopNone , No, knopNone ) // :
TOK_DCL(tkLogOr ,Lor, knopLogOr , No, knopNone ) // ||
TOK_DCL(tkLogAnd ,Lan, knopLogAnd , No, knopNone ) // &&
TOK_DCL(tkOr ,Bor, knopOr , No, knopNone ) // |
TOK_DCL(tkXor ,Xor, knopXor , No, knopNone ) // ^
TOK_DCL(tkAnd ,Ban, knopAnd , No, knopNone ) // &
TOK_DCL(tkEQ ,Equ, knopEq , No, knopNone ) // ==
TOK_DCL(tkNE ,Equ, knopNe , No, knopNone ) // !=
TOK_DCL(tkEqv ,Equ, knopEqv , No, knopNone ) // ===
TOK_DCL(tkNEqv ,Equ, knopNEqv , No, knopNone ) // !==
TOK_DCL(tkLT ,Cmp, knopLt , No, knopNone ) // <
TOK_DCL(tkLE ,Cmp, knopLe , No, knopNone ) // <=
TOK_DCL(tkGT ,Cmp, knopGt , No, knopNone ) // >
TOK_DCL(tkGE ,Cmp, knopGe , No, knopNone ) // >=
TOK_DCL(tkLsh ,Shf, knopLsh , No, knopNone ) // <<
TOK_DCL(tkRsh ,Shf, knopRsh , No, knopNone ) // >>
TOK_DCL(tkRs2 ,Shf, knopRs2 , No, knopNone ) // >>>
TOK_DCL(tkAdd ,Add, knopAdd ,Uni, knopPos ) // +
TOK_DCL(tkSub ,Add, knopSub ,Uni, knopNeg ) // -
TOK_DCL(tkExpo ,Expo, knopExpo , No, knopNone ) // **
TOK_DCL(tkStar ,Mul, knopMul , No, knopNone ) // *
TOK_DCL(tkDiv ,Mul, knopDiv , No, knopNone ) // /
TOK_DCL(tkPct ,Mul, knopMod , No, knopNone ) // %
TOK_DCL(tkTilde , No, knopNone ,Uni, knopNot ) // ~
TOK_DCL(tkBang , No, knopNone ,Uni, knopLogNot ) // !
TOK_DCL(tkInc , No, knopNone ,Uni, knopIncPre ) // ++
TOK_DCL(tkDec , No, knopNone ,Uni, knopDecPre ) // --
TOK_DCL(tkEllipsis , No, knopNone ,Spr, knopEllipsis ) // ...
TOK_DCL(tkLParen , No, knopNone , No, knopNone ) // (
TOK_DCL(tkLBrack , No, knopNone , No, knopNone ) // [
TOK_DCL(tkDot , No, knopNone , No, knopNone ) // .
// String template tokens
TOK_DCL(tkStrTmplBasic , No, knopNone , No, knopNone ) // `...`
TOK_DCL(tkStrTmplBegin , No, knopNone , No, knopNone ) // `...${
TOK_DCL(tkStrTmplMid , No, knopNone , No, knopNone ) // }...${ Note: tkStrTmplMid and tkStrTmplEnd tokens do not actually contain the opening '}' character.
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
// we check to make sure the token after parsing the expression is a tkRCurly and put the scanner into a string template
// scanning mode which will scan the string literal and search for the closing '${' or '`'.
TOK_DCL(tkComment , No, knopNone, No, knopNone ) // Comment for syntax coloring
TOK_DCL(tkScanError , No, knopNone, No, knopNone ) // Error in syntax coloring
#undef TOK_DCL