0504: 解析表达式
SQL操作优先级
这一步添加SQL里的各种操作,优先级从低到高:
a OR b
a AND b
NOT a
a = b, a <> b, a < b, a > b, a <= b, a >= b
a + b, a - b
a * b, a / b
-a测试用例:
// f or e and not d = a + b * -c
&ExprBinOp{op: OP_OR,
left: "f", right: &ExprBinOp{op: OP_AND,
left: "e", right: &ExprUnOp{op: OP_NOT,
kid: &ExprBinOp{op: OP_EQ,
left: "d", right: &ExprBinOp{op: OP_ADD,
left: "a", right: &ExprBinOp{op: OP_MUL,
left: "b", right: &ExprUnOp{op: OP_NEG,
kid: "c"}}}}}}}抽离出公共函数
仿照上一步的 parseAdd(),每层优先级都对应一个 parseXXX() 函数,调用下一层的 parseYYY()。上一步的 parseMul() 是从 parseAdd() 复制粘贴来的,现在新增了许多函数,可以把 parseXXX() 里的逻辑抽离出来:
func (p *Parser) parseBinop(
tokens []string, ops []ExprOp, inner func() (interface{}, error),
) (interface{}, error)前缀操作
这一步的 NOT a 和 -a 只有一个子树,所以新增一个 struct:
type ExprUnOp struct {
op ExprOp
kid interface{}
}evalExpr() 也做相应的扩充。
您正在阅读免费版教程,从第4章起只有简单的指引,适合爱好挑战和自学的读者。
可以购买有详细指导+背景知识的完整版。