src/pkg/go/token/token.go - The Go Programming Language

Golang

Source file src/pkg/go/token/token.go

     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 corresponds serves as "catch-all" precedence for
   247	// selector, 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 }