aboutsummaryrefslogblamecommitdiffstats
path: root/vendor/github.com/robertkrimen/otto/token/token.go
blob: 0e941ac96dee7004d3ecbffbd1ce314316238c38 (plain) (tree)



















































































































                                                                                                            
// 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
}