summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/d5/tengo/v2/token/token.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/d5/tengo/v2/token/token.go')
-rw-r--r--vendor/github.com/d5/tengo/v2/token/token.go225
1 files changed, 225 insertions, 0 deletions
diff --git a/vendor/github.com/d5/tengo/v2/token/token.go b/vendor/github.com/d5/tengo/v2/token/token.go
new file mode 100644
index 00000000..4e6aa80a
--- /dev/null
+++ b/vendor/github.com/d5/tengo/v2/token/token.go
@@ -0,0 +1,225 @@
+package token
+
+import "strconv"
+
+var keywords map[string]Token
+
+// Token represents a token.
+type Token int
+
+// List of tokens
+const (
+ Illegal Token = iota
+ EOF
+ Comment
+ _literalBeg
+ Ident
+ Int
+ Float
+ Char
+ String
+ _literalEnd
+ _operatorBeg
+ Add // +
+ Sub // -
+ Mul // *
+ Quo // /
+ Rem // %
+ And // &
+ Or // |
+ Xor // ^
+ Shl // <<
+ Shr // >>
+ AndNot // &^
+ AddAssign // +=
+ SubAssign // -=
+ MulAssign // *=
+ QuoAssign // /=
+ RemAssign // %=
+ AndAssign // &=
+ OrAssign // |=
+ XorAssign // ^=
+ ShlAssign // <<=
+ ShrAssign // >>=
+ AndNotAssign // &^=
+ LAnd // &&
+ LOr // ||
+ Inc // ++
+ Dec // --
+ Equal // ==
+ Less // <
+ Greater // >
+ Assign // =
+ Not // !
+ NotEqual // !=
+ LessEq // <=
+ GreaterEq // >=
+ Define // :=
+ Ellipsis // ...
+ LParen // (
+ LBrack // [
+ LBrace // {
+ Comma // ,
+ Period // .
+ RParen // )
+ RBrack // ]
+ RBrace // }
+ Semicolon // ;
+ Colon // :
+ Question // ?
+ _operatorEnd
+ _keywordBeg
+ Break
+ Continue
+ Else
+ For
+ Func
+ Error
+ Immutable
+ If
+ Return
+ Export
+ True
+ False
+ In
+ Undefined
+ Import
+ _keywordEnd
+)
+
+var tokens = [...]string{
+ Illegal: "ILLEGAL",
+ EOF: "EOF",
+ Comment: "COMMENT",
+ Ident: "IDENT",
+ Int: "INT",
+ Float: "FLOAT",
+ Char: "CHAR",
+ String: "STRING",
+ Add: "+",
+ Sub: "-",
+ Mul: "*",
+ Quo: "/",
+ Rem: "%",
+ And: "&",
+ Or: "|",
+ Xor: "^",
+ Shl: "<<",
+ Shr: ">>",
+ AndNot: "&^",
+ AddAssign: "+=",
+ SubAssign: "-=",
+ MulAssign: "*=",
+ QuoAssign: "/=",
+ RemAssign: "%=",
+ AndAssign: "&=",
+ OrAssign: "|=",
+ XorAssign: "^=",
+ ShlAssign: "<<=",
+ ShrAssign: ">>=",
+ AndNotAssign: "&^=",
+ LAnd: "&&",
+ LOr: "||",
+ Inc: "++",
+ Dec: "--",
+ Equal: "==",
+ Less: "<",
+ Greater: ">",
+ Assign: "=",
+ Not: "!",
+ NotEqual: "!=",
+ LessEq: "<=",
+ GreaterEq: ">=",
+ Define: ":=",
+ Ellipsis: "...",
+ LParen: "(",
+ LBrack: "[",
+ LBrace: "{",
+ Comma: ",",
+ Period: ".",
+ RParen: ")",
+ RBrack: "]",
+ RBrace: "}",
+ Semicolon: ";",
+ Colon: ":",
+ Question: "?",
+ Break: "break",
+ Continue: "continue",
+ Else: "else",
+ For: "for",
+ Func: "func",
+ Error: "error",
+ Immutable: "immutable",
+ If: "if",
+ Return: "return",
+ Export: "export",
+ True: "true",
+ False: "false",
+ In: "in",
+ Undefined: "undefined",
+ Import: "import",
+}
+
+func (tok Token) String() string {
+ s := ""
+
+ if 0 <= tok && tok < Token(len(tokens)) {
+ s = tokens[tok]
+ }
+
+ if s == "" {
+ s = "token(" + strconv.Itoa(int(tok)) + ")"
+ }
+
+ return s
+}
+
+// LowestPrec represents lowest operator precedence.
+const LowestPrec = 0
+
+// Precedence returns the precedence for the operator token.
+func (tok Token) Precedence() int {
+ switch tok {
+ case LOr:
+ return 1
+ case LAnd:
+ return 2
+ case Equal, NotEqual, Less, LessEq, Greater, GreaterEq:
+ return 3
+ case Add, Sub, Or, Xor:
+ return 4
+ case Mul, Quo, Rem, Shl, Shr, And, AndNot:
+ return 5
+ }
+ return LowestPrec
+}
+
+// IsLiteral returns true if the token is a literal.
+func (tok Token) IsLiteral() bool {
+ return _literalBeg < tok && tok < _literalEnd
+}
+
+// IsOperator returns true if the token is an operator.
+func (tok Token) IsOperator() bool {
+ return _operatorBeg < tok && tok < _operatorEnd
+}
+
+// IsKeyword returns true if the token is a keyword.
+func (tok Token) IsKeyword() bool {
+ return _keywordBeg < tok && tok < _keywordEnd
+}
+
+// Lookup returns corresponding keyword if ident is a keyword.
+func Lookup(ident string) Token {
+ if tok, isKeyword := keywords[ident]; isKeyword {
+ return tok
+ }
+ return Ident
+}
+
+func init() {
+ keywords = make(map[string]Token)
+ for i := _keywordBeg + 1; i < _keywordEnd; i++ {
+ keywords[tokens[i]] = i
+ }
+}