Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475package cli
import ( "fmt" "slices"
"git.urbach.dev/cli/q/src/expression" "git.urbach.dev/cli/q/src/token")
// operators shows the entire list of operators grouped by precedence.func operators() int { type operator struct { kind token.Kind precedence int8 }
var ops []operator
for i, op := range expression.Operators { if op.Operands == 0 { continue }
ops = append(ops, operator{ kind: token.Kind(i), precedence: op.Precedence, }) }
slices.SortStableFunc(ops, func(a operator, b operator) int { return int(b.precedence) - int(a.precedence) })
level := 1
for i := 1; i < len(ops); i++ { if ops[i].precedence != ops[i-1].precedence { level++ } }
lastPrecedence := ops[0].precedence fmt.Printf("[%d] ", level)
for _, op := range ops { var text string
switch op.kind { case token.Call: text = "()" case token.Array: text = "[]" case token.Struct: text = "{}" default: text = op.kind.String() }
if text == "" { panic(fmt.Sprintf("invalid operator string for %d", int(op.kind))) }
if op.precedence != lastPrecedence { level-- fmt.Printf("\n[%d] ", level) }
lastPrecedence = op.precedence fmt.Printf("%s ", text) }
fmt.Println() return success}