简单的例子

解析表达式的流程是这样的:(在express.c中函数从底向上依次是)

       1 解析or左右两侧的表达式,先解析左侧 and表达式,在解析右侧 and 表达式
                            |
      2 解析and左右两侧的表达式,先解析左侧 = 表达式 ,再解析右侧 = 表达式
                            |
       3 解析 = 表达式,先解析左侧比较表达式,在比较右侧比较表达式
                            |
      4. 解析比较表达式,先解析左侧算数表达式,再解析右侧算数表达式
                            |
    5.  解析算数表达式,如果算数表达式(加减乘除,乘方,内置函数sqrt等)中有括号,需要解析括号内的表达式(解析表达式又从第一层开始)


解析过程中会把表达式解析为后序表达式,会把两个运算对象放在前面,运算符放到后面 a - b * (c - (d + e)) > f.x or 1+4<45 and 1+2=3
1. 首先从第一层进入开始解析,需要解析or左侧and表达式
2. 在第二层解析and之前,需要解析and左侧的=表达式
3. 在第三层解析=表达式之前,需要解析左侧比较表达式
4. 在第四层解析比较表达式之前,需要解析比较左侧的算数表达式
5. 那么首先就解析(d+e)中的d+e,得到de+,之后 (c - (d + e))变为 (c - de+) (第5层,解析括号内的表达式和加号)
6. 解析 (c - de+) 内的 c - de+,得到 cde+-,表达式变为 a - b * cde+- > f.x or 1+4<45 and 1+2=3(第5层,解析括号内的表达式和减号)
7. 解析 b*cde+- ,得到 bcde+-*,表达式变为a - bcde+-* > f.x or 1+4<45 and 1+2=3(第五层,解析乘法)
8. 解析 a - bcde+-*,得到abcde+-*-,表达式变为 abcde+-*- > f.x or 1+4<45 and 1+2=3
9. 从第五层返回第四层,解析比较表达式的右侧算数表达式,获得f.x,表达式变为(abcde+-*-)f.x> or 1+4<45 and 1+2=3 (第四层,解析右侧算数表达式)
10. 从第四层返回第三层,解析=右侧表达式,(实际上没有=)直接返回上一层
11. 从第三层返回第二层,解析and右侧表达式(实际上没有and),直接返回上一层
12. 从第二层返回第一层,解析or右侧and表达式,下降到第二层,显而易见or右侧的and表达式是 1+4<45 and 1+2=3,变形后为 (1 4 + 45 <) (1 2 + 3= )and(算数表达式和等号表达式解析省略)
13. 从第二层返回 or 右侧表达式 (1 4 + 45 <) (1 2 + 3= )and,与左侧表达式 (abcde+-*-)f.x> 结合,变为 [(abcde+-*-)f.x> ] or [(1 4 + 45 <) (1 2 + 3= )and ]

最后结果 [(abcde+-*-)f.x> ] or [(1 4 + 45 <) (1 2 + 3= )and ]
转换成中缀表达式加括号之后: (((a - (b * (c - (d + e)))) > f.x) OR (((1 + 4) < 45) AND ((1 + 2) = 3)))

这是上述表达式的表达式树