| // 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 |
| _Larrow |
| _Rarrow |
| _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 |
| ) |
| |
| const ( |
| // for AliasDecl |
| Const = _Const |
| Type = _Type |
| Var = _Var |
| Func = _Func |
| |
| // 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: ":=", |
| _Larrow: "<-", |
| _Rarrow: "=>", |
| _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 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 |
| ) |