diff options
Diffstat (limited to 'src/cmd/compile/internal/syntax/tokens.go')
-rw-r--r-- | src/cmd/compile/internal/syntax/tokens.go | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/syntax/tokens.go b/src/cmd/compile/internal/syntax/tokens.go new file mode 100644 index 0000000000..9243f1e14f --- /dev/null +++ b/src/cmd/compile/internal/syntax/tokens.go @@ -0,0 +1,241 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syntax + +import "fmt" + +type token uint + +const ( + _ token = iota + _EOF + + // names and literals + _Name + _Literal + + // operators and operations + _Operator // excluding '*' (_Star) + _AssignOp + _IncOp + _Assign + _Define + _Arrow + _Star + + // delimitors + _Lparen + _Lbrack + _Lbrace + _Rparen + _Rbrack + _Rbrace + _Comma + _Semi + _Colon + _Dot + _DotDotDot + + // keywords + _Break + _Case + _Chan + _Const + _Continue + _Default + _Defer + _Else + _Fallthrough + _For + _Func + _Go + _Goto + _If + _Import + _Interface + _Map + _Package + _Range + _Return + _Select + _Struct + _Switch + _Type + _Var + + tokenCount +) + +var tokstrings = [...]string{ + // source control + _EOF: "EOF", + + // names and literals + _Name: "name", + _Literal: "literal", + + // operators and operations + _Operator: "op", + _AssignOp: "op=", + _IncOp: "opop", + _Assign: "=", + _Define: ":=", + _Arrow: "<-", + _Star: "*", + + // delimitors + _Lparen: "(", + _Lbrack: "[", + _Lbrace: "{", + _Rparen: ")", + _Rbrack: "]", + _Rbrace: "}", + _Comma: ",", + _Semi: ";", + _Colon: ":", + _Dot: ".", + _DotDotDot: "...", + + // keywords + _Break: "break", + _Case: "case", + _Chan: "chan", + _Const: "const", + _Continue: "continue", + _Default: "default", + _Defer: "defer", + _Else: "else", + _Fallthrough: "fallthrough", + _For: "for", + _Func: "func", + _Go: "go", + _Goto: "goto", + _If: "if", + _Import: "import", + _Interface: "interface", + _Map: "map", + _Package: "package", + _Range: "range", + _Return: "return", + _Select: "select", + _Struct: "struct", + _Switch: "switch", + _Type: "type", + _Var: "var", +} + +func (tok token) String() string { + var s string + if 0 <= tok && int(tok) < len(tokstrings) { + s = tokstrings[tok] + } + if s == "" { + s = fmt.Sprintf("<tok-%d>", tok) + } + return s +} + +// Make sure we have at most 64 tokens so we can use them in a set. +const _ uint64 = 1 << (tokenCount - 1) + +// contains reports whether tok is in tokset. +func contains(tokset uint64, tok token) bool { + return tokset&(1<<tok) != 0 +} + +type Operator uint + +const ( + _ Operator = iota + Def // := + Not // ! + Recv // <- + + // precOrOr + OrOr // || + + // precAndAnd + AndAnd // && + + // precCmp + Eql // == + Neq // != + Lss // < + Leq // <= + Gtr // > + Geq // >= + + // precAdd + Add // + + Sub // - + Or // | + Xor // ^ + + // precMul + Mul // * + Div // / + Rem // % + And // & + AndNot // &^ + Shl // << + Shr // >> +) + +var opstrings = [...]string{ + // prec == 0 + Def: ":", // : in := + Not: "!", + Recv: "<-", + + // precOrOr + OrOr: "||", + + // precAndAnd + AndAnd: "&&", + + // precCmp + Eql: "==", + Neq: "!=", + Lss: "<", + Leq: "<=", + Gtr: ">", + Geq: ">=", + + // precAdd + Add: "+", + Sub: "-", + Or: "|", + Xor: "^", + + // precMul + Mul: "*", + Div: "/", + Rem: "%", + And: "&", + AndNot: "&^", + Shl: "<<", + Shr: ">>", +} + +func (op Operator) String() string { + var s string + if 0 <= op && int(op) < len(opstrings) { + s = opstrings[op] + } + if s == "" { + s = fmt.Sprintf("<op-%d>", op) + } + return s +} + +// Operator precedences +const ( + _ = iota + precOrOr + precAndAnd + precCmp + precAdd + precMul +) |