OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [go/] [token/] [token.go] - Blame information for rev 747

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 747 jeremybenn
// Copyright 2009 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
4
 
5
// Package token defines constants representing the lexical tokens of the Go
6
// programming language and basic operations on tokens (printing, predicates).
7
//
8
package token
9
 
10
import "strconv"
11
 
12
// Token is the set of lexical tokens of the Go programming language.
13
type Token int
14
 
15
// The list of tokens.
16
const (
17
        // Special tokens
18
        ILLEGAL Token = iota
19
        EOF
20
        COMMENT
21
 
22
        literal_beg
23
        // Identifiers and basic type literals
24
        // (these tokens stand for classes of literals)
25
        IDENT  // main
26
        INT    // 12345
27
        FLOAT  // 123.45
28
        IMAG   // 123.45i
29
        CHAR   // 'a'
30
        STRING // "abc"
31
        literal_end
32
 
33
        operator_beg
34
        // Operators and delimiters
35
        ADD // +
36
        SUB // -
37
        MUL // *
38
        QUO // /
39
        REM // %
40
 
41
        AND     // &
42
        OR      // |
43
        XOR     // ^
44
        SHL     // <<
45
        SHR     // >>
46
        AND_NOT // &^
47
 
48
        ADD_ASSIGN // +=
49
        SUB_ASSIGN // -=
50
        MUL_ASSIGN // *=
51
        QUO_ASSIGN // /=
52
        REM_ASSIGN // %=
53
 
54
        AND_ASSIGN     // &=
55
        OR_ASSIGN      // |=
56
        XOR_ASSIGN     // ^=
57
        SHL_ASSIGN     // <<=
58
        SHR_ASSIGN     // >>=
59
        AND_NOT_ASSIGN // &^=
60
 
61
        LAND  // &&
62
        LOR   // ||
63
        ARROW // <-
64
        INC   // ++
65
        DEC   // --
66
 
67
        EQL    // ==
68
        LSS    // <
69
        GTR    // >
70
        ASSIGN // =
71
        NOT    // !
72
 
73
        NEQ      // !=
74
        LEQ      // <=
75
        GEQ      // >=
76
        DEFINE   // :=
77
        ELLIPSIS // ...
78
 
79
        LPAREN // (
80
        LBRACK // [
81
        LBRACE // {
82
        COMMA  // ,
83
        PERIOD // .
84
 
85
        RPAREN    // )
86
        RBRACK    // ]
87
        RBRACE    // }
88
        SEMICOLON // ;
89
        COLON     // :
90
        operator_end
91
 
92
        keyword_beg
93
        // Keywords
94
        BREAK
95
        CASE
96
        CHAN
97
        CONST
98
        CONTINUE
99
 
100
        DEFAULT
101
        DEFER
102
        ELSE
103
        FALLTHROUGH
104
        FOR
105
 
106
        FUNC
107
        GO
108
        GOTO
109
        IF
110
        IMPORT
111
 
112
        INTERFACE
113
        MAP
114
        PACKAGE
115
        RANGE
116
        RETURN
117
 
118
        SELECT
119
        STRUCT
120
        SWITCH
121
        TYPE
122
        VAR
123
        keyword_end
124
)
125
 
