...
1
2 package token
3
4 import (
5 "strconv"
6 )
7
8
9 type Token int
10
11
12
13
14
15
16 func (tkn Token) String() string {
17 if tkn == 0 {
18 return "UNKNOWN"
19 }
20 if tkn < Token(len(token2string)) {
21 return token2string[tkn]
22 }
23 return "token(" + strconv.Itoa(int(tkn)) + ")"
24 }
25
26
27 func (tkn Token) precedence(in bool) int {
28
29 switch tkn {
30 case LOGICAL_OR:
31 return 1
32
33 case LOGICAL_AND:
34 return 2
35
36 case OR, OR_ASSIGN:
37 return 3
38
39 case EXCLUSIVE_OR:
40 return 4
41
42 case AND, AND_ASSIGN:
43 return 5
44
45 case EQUAL,
46 NOT_EQUAL,
47 STRICT_EQUAL,
48 STRICT_NOT_EQUAL:
49 return 6
50
51 case LESS, GREATER, LESS_OR_EQUAL, GREATER_OR_EQUAL, INSTANCEOF:
52 return 7
53
54 case IN:
55 if in {
56 return 7
57 }
58 return 0
59
60 case SHIFT_LEFT, SHIFT_RIGHT, UNSIGNED_SHIFT_RIGHT:
61 fallthrough
62 case SHIFT_LEFT_ASSIGN, SHIFT_RIGHT_ASSIGN, UNSIGNED_SHIFT_RIGHT_ASSIGN:
63 return 8
64
65 case PLUS, MINUS, ADD_ASSIGN, SUBTRACT_ASSIGN:
66 return 9
67
68 case MULTIPLY, SLASH, REMAINDER, MULTIPLY_ASSIGN, QUOTIENT_ASSIGN, REMAINDER_ASSIGN:
69 return 11
70 }
71 return 0
72 }
73
74 type _keyword struct {
75 token Token
76 futureKeyword bool
77 strict bool
78 }
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 func IsKeyword(literal string) (Token, bool) {
107 if keyword, exists := keywordTable[literal]; exists {
108 if keyword.futureKeyword {
109 return KEYWORD, keyword.strict
110 }
111 return keyword.token, false
112 }
113 return 0, false
114 }
115
116 func IsId(tkn Token) bool {
117 return tkn >= IDENTIFIER
118 }
119
120 func IsUnreservedWord(tkn Token) bool {
121 return tkn > ESCAPED_RESERVED_WORD
122 }
123
View as plain text