github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/token/token.go (about) 1 package token 2 3 import "strconv" 4 5 type ( 6 Token int 7 8 FileInfo struct { 9 line, column int 10 } 11 ) 12 13 const ( 14 Illegal Token = iota + 1 // error ocurred 15 EOF 16 Comment 17 18 literal_beg 19 20 Ident 21 String // "<string>" 22 Number // [0-9]+ 23 Arg 24 25 literal_end 26 27 operator_beg 28 29 Assign // = 30 AssignCmd // <= 31 Equal // == 32 NotEqual // != 33 Plus // + 34 Minus // - 35 Gt // > 36 Lt // < 37 38 Colon // , 39 Semicolon // ; 40 41 operator_end 42 43 LBrace // { 44 RBrace // } 45 LParen // ( 46 RParen // ) 47 LBrack // [ 48 RBrack // ] 49 Pipe 50 51 Comma 52 Dotdotdot 53 54 Variable 55 56 keyword_beg 57 58 Import 59 SetEnv 60 ShowEnv 61 BindFn // "bindfn <fn> <cmd> 62 Dump // "dump" [ file ] 63 Return 64 If 65 Else 66 For 67 Rfork 68 Fn 69 Var 70 71 keyword_end 72 ) 73 74 var tokens = [...]string{ 75 Illegal: "ILLEGAL", 76 EOF: "EOF", 77 Comment: "COMMENT", 78 79 Ident: "IDENT", 80 String: "STRING", 81 Number: "NUMBER", 82 Arg: "ARG", 83 84 Assign: "=", 85 AssignCmd: "<=", 86 Equal: "==", 87 NotEqual: "!=", 88 Plus: "+", 89 Minus: "-", 90 Gt: ">", 91 Lt: "<", 92 93 Colon: ",", 94 Semicolon: ";", 95 96 LBrace: "{", 97 RBrace: "}", 98 LParen: "(", 99 RParen: ")", 100 LBrack: "[", 101 RBrack: "]", 102 Pipe: "|", 103 104 Comma: ",", 105 Dotdotdot: "...", 106 107 Variable: "VARIABLE", 108 109 Import: "import", 110 SetEnv: "setenv", 111 ShowEnv: "showenv", 112 BindFn: "bindfn", 113 Dump: "dump", 114 Return: "return", 115 If: "if", 116 Else: "else", 117 For: "for", 118 Rfork: "rfork", 119 Fn: "fn", 120 Var: "var", 121 } 122 123 var keywords map[string]Token 124 125 func init() { 126 keywords = make(map[string]Token) 127 for i := keyword_beg + 1; i < keyword_end; i++ { 128 keywords[tokens[i]] = i 129 } 130 } 131 132 func Lookup(ident string) Token { 133 if tok, isKeyword := keywords[ident]; isKeyword { 134 return tok 135 } 136 137 return Ident 138 } 139 140 func IsKeyword(t Token) bool { 141 if t > keyword_beg && t < keyword_end { 142 return true 143 } 144 145 return false 146 } 147 148 func NewFileInfo(l, c int) FileInfo { return FileInfo{l, c} } 149 func (info FileInfo) Line() int { return info.line } 150 func (info FileInfo) Column() int { return info.column } 151 152 func (tok Token) String() string { 153 s := "" 154 155 if 0 < tok && tok < Token(len(tokens)) { 156 s = tokens[tok] 157 } 158 if s == "" { 159 s = "token(" + strconv.Itoa(int(tok)) + ")" 160 } 161 return s 162 }