126
var tokens = [...]string{
127
        ILLEGAL: "ILLEGAL",
128
 
129
        EOF:     "EOF",
130
        COMMENT: "COMMENT",
131
 
132
        IDENT:  "IDENT",
133
        INT:    "INT",
134
        FLOAT:  "FLOAT",
135
        IMAG:   "IMAG",
136
        CHAR:   "CHAR",
137
        STRING: "STRING",
138
 
139
        ADD: "+",
140
        SUB: "-",
141
        MUL: "*",
142
        QUO: "/",
143
        REM: "%",
144
 
145
        AND:     "&",
146
        OR:      "|",
147
        XOR:     "^",
148
        SHL:     "<<",
149
        SHR:     ">>",
150
        AND_NOT: "&^",
151
 
152
        ADD_ASSIGN: "+=",
153
        SUB_ASSIGN: "-=",
154
        MUL_ASSIGN: "*=",
155
        QUO_ASSIGN: "/=",
156
        REM_ASSIGN: "%=",
157
 
158
        AND_ASSIGN:     "&=",
159
        OR_ASSIGN:      "|=",
160
        XOR_ASSIGN:     "^=",
161
        SHL_ASSIGN:     "<<=",
162
        SHR_ASSIGN:     ">>=",
163
        AND_NOT_ASSIGN: "&^=",
164
 
165
        LAND:  "&&",
166
        LOR:   "||",
167
        ARROW: "<-",
168
        INC:   "++",
169
        DEC:   "--",
170
 
171
        EQL:    "==",
172
        LSS:    "<",
173
        GTR:    ">",
174
        ASSIGN: "=",
175
        NOT:    "!",
176
 
177
        NEQ:      "!=",
178
        LEQ:      "<=",
179
        GEQ:      ">=",
180
        DEFINE:   ":=",
181
        ELLIPSIS: "...",
182
 
183
        LPAREN: "(",
184
        LBRACK: "[",
185
        LBRACE: "{",
186
        COMMA:  ",",
187
        PERIOD: ".",
188
 
189
        RPAREN:    ")",
190
        RBRACK:    "]",
191
        RBRACE:    "}",
192
        SEMICOLON: ";",
193
        COLON:     ":",
194
 
195
        BREAK:    "break",
196
        CASE:     "case",
197
        CHAN:     "chan",
198
        CONST:    "const",
199
        CONTINUE: "continue",
200
 
201
        DEFAULT:     "default",
202
        DEFER:       "defer",
203
        ELSE:        "else",
204
        FALLTHROUGH: "fallthrough",
205
        FOR:         "for",
206
 
207
        FUNC:   "func",
208
        GO:     "go",
209
        GOTO:   "goto",
210
        IF:     "if",
211
        IMPORT: "import",
212
 
213
        INTERFACE: "interface",
214
        MAP:       "map",
215
        PACKAGE:   "package",
216
        RANGE:     "range",
217
        RETURN:    "return",
218
 
219
        SELECT: "select",
220
        STRUCT: "struct",
221
        SWITCH: "switch",
222
        TYPE:   "type",
223
        VAR:    "var",
224
}
225
 
226
// String returns the string corresponding to the token tok.
227
// For operators, delimiters, and keywords the string is the actual
228
// token character sequence (e.g., for the token ADD, the string is
229
// "+"). For all other tokens the string corresponds to the token
230
// constant name (e.g. for the token IDENT, the string is "IDENT").
231
//
232
func (tok Token) String() string {
233
        s := ""
234
        if 0 <= tok && tok < Token(len(tokens)) {
235
                s = tokens[tok]
236
        }
237
        if s == "" {
238
                s = "token(" + strconv.Itoa(int(tok)) + ")"
239
        }
240
        return s
241
}
242
 
243
// A set of constants for precedence-based expression parsing.
244
// Non-operators have lowest precedence, followed by operators
245
// starting with precedence 1 up to unary operators. The highest
246
// precedence corresponds serves as "catch-all" precedence for
247
// selector, indexing, and other operator and delimiter tokens.
248
//
249
const (
250
        LowestPrec  = 0 // non-operators
251
        UnaryPrec   = 6
252
        HighestPrec = 7
253
)
254
 
255
// Precedence returns the operator precedence of the binary
256
// operator op. If op is not a binary operator, the result
257
// is LowestPrecedence.
258
//
259
func (op Token) Precedence() int {
260
        switch op {
261
        case LOR:
262
                return 1
263
        case LAND:
264
                return 2
265
        case EQL, NEQ, LSS, LEQ, GTR, GEQ:
266
                return 3
267
        case ADD, SUB, OR, XOR:
268
                return 4
269
        case MUL, QUO, REM, SHL, SHR, AND, AND_NOT:
270
                return 5
271
        }
272
        return LowestPrec
273
}
274
 
275
var keywords map[string]Token
276
 
277
func init() {
278
        keywords = make(map[string]Token)
279
        for i := keyword_beg + 1; i < keyword_end; i++ {
280
                keywords[tokens[i]] = i
281
        }
282
}
283
 
284
// Lookup maps an identifier to its keyword token or IDENT (if not a keyword).
285
//
286
func Lookup(ident string) Token {
287
        if tok, is_keyword := keywords[ident]; is_keyword {
288
                return tok
289
        }
290
        return IDENT
291
}
292
 
293
// Predicates
294
 
295
// IsLiteral returns true for tokens corresponding to identifiers
296
// and basic type literals; it returns false otherwise.
297
//
298
func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end }
299
 
300
// IsOperator returns true for tokens corresponding to operators and
301
// delimiters; it returns false otherwise.
302
//
303
func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end }
304
 
305
// IsKeyword returns true for tokens corresponding to keywords;
306
// it returns false otherwise.
307
//
308
func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end }

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.