// 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 | |
// delimiters | |
_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 | |
) | |
const ( | |
// for BranchStmt | |
Break = _Break | |
Continue = _Continue | |
Fallthrough = _Fallthrough | |
Goto = _Goto | |
// for CallStmt | |
Go = _Go | |
Defer = _Defer | |
) | |
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: "*", | |
// 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", | |
} | |
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 LitKind uint | |
const ( | |
IntLit LitKind = iota | |
FloatLit | |
ImagLit | |
RuneLit | |
StringLit | |
) | |
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 | |
) |