使用ANTLR检查类似的表达式

时间:2014-12-10 05:52:13

标签: java data-structures antlr

我是 ANTLR 的新手,我想知道是否有办法检查类似的表达式。例如,我如何验证逻辑上等效的两个表达式,例如以下

(a+b) <=> (b+a) ; 
(a+(b+c)) <=> ((a+b)+c) ; 
(a && b) <=> (b && a) ; 
(a < b) <==> (b > a) ; etc.

1 个答案:

答案 0 :(得分:0)

你的问题是一个代数问题。虽然你的例子很简单,但我认为你的意思也是:

   a^2-a+3 <==> a*(a-1)+b*3/b

要做代数,你需要将表达式解析成某种内部形式,然后通过将代数规则应用于等价形式来询问它们是否可以被转换。例如,你的一个等价是由分配法决定的。

ANTLR是一个解析引擎。它会读取您定义的语法,如果您这样做,它可能会构建AST。但它在解析后不会重写树,也无法表达。 (ANTLR有一些关于“重写”的特殊无关术语,但我认为这仅适用于单个树的构造。)

为此,您需要更像程序转换系统的东西,它可以解析,构建树,然后可以应用“术语”重写规则将树转换为其他树。 您还需要一种表达允许的规则的方法。给定这样的规则,系统然后需要找出将一个“术语”(树)转换为另一个术语的重写序列。 (一个常见的技巧是应用规范化转换;如果两个公式归一化为相同的结果,那么它们是相等的。)

这正是Mathematica的工作方式,但Mathematica通常仅限于更纯粹的代数等数学事物。 (你可以滥用它来做其他事情,但大多数情况下只是辱骂)。

对于您的示例,您需要有关布尔运算(&amp;&amp;,||)的规则以及关于运算符算术的某种代数(+,&gt;,...)

这是很多比ANTLR更多,或者可以使用ANTLR(或任何其他“正义”解析器生成器)轻松构建,因为......好吧,它们只是解析器生成器。 (你可以用ANTLR做的是构建两棵树,然后比较它们以确定它们是否具有完全相同的结构)。

我们的DMS软件重组工具包可以做到这一点。通常我们将它应用于转换复杂的源代码以某种方式“改进”它们。通常情况下,这种改进需要对布尔和代数公式进行推理,例如,一个公式是等于真还是假。 (示例:如果可以显示IF语句中的条件为FALSE,则可以从程序中删除IF语句。)

这里我describe how DMS can do Boolean algebra通过定义布尔代数的语法和写作 显式重写规则。

这里我将展示DMS can do reasoning about algebra involving numbers的方式。这遵循相同的范例:代数的语法,以及一组重写规则。

可以轻松地将它们放在一起,以处理您在计算机程序中找到的各种表达。 (我们经常这样做......实际上,我们为计算机语言定义一个语法,然后选择表达式部分。)

使用这种机器,人们可以在程序中挑选出公式,并对某些类型的平等进行操作/比较。要做到这一点,你需要一个指导重写的理论,通常称为“决策程序”。 DMS目前不包含决策程序。

您还必须处理关联和交换法律。事实证明,纯粹的重写规则很难做到;您需要对这些代数属性的特殊支持。这些内置于DMS中。

相关问题