// Copyright 2018 The CUE Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adt import "cuelang.org/go/cue/token" // Op indicates the operation at the top of an expression tree of the expression // use to evaluate a value. type Op int func (o Op) String() string { return opToString[o] } // Values of Op. const ( NoOp Op = iota AndOp OrOp SelectorOp IndexOp SliceOp CallOp BoolAndOp BoolOrOp EqualOp NotOp NotEqualOp LessThanOp LessEqualOp GreaterThanOp GreaterEqualOp MatchOp NotMatchOp AddOp SubtractOp MultiplyOp FloatQuotientOp IntQuotientOp IntRemainderOp IntDivideOp IntModuloOp InterpolationOp ) var opToString = map[Op]string{ AndOp: "&", OrOp: "|", BoolAndOp: "&&", BoolOrOp: "||", EqualOp: "==", NotOp: "!", NotEqualOp: "!=", LessThanOp: "<", LessEqualOp: "<=", GreaterThanOp: ">", GreaterEqualOp: ">=", MatchOp: "=~", NotMatchOp: "!~", AddOp: "+", SubtractOp: "-", MultiplyOp: "*", FloatQuotientOp: "/", IntQuotientOp: "quo", IntRemainderOp: "rem", IntDivideOp: "div", IntModuloOp: "mod", SelectorOp: ".", IndexOp: "[]", SliceOp: "[:]", CallOp: "()", InterpolationOp: `\()`, } // OpFromToken converts a token.Token to an Op. func OpFromToken(t token.Token) Op { return tokenMap[t] } // Token returns the token.Token corresponding to the Op. func (op Op) Token() token.Token { return opMap[op] } var tokenMap = map[token.Token]Op{ token.OR: OrOp, // | token.AND: AndOp, // & token.ADD: AddOp, // + token.SUB: SubtractOp, // - token.MUL: MultiplyOp, // * token.QUO: FloatQuotientOp, // / token.IDIV: IntDivideOp, // div token.IMOD: IntModuloOp, // mod token.IQUO: IntQuotientOp, // quo token.IREM: IntRemainderOp, // rem token.LAND: BoolAndOp, // && token.LOR: BoolOrOp, // || token.EQL: EqualOp, // == token.LSS: LessThanOp, // < token.GTR: GreaterThanOp, // > token.NOT: NotOp, // ! token.NEQ: NotEqualOp, // != token.LEQ: LessEqualOp, // <= token.GEQ: GreaterEqualOp, // >= token.MAT: MatchOp, // =~ token.NMAT: NotMatchOp, // !~ } var opMap = map[Op]token.Token{} func init() { for t, o := range tokenMap { opMap[o] = t } }