heartlhj / go-expression

GO语言EL表达式
MIT License
5 stars 2 forks source link

大于(>)、小于(<)操作符被识别为大于等于(>=)、小于等于(<=) #4

Open gerdong opened 1 year ago

gerdong commented 1 year ago
context := spel.StandardEvaluationContext{}
m := make(map[string]interface{})
m["name"] = "lisi"
m["age"] = 18
context.SetVariables(m)
parser := expression.SpelExpressionParser{}
expressionString := "#age>18"
valueContext := parser.ParseExpression(expressionString).GetValueContext(&context)

// 结果打印为true
fmt.Println(valueContext)

貌似是这里Tokenizer中调用pushCharToken,放入的是一个 大于等于的算子

case ">":
if t.isTwoCharToken(TokenKind{TokenKindType: GE, TokenChars: []rune(GE), HasPayload: len([]rune(GE)) == 0}) {
    t.pushPairToken(TokenKind{TokenKindType: GE, TokenChars: []rune(GE), HasPayload: len([]rune(GE)) == 0})
} else {
    t.pushCharToken(TokenKind{TokenKindType: GE, TokenChars: []rune(GE), HasPayload: len([]rune(GE)) == 0})
}
break

在 InternalSpelExpressionParser的eatRelationalExpression方法中:

// 这里似乎有意把 > 当做 >=, < 当做 <= 处理,不知何意
if kindType == GT {
    eq := OpGE{Operator: &operator}
    return &eq, nil
}
if kindType == LT {
  eq := OpLE{Operator: &operator}
  return &eq, nil
}

不太能够理解作者的意图