Java 使用ANTLR检查类似的表达式

Java 使用ANTLR检查类似的表达式,java,data-structures,antlr,Java,Data Structures,Antlr,我对使用ANTLR还不熟悉,我想知道是否有办法检查类似的表达式。例如,我如何验证逻辑上等价的两个表达式,例如 (a+b) <=> (b+a) ; (a+(b+c)) <=> ((a+b)+c) ; (a && b) <=> (b && a) ; (a < b) <==> (b > a) ; etc. 你的问题是代数问题。虽然你的例子很简单,但我认为你的意思是: a^2-a+3 <==&

我对使用ANTLR还不熟悉,我想知道是否有办法检查类似的表达式。例如,我如何验证逻辑上等价的两个表达式,例如

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

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

   a^2-a+3 <==> a*(a-1)+b*3/b
要进行代数运算,您需要将表达式解析为某种内部形式,然后询问它们是否可以通过将代数规则应用到等价形式来进行转换。例如,你的一个等价物是由分配定律决定的

ANTLR是一个解析引擎。它读取您定义的语法,如果您这样引导它,它可能会构建AST。但是在解析树之后,它不会重写树,甚至无法表达这一点。ANTLR有一些与重写无关的特殊术语,但我认为这只适用于构建单个树的过程

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

这正是Mathematica的工作原理,但Mathematica通常仅限于数学方面,如纯代数。你可以滥用它去做其他事情,但大多数情况下这只是滥用

对于您的示例,您需要关于布尔运算&、| |和关于某种代数的规则,以及带有运算符+、>、

这比ANTLR提供的要多得多,或者可以使用ANTLR或任何其他解析器生成器轻松构建,因为。。。它们只是解析器生成器。使用ANTLR可以合理地做的是构建两棵树,并对它们进行比较,看看它们是否具有完全相同的结构

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

在这里,我通过定义布尔代数的语法,并编写 显式重写规则

在这里我展示如何。这遵循相同的范例:代数语法,以及一组重写规则

人们可以很容易地把它们放在一起,处理你在计算机程序中找到的各种表达式。我们经常这样做。。。实际上,我们为一个计算机语言定义了一个语法,然后只提取表达式部分

使用这种机器,人们可以在程序中挑选公式,并对它们进行操作/比较,以获得某种等式。要真正做到这一点,您需要一个指导重写的理论,通常称为决策过程。DMS目前不包含决策程序


你还必须处理结合定律和交换定律。事实证明,纯重写规则很难做到这一点;您需要对这些代数属性的特殊支持。这些都内置在DMS中。

感谢@Ira Baxter的宝贵回复。但我对ANTLR和DMS感到困惑。据我所知,ANTLR通过阅读语法将您的表达式解析为树,DMS也是如此。正如你所说的,你可以合理地使用ANTLR来构建两棵树,并对它们进行比较,看看它们是否具有完全相同的结构。DMS是否能够生成逻辑上相同的表达式树结构?如果是,则表示DMS已经编写了用于表示相同树结构的预定义语法。是的,ANTLR和DMS都接受语法,并且都接受构建解析器,并且由它们构建的解析器将根据语法读取公式并构建相应的树。ANTLR停在那里;您可以在ANTLR之上构建一些自定义代码,使其读取两个公式,并比较树。在这一点上,ANTLR或多或少地被推到了您可以在不需要大量额外工作的情况下将其推到这个任务的最远位置。您可以在DMS之上构建概念上相似的代码,以获得相同的效果。到目前为止,没有任何有用的区别。。。。。。关键是DMS可以走得更远,开箱即用;您可以指定丰富的重写规则,包括关联规则和分布规则的自动管理,并让DMS为您应用这些规则,甚至让DMS打印该应用程序的结果。如果你看一看代数的例子,你可以确切地看到你必须对DMS说些什么,才能让它以代数的方式处理方程。所有的建树都是在幕后免费进行的。N DMS或ANTLR都有表达树结构的GRAMMR;它们接受控制如何构建相应树结构的语法。