Regex 方程展开

Regex 方程展开,regex,perl,math,Regex,Perl,Math,我需要简化一个等式 我有过这样的经历 a + b *((c+d)(e+f))+x 我必须把方程简化为a+bce+bcf+bde+bdf+x 请注意,不会指定任何数值。我必须简化字符串方程,得到方程变量形式的结果,如上所示 目前,我制作了一种堆栈结构,在这种结构中,我不断推入每个字符,直到遇到“+”。一旦我这样做了,我从下到上转储所有变量并从堆栈中移除元素,直到我得到上一个开始括号(在堆栈上)。我这样做直到我得到一个结束括号,在结束括号处我移除所有内容,直到我得到一个结束括号之前的开始括号 然而

我需要简化一个等式

我有过这样的经历

a + b *((c+d)(e+f))+x
我必须把方程简化为a+bce+bcf+bde+bdf+x

请注意,不会指定任何数值。我必须简化字符串方程,得到方程变量形式的结果,如上所示

目前,我制作了一种堆栈结构,在这种结构中,我不断推入每个字符,直到遇到“+”。一旦我这样做了,我从下到上转储所有变量并从堆栈中移除元素,直到我得到上一个开始括号(在堆栈上)。我这样做直到我得到一个结束括号,在结束括号处我移除所有内容,直到我得到一个结束括号之前的开始括号

然而,当我遇到类似于
(a+b)(e+f)
的东西时,问题就出现了。我无法想出任何逻辑来做到这一点。我也不知道如何处理冗余括号,如
((a+b))


有人能在这个问题上提供帮助吗?

1.将其解析为一个抽象语法树。2.定义一组简化规则。3.遍历树并应用规则,直到无法应用任何规则。看起来您目前正处于第1步。您可能会发现,像这样的解析器生成器可以让您的生活更轻松。对于2和3,您可能对此感兴趣–但是它使用LispThanks来帮助你。但是,我不确定如何使用Marpa来简化方程。我可以制定+&。但是我将如何处理(a+b)*(e+f),因为简单ab只需要连接,但类似于a*(b+c)的东西需要a与b&c的连接。此外,我必须不断更新我正在处理的方程。更新也是问题之一。您使用Marpa解析字符串,而不是方程“简化”。编写语法分析器不是一项简单的任务。学习如何编写语法分析器甚至更少。幸运的是,许多语法分析器教程都使用算术表达式作为示例。这里的答案是一个专用语法分析器。如果CPAN模块或类似模块已经很好地匹配,则您只希望更快地完成它。此语法分析器的功能远远超出您的需要,但您可以您仍然可以使用它: