使用自定义函数读取非二进制表达式

时间:2018-05-18 07:08:23

标签: expression theory computation-theory

我想读数学函数并解释它们。 到目前为止,我使用二进制表达式并使用Infix to Prefix Method来读取我的字符串(例如4 * 3 + 1)。

然而,与此同时,我想要阅读更复杂的表达式,这些表达式无法翻译成二叉树。

一些例子:

  1. max(x_1,x_2,x_3,x_4,x_5)+ max(y_1,y_2)
  2. 轮(内插(X_1,X,Y),2)
  3. customfunction(x,y,z)+ 4
  4. 我有一些问题要找到将给定字符串转换为非二叉树的方法。如何做到这一点的好方法,是否有一些已知的方法? 由于我需要支持一些自己的自定义函数,所以我不能使用任何现有的库。

    我不期待任何代码,我对理论这样做感兴趣。

2 个答案:

答案 0 :(得分:0)

通常你需要定义一个语法(在这种情况下是一个非常简单的语法),它定义解析文本的规则是什么,然后通过各种语法之一生成一个基于这个语法的解析器存在的库。对于一个如此简单的语法Antlr肯定是夸大其词。有一系列文章here关于写一个"写一个递归下降解析器"或者如果你在nuget上搜索 peg (一系列语法分析器),你会发现很多实现。

请注意,这个计算机科学的分支非常庞大......你可以从这里开始lexers vs parsers作为理论部分。

答案 1 :(得分:0)

以与查看二进制表达式相同的方式查看自定义非二进制函数。

E.g。 2 + 3 * 4转换为+(*(3,4),2)// +和*这里只是函数名称

您可以混合使用自定义功能:

E.g。 a ^ 3 + Max(a,b,c)* 2转换为:+(^(a,3),*(2,Max(a,b,c))

在你的解释器中定义什么是+(),^(),Max(),your_custom_function()意味着什么和期望的参数(即树中的子节点)。树不是二进制的,但这并不会真正改变你创建它的方式并遍历它。