Evaluating a binary expression tree with chaining comparison operators
我正在构建一个二进制表达式树(用于玩具脚本语言),到目前为止,我的算术运算工作正常(即
1 | 0 < 1 < 2 |
当前产生以下二进制表达式树:
1 2 3 4 5 | < / \\ < 2 / \\ 0 1 |
我正在使用递归将树向下遍历到叶节点并返回值,因此
解决此问题的最佳方法是什么?我以为我可能最终不得不以不同的方式建造我的树。即
1 2 3 4 5 6 | && / \\ / \\ < < / \\ / \\ 0 1 1 2 |
但是我希望能在我的野牛解析器解决方案中实现更优雅/更简单的实现。
本质上,一系列链接比较是单个运算符,而不是一系列二进制运算符。将
如果您具有区分的联合类型,则还可以使其与一系列二进制运算符一起使用。在这种情况下,非常简单的已区分联合就足够了。
让
现在,我们定义
1 2 3 4 5 | integer a < integer b ==> T if a is less than b, then b; otherwise false T a < integer b ==> T if a is false, then false; otherwise a < b (as above) |
对于链式比较的中间结果的任何使用,都必须将
隐式转换为布尔值的结果是
1 | a < b == c < d # Chained comparison |
与
不同
1 | (a < b) == (c < d) # Comparison of two booleans |
例如,这基本上是Python的语义。
上面的方法可以用任何可排序的类型替换整数。
为了实现链式比较,您需要在语法中正确管理带括号的比较。通常只删除括号的朴素AST结构将无法正常工作。