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章起只有简单的指引,适合爱好挑战和自学的读者。
可以购买有详细指导+背景知识的完整版