github.com/MangoDowner/go-gm@v0.0.0-20180818020936-8baa2bd4408c/src/go/token/token.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package token defines constants representing the lexical tokens of the Go 6 // programming language and basic operations on tokens (printing, predicates). 7 // 8 package token 9 10 import "strconv" 11 12 // Token is the set of lexical tokens of the Go programming language. 13 type Token int 14 15 // The list of tokens. 16 const ( 17 // Special tokens 18 ILLEGAL Token = iota 19 EOF 20 COMMENT 21 22 literal_beg 23 // Identifiers and basic type literals 24 // (these tokens stand for classes of literals) 25 IDENT // main 26 INT // 12345 27 FLOAT // 123.45 28 IMAG // 123.45i 29 CHAR // 'a' 30 STRING // "abc" 31 literal_end 32 33 operator_beg 34 // Operators and delimiters 35 ADD // + 36 SUB // - 37 MUL // * 38 QUO // / 39 REM // % 40 41 AND // & 42 OR // | 43 XOR // ^ 44 SHL // << 45 SHR // >> 46 AND_NOT // &^ 47 48 ADD_ASSIGN // += 49 SUB_ASSIGN // -= 50 MUL_ASSIGN // *= 51 QUO_ASSIGN // /= 52 REM_ASSIGN // %= 53 54 AND_ASSIGN // &= 55 OR_ASSIGN // |= 56 XOR_ASSIGN // ^= 57 SHL_ASSIGN // <<= 58 SHR_ASSIGN // >>= 59 AND_NOT_ASSIGN // &^= 60 61 LAND // && 62 LOR // || 63 ARROW // <- 64 INC // ++ 65 DEC // -- 66 67 EQL // == 68 LSS // < 69 GTR // > 70 ASSIGN // = 71 NOT // ! 72 73 NEQ // != 74 LEQ // <= 75 GEQ // >= 76 DEFINE // := 77 ELLIPSIS // ... 78 79 LPAREN // ( 80 LBRACK // [ 81 LBRACE // { 82 COMMA // , 83 PERIOD // . 84 85 RPAREN // ) 86 RBRACK // ] 87 RBRACE // } 88 SEMICOLON // ; 89 COLON // : 90 operator_end 91 92 keyword_beg 93 // Keywords 94 BREAK 95 CASE 96 CHAN 97 CONST 98 CONTINUE 99 100 DEFAULT 101 DEFER 102 ELSE 103 FALLTHROUGH 104 FOR 105 106 FUNC 107 GO 108 GOTO 109 IF 110 IMPORT 111 112 INTERFACE 113 MAP 114 PACKAGE 115 RANGE 116 RETURN 117 118 SELECT 119 STRUCT 120 SWITCH 121 TYPE 122 VAR 123 keyword_end 124 ) 125 126 var tokens = [...]string{ 127 ILLEGAL: "ILLEGAL", 128 129 EOF: "EOF", 130 COMMENT: "COMMENT", 131 132 IDENT: "IDENT", 133 INT: "INT", 134 FLOAT: "FLOAT", 135 IMAG: "IMAG", 136 CHAR: "CHAR", 137 STRING: "STRING", 138 139 ADD: "+", 140 SUB: "-", 141 MUL: "*", 142 QUO: "/", 143 REM: "%", 144 145 AND: "&", 146 OR: "|", 147 XOR: "^", 148 SHL: "<<", 149 SHR: ">>", 150 AND_NOT: "&^", 151 152 ADD_ASSIGN: "+=", 153 SUB_ASSIGN: "-=", 154 MUL_ASSIGN: "*=", 155 QUO_ASSIGN: "/=", 156 REM_ASSIGN: "%=", 157 158 AND_ASSIGN: "&=", 159 OR_ASSIGN: "|=", 160 XOR_ASSIGN: "^=", 161 SHL_ASSIGN: "<<=", 162 SHR_ASSIGN: ">>=", 163 AND_NOT_ASSIGN: "&^=", 164 165 LAND: "&&", 166 LOR: "||", 167 ARROW: "<-", 168 INC: "++", 169 DEC: "--", 170 171 EQL: "==", 172 LSS: "<", 173 GTR: ">", 174 ASSIGN: "=", 175 NOT: "!", 176 177 NEQ: "!=", 178 LEQ: "<=", 179 GEQ: ">=", 180 DEFINE: ":=", 181 ELLIPSIS: "...", 182 183 LPAREN: "(", 184 LBRACK: "[", 185 LBRACE: "{", 186 COMMA: ",", 187 PERIOD: ".", 188 189 RPAREN: ")", 190 RBRACK: "]", 191 RBRACE: "}", 192 SEMICOLON: ";", 193 COLON: ":", 194 195 BREAK: "break", 196 CASE: "case", 197 CHAN: "chan", 198 CONST: "const", 199 CONTINUE: "continue", 200 201 DEFAULT: "default", 202 DEFER: "defer", 203 ELSE: "else", 204 FALLTHROUGH: "fallthrough", 205 FOR: "for", 206 207 FUNC: "func", 208 GO: "go", 209 GOTO: "goto", 210 IF: "if", 211 IMPORT: "import", 212 213 INTERFACE: "interface", 214 MAP: "map", 215 PACKAGE: "package", 216 RANGE: "range", 217 RETURN: "return", 218 219 SELECT: "select", 220 STRUCT: "struct", 221 SWITCH: "switch", 222 TYPE: "type", 223 VAR: "var", 224 } 225 226 // String returns the string corresponding to the token tok. 227 // For operators, delimiters, and keywords the string is the actual 228 // token character sequence (e.g., for the token ADD, the string is 229 // "+"). For all other tokens the string corresponds to the token 230 // constant name (e.g. for the token IDENT, the string is "IDENT"). 231 // 232 func (tok Token) String() string { 233 s := "" 234 if 0 <= tok && tok < Token(len(tokens)) { 235 s = tokens[tok] 236 } 237 if s == "" { 238 s = "token(" + strconv.Itoa(int(tok)) + ")" 239 } 240 return s 241 } 242 243 // A set of constants for precedence-based expression parsing. 244 // Non-operators have lowest precedence, followed by operators 245 // starting with precedence 1 up to unary operators. The highest 246 // precedence serves as "catch-all" precedence for selector, 247 // indexing, and other operator and delimiter tokens. 248 // 249 const ( 250 LowestPrec = 0 // non-operators 251 UnaryPrec = 6 252 HighestPrec = 7 253 ) 254 255 // Precedence returns the operator precedence of the binary 256 // operator op. If op is not a binary operator, the result 257 // is LowestPrecedence. 258 // 259 func (op Token) Precedence() int { 260 switch op { 261 case LOR: 262 return 1 263 case LAND: 264 return 2 265 case EQL, NEQ, LSS, LEQ, GTR, GEQ: 266 return 3 267 case ADD, SUB, OR, XOR: 268 return 4 269 case MUL, QUO, REM, SHL, SHR, AND, AND_NOT: 270 return 5 271 } 272 return LowestPrec 273 } 274 275 var keywords map[string]Token 276 277 func init() { 278 keywords = make(map[string]Token) 279 for i := keyword_beg + 1; i < keyword_end; i++ { 280 keywords[tokens[i]] = i 281 } 282 } 283 284 // Lookup maps an identifier to its keyword token or IDENT (if not a keyword). 285 // 286 func Lookup(ident string) Token { 287 if tok, is_keyword := keywords[ident]; is_keyword { 288 return tok 289 } 290 return IDENT 291 } 292 293 // Predicates 294 295 // IsLiteral returns true for tokens corresponding to identifiers 296 // and basic type literals; it returns false otherwise. 297 // 298 func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end } 299 300 // IsOperator returns true for tokens corresponding to operators and 301 // delimiters; it returns false otherwise. 302 // 303 func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end } 304 305 // IsKeyword returns true for tokens corresponding to keywords; 306 // it returns false otherwise. 307 // 308 func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end }