123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- // Package token defines constants representing the lexical tokens of JavaScript (ECMA5).
- package token
- import (
- "strconv"
- )
- // Token is the set of lexical tokens in JavaScript (ECMA5).
- type Token int
- // String returns the string corresponding to the token.
- // For operators, delimiters, and keywords the string is the actual
- // token string (e.g., for the token PLUS, the String() is
- // "+"). For all other tokens the string corresponds to the token
- // name (e.g. for the token IDENTIFIER, the string is "IDENTIFIER").
- //
- func (tkn Token) String() string {
- if 0 == tkn {
- return "UNKNOWN"
- }
- if tkn < Token(len(token2string)) {
- return token2string[tkn]
- }
- return "token(" + strconv.Itoa(int(tkn)) + ")"
- }
- // This is not used for anything
- func (tkn Token) precedence(in bool) int {
- switch tkn {
- case LOGICAL_OR:
- return 1
- case LOGICAL_AND:
- return 2
- case OR, OR_ASSIGN:
- return 3
- case EXCLUSIVE_OR:
- return 4
- case AND, AND_ASSIGN, AND_NOT, AND_NOT_ASSIGN:
- return 5
- case EQUAL,
- NOT_EQUAL,
- STRICT_EQUAL,
- STRICT_NOT_EQUAL:
- return 6
- case LESS, GREATER, LESS_OR_EQUAL, GREATER_OR_EQUAL, INSTANCEOF:
- return 7
- case IN:
- if in {
- return 7
- }
- return 0
- case SHIFT_LEFT, SHIFT_RIGHT, UNSIGNED_SHIFT_RIGHT:
- fallthrough
- case SHIFT_LEFT_ASSIGN, SHIFT_RIGHT_ASSIGN, UNSIGNED_SHIFT_RIGHT_ASSIGN:
- return 8
- case PLUS, MINUS, ADD_ASSIGN, SUBTRACT_ASSIGN:
- return 9
- case MULTIPLY, SLASH, REMAINDER, MULTIPLY_ASSIGN, QUOTIENT_ASSIGN, REMAINDER_ASSIGN:
- return 11
- }
- return 0
- }
- type _keyword struct {
- token Token
- futureKeyword bool
- strict bool
- }
- // IsKeyword returns the keyword token if literal is a keyword, a KEYWORD token
- // if the literal is a future keyword (const, let, class, super, ...), or 0 if the literal is not a keyword.
- //
- // If the literal is a keyword, IsKeyword returns a second value indicating if the literal
- // is considered a future keyword in strict-mode only.
- //
- // 7.6.1.2 Future Reserved Words:
- //
- // const
- // class
- // enum
- // export
- // extends
- // import
- // super
- //
- // 7.6.1.2 Future Reserved Words (strict):
- //
- // implements
- // interface
- // let
- // package
- // private
- // protected
- // public
- // static
- //
- func IsKeyword(literal string) (Token, bool) {
- if keyword, exists := keywordTable[literal]; exists {
- if keyword.futureKeyword {
- return KEYWORD, keyword.strict
- }
- return keyword.token, false
- }
- return 0, false
- }
|