我有一个数学表达式解析器,它构建一个树来表示表达式。比方说,我输入2+y+3+y
,其内部表示为:
现在,作为人类,我们可以立即看到2+y+3+y = 2y + 5
。我看到计算机的棘手部分是,如果我站在左边+
,我不知道在另一个分支中我还有另一个权利 - 这无关紧要评估,但简化时,我不知道如何做得很好。
这是课程如何组合在一起:
我曾试图谷歌这一点,但没有找到任何可以帮助我的地方。只是一些通用的航点,或者一个网址或者其他什么东西都会受到赞赏
编辑:请注意,对于示例,我只包含了添加内容。解析器支持以下表达式:1 + 2 *(3 ^ 4-4 / 5 *(1 + 2))
答案 0 :(得分:0)
由于可以用类结构表达的表达式集非常有限,因此您可以简单地计算每个变量出现的频率并总结所有常量。
var nodes = tree.Flatten();
var variables = nodes
.OfType<Variable>()
.GroupBy(x => x.Name)
.Select(g => new Multiplication(
new Variable(g.Key), new Constant(g.Count())));
var constants = nodes
.OfType<Constant>()
.Sum(x => x.Value);
var result = new Addition(
variables.Aggregate((x, y) => new Addition(x, y)),
new Constant(constants));