使用 Javacc/jjtree 简化 equations/expressions

simplify equations/expressions using Javacc/jjtree

我创建了一个语法来读取方程文件,然后为每个 rule.My 创建了 AST 节点问题是我如何对解析器能够正确读取的方程进行简化或替换值。在哪个阶段?在创建 AST 节点之前还是之后? 请向我提供要遵循的想法或教程。

谢谢。

我假设你的方程类似于实数值变量上的简单多项式,比如 X^2+3*Y^2

您要求针对两个不同的问题提供两种不同的解决方案,这些问题从至少一个方程式的 AST 开始:

  • 如何将 "substitute values" 代入等式并计算结果值,例如,对于 X==3 和 Y=2,将上述公式代入 AST 并计算 3^2+3*2^2 -- > 21
  • 如何化简:我假设你的意思是代数化简。

如果你已经有了 AST,第一个代入值的问题就相当简单了。 (如果没有,首先解析等式以产生 AST!)然后你所要做的就是遍历 AST,用相应的值替换包含变量名的每个叶节点,然后对子节点现在发生的任何父节点进行算术运算成为数字;重复此操作,直到无法对更多节点进行算术评估。基本上,您将简单的算术连接到树评估方案中。

有时您的评估会将树缩减为示例中的单个值,您可以打印数值结果 My SO answer shows how do that in detail。您可以自己在一个小项目中轻松实现这一点,甚至使用适当调整的 JavaCC/JJTree。

有时,公式最终会处于无法对其进行进一步运算的状态,例如,1+x+y x==0 且对 y 一无所知;那么这样一个 subsitution/arithmetic 评估过程的结果将是 1+y。不幸的是,您只能将其作为 AST...现在您需要打印出生成的 AST 以便用户查看结果。这更难; see my SO answer on how to prettyprint a tree。这是相当多的工作;如果您将树限制为 just 多项式表达式,您仍然可以在小项目中执行此操作。 JavaCC 将帮助您进行解析,但对漂亮打印的帮助为零。

第二个问题要难得多,因为你不仅要像上面那样完成变量替换和算术评估,而且你还必须以某种方式编码代数定律的知识,以及如何将这些定律与复杂的树相匹配。您可能会硬连线一个或两个代数定律(例如,x+0 -> xy-y -> 0)但是以这种方式硬连线许多法则会产生不可能的混乱,因为他们如何互动。

JavaCC 可能构成这样的答案的一部分,但只是一小部分;解决方案的其余部分已经足够困难,因此您最好寻找替代方案,而不是尝试将其全部构建在 JavaCC 之上。 为此,您需要一种更有条理的方法:Program Transformation System (PTS)。典型的 PTS 将允许您指定 任意语言的语法(在你的情况下,只是多项式), 自动将实例解析为 AST,并可以从 AST 重新生成有效文本。 good PTS 将允许您编写源到源转换规则,PTS 将自动应用实例 AST;在你的情况下,你会写下代数定律作为源到源规则,然后 PTS 完成所有工作。

示例太长,无法在此处提供。但是 here I describe how to define formulas suitable for early calculus classes, and how to define algebraic rules that simply such formulas including applying some class calculus derivative laws.

通过 sufficient/significant 的努力,您可以在 JavaCC/JJTree 的基础上构建自己的 PTS。这可能需要几个人年。获得 PTS 比重复所有工作更容易。