mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
This change accepts the 'i' suffix on binary and octal integer literals as well as hexadecimal floats. The suffix was already accepted on decimal integers and floats. Note that 0123i == 123i for backward-compatibility (and 09i is valid). See also the respective language in the spec change: https://golang.org/cl/161098 Change-Id: I9d2d755cba36a3fa7b9e24308c73754d4568daaf Reviewed-on: https://go-review.googlesource.com/c/162878 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
156 lines
2.6 KiB
Go
156 lines
2.6 KiB
Go
// 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
|
|
|
|
type token uint
|
|
|
|
//go:generate stringer -type token -linecomment
|
|
|
|
const (
|
|
_ token = iota
|
|
_EOF // EOF
|
|
|
|
// names and literals
|
|
_Name // name
|
|
_Literal // literal
|
|
|
|
// operators and operations
|
|
// _Operator is excluding '*' (_Star)
|
|
_Operator // op
|
|
_AssignOp // op=
|
|
_IncOp // opop
|
|
_Assign // =
|
|
_Define // :=
|
|
_Arrow // <-
|
|
_Star // *
|
|
|
|
// delimiters
|
|
_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
|
|
|
|
// empty line comment to exclude it from .String
|
|
tokenCount //
|
|
)
|
|
|
|
const (
|
|
// for BranchStmt
|
|
Break = _Break
|
|
Continue = _Continue
|
|
Fallthrough = _Fallthrough
|
|
Goto = _Goto
|
|
|
|
// for CallStmt
|
|
Go = _Go
|
|
Defer = _Defer
|
|
)
|
|
|
|
// 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 LitKind uint
|
|
|
|
// TODO(gri) With the 'i' (imaginary) suffix now permitted on integer
|
|
// and floating-point numbers, having a single ImagLit does
|
|
// not represent the literal kind well anymore. Remove it?
|
|
const (
|
|
IntLit LitKind = iota
|
|
FloatLit
|
|
ImagLit
|
|
RuneLit
|
|
StringLit
|
|
)
|
|
|
|
type Operator uint
|
|
|
|
//go:generate stringer -type Operator -linecomment
|
|
|
|
const (
|
|
_ Operator = iota
|
|
|
|
// Def is the : in :=
|
|
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 // >>
|
|
)
|
|
|
|
// Operator precedences
|
|
const (
|
|
_ = iota
|
|
precOrOr
|
|
precAndAnd
|
|
precCmp
|
|
precAdd
|
|
precMul
|
|
)
|