1package js
  2
  3import "strconv"
  4
  5// OpPrec is the operator precedence
  6type OpPrec int
  7
  8// OpPrec values.
  9const (
 10	OpExpr     OpPrec = iota // a,b
 11	OpAssign                 // a?b:c, yield x, ()=>x, async ()=>x, a=b, a+=b, ...
 12	OpCoalesce               // a??b
 13	OpOr                     // a||b
 14	OpAnd                    // a&&b
 15	OpBitOr                  // a|b
 16	OpBitXor                 // a^b
 17	OpBitAnd                 // a&b
 18	OpEquals                 // a==b, a!=b, a===b, a!==b
 19	OpCompare                // a<b, a>b, a<=b, a>=b, a instanceof b, a in b
 20	OpShift                  // a<<b, a>>b, a>>>b
 21	OpAdd                    // a+b, a-b
 22	OpMul                    // a*b, a/b, a%b
 23	OpExp                    // a**b
 24	OpUnary                  // ++x, --x, delete x, void x, typeof x, +x, -x, ~x, !x, await x
 25	OpUpdate                 // x++, x--
 26	OpLHS                    // CallExpr/OptChainExpr or NewExpr
 27	OpCall                   // a?.b, a(b), super(a), import(a)
 28	OpNew                    // new a
 29	OpMember                 // a[b], a.b, a`b`, super[x], super.x, new.target, import.meta, new a(b)
 30	OpPrimary                // literal, function, class, parenthesized
 31)
 32
 33func (prec OpPrec) String() string {
 34	switch prec {
 35	case OpExpr:
 36		return "OpExpr"
 37	case OpAssign:
 38		return "OpAssign"
 39	case OpCoalesce:
 40		return "OpCoalesce"
 41	case OpOr:
 42		return "OpOr"
 43	case OpAnd:
 44		return "OpAnd"
 45	case OpBitOr:
 46		return "OpBitOr"
 47	case OpBitXor:
 48		return "OpBitXor"
 49	case OpBitAnd:
 50		return "OpBitAnd"
 51	case OpEquals:
 52		return "OpEquals"
 53	case OpCompare:
 54		return "OpCompare"
 55	case OpShift:
 56		return "OpShift"
 57	case OpAdd:
 58		return "OAdd"
 59	case OpMul:
 60		return "OpMul"
 61	case OpExp:
 62		return "OpExp"
 63	case OpUnary:
 64		return "OpUnary"
 65	case OpUpdate:
 66		return "OpUpdate"
 67	case OpLHS:
 68		return "OpLHS"
 69	case OpCall:
 70		return "OpCall"
 71	case OpNew:
 72		return "OpNew"
 73	case OpMember:
 74		return "OpMember"
 75	case OpPrimary:
 76		return "OpPrimary"
 77	}
 78	return "Invalid(" + strconv.Itoa(int(prec)) + ")"
 79}
 80
 81// Keywords is a map of reserved, strict, and other keywords
 82var Keywords = map[string]TokenType{
 83	// reserved
 84	"await":      AwaitToken,
 85	"break":      BreakToken,
 86	"case":       CaseToken,
 87	"catch":      CatchToken,
 88	"class":      ClassToken,
 89	"const":      ConstToken,
 90	"continue":   ContinueToken,
 91	"debugger":   DebuggerToken,
 92	"default":    DefaultToken,
 93	"delete":     DeleteToken,
 94	"do":         DoToken,
 95	"else":       ElseToken,
 96	"enum":       EnumToken,
 97	"export":     ExportToken,
 98	"extends":    ExtendsToken,
 99	"false":      FalseToken,
100	"finally":    FinallyToken,
101	"for":        ForToken,
102	"function":   FunctionToken,
103	"if":         IfToken,
104	"import":     ImportToken,
105	"in":         InToken,
106	"instanceof": InstanceofToken,
107	"new":        NewToken,
108	"null":       NullToken,
109	"return":     ReturnToken,
110	"super":      SuperToken,
111	"switch":     SwitchToken,
112	"this":       ThisToken,
113	"throw":      ThrowToken,
114	"true":       TrueToken,
115	"try":        TryToken,
116	"typeof":     TypeofToken,
117	"var":        VarToken,
118	"void":       VoidToken,
119	"while":      WhileToken,
120	"with":       WithToken,
121	"yield":      YieldToken,
122
123	// strict mode
124	"let":        LetToken,
125	"static":     StaticToken,
126	"implements": ImplementsToken,
127	"interface":  InterfaceToken,
128	"package":    PackageToken,
129	"private":    PrivateToken,
130	"protected":  ProtectedToken,
131	"public":     PublicToken,
132
133	// extra
134	"as":     AsToken,
135	"async":  AsyncToken,
136	"from":   FromToken,
137	"get":    GetToken,
138	"meta":   MetaToken,
139	"of":     OfToken,
140	"set":    SetToken,
141	"target": TargetToken,
142}