func (me expression) Value() (lex.Token, bool) { expression := []lex.Token(me) size := len(expression) if size == 0 { var t lex.Token t.SetInt(0) return t, true } //and/or operators for i := 0; i < size; i++ { if expression[i].Type() == lex.Symbol { o := expression[i] switch o.String() { case "&&", "||": var tree parseTree tree.build(expression, i) return tree.Value() } } } //not operator for i := 0; i < size; i++ { if expression[i].Type() == lex.Symbol { if expression[i].String() == "!" { var tree parseTree tree.build(expression, i) return tree.Value() } } } //comparison operators for i := 0; i < size; i++ { if expression[i].Type() == lex.Symbol { o := expression[i] switch o.String() { case "<", ">", "<=", ">=", "!=", "==": var tree parseTree tree.build(expression, i) return tree.Value() } } } //add and subtract for i := 0; i < size; i++ { if expression[i].Type() == lex.Symbol { if expression[i].String() == "+" || expression[i].String() == "-" { var tree parseTree tree.build(expression, i) return tree.Value() } } } //multiplication and division for i := 0; i < size; i++ { if expression[i].Type() == lex.Symbol { if expression[i].String() == "*" || expression[i].String() == "/" { var tree parseTree tree.build(expression, i) return tree.Value() } } } var t lex.Token if expression[0].Type() != lex.Symbol { t = expression[0] } else if expression[0].Type() == lex.Symbol { //is negative int literal var t lex.Token if expression[0].String() == "i" { retval, _ := strconv.Atoi(expression[1].String()) t.SetInt(-retval) return t, true } else { return t, false } } return t, true }