使用Javacc / jjtree简化方程式/表达式

时间:2016-10-16 20:54:54

标签: parsing javacc equations simplification

我已经创建了一个语法来读取方程文件,然后为每个规则创建AST节点。我的问题是如何在解析器能够正确读取的方程式上进行简化或替换vales。在哪个阶段?在创建AST节点之前或之后? 请提供我想要的想法或教程。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

你要求两个不同的解决方案来解决两个不同的问题,这些问题首先要有至少一个方程式的AST:

  • 如何"替代价值"进入等式并计算结果值,例如,对于X == 3和Y = 2,将AST替换为上面的公式并计算3^2+3*2^2 - > 21
  • 如何进行简化:我假设您的意思是代数简化。

如果yuo已经拥有AST,那么替换值的第一个问题就相当容易了。 (如果没有,先解析方程式以生成AST!)然后你所要做的就是遍历AST,用相应的值替换包含变量名的每个叶子节点,然后对其子节点现在发生的任何父节点进行算术运算成为数字;你重复这个,直到不再能对算术进行算术评估。基本上,您将简单算术连接到树评估方案中。

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

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

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

JavaCC可能构成这样一个答案的一部分,但只是一小部分;解决方案的其余部分足够困难,因此您最好寻找替代方案而不是尝试在JavaCC之上构建它。 您需要一种更有条理的方法:Program Transformation System (PTS)。典型的PTS将允许您指定 任意语言的语法(在你的例子中,只是多项式), 自动将实例解析为AST,并可以从AST重新生成有效文本。一个好的 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

通过充分/重要的努力,您可以在JavaCC / JJTree之上构建自己的PTS。这可能需要几个人年。更容易获得PTS而不是重复所有工作。