github.com/nuvolaris/goja@v0.0.0-20230825100449-967811910c6d/token/token.go (about)

     1  // Package token defines constants representing the lexical tokens of JavaScript (ECMA5).
     2  package token
     3  
     4  import (
     5  	"strconv"
     6  )
     7  
     8  // Token is the set of lexical tokens in JavaScript (ECMA5).
     9  type Token int
    10  
    11  // String returns the string corresponding to the token.
    12  // For operators, delimiters, and keywords the string is the actual
    13  // token string (e.g., for the token PLUS, the String() is
    14  // "+"). For all other tokens the string corresponds to the token
    15  // name (e.g. for the token IDENTIFIER, the string is "IDENTIFIER").
    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  //lint:ignore U1000 This is not used for anything
    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  // IsKeyword returns the keyword token if literal is a keyword, a KEYWORD token
    81  // if the literal is a future keyword (const, let, class, super, ...), or 0 if the literal is not a keyword.
    82  //
    83  // If the literal is a keyword, IsKeyword returns a second value indicating if the literal
    84  // is considered a future keyword in strict-mode only.
    85  //
    86  // 7.6.1.2 Future Reserved Words:
    87  //
    88  //	const
    89  //	class
    90  //	enum
    91  //	export
    92  //	extends
    93  //	import
    94  //	super
    95  //
    96  // 7.6.1.2 Future Reserved Words (strict):
    97  //
    98  //	implements
    99  //	interface
   100  //	let
   101  //	package
   102  //	private
   103  //	protected
   104  //	public
   105  //	static
   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  }