计算用户定义的公式(使用C ++)

时间:2020-03-05 18:43:19  来源:igfitidea点击:

我们希望在我们的c ++程序中有用户定义的公式。
例如值v = x +(y(z 2))/2. 稍后在程序中,用户将定义x,y和z->程序应返回计算结果。
稍后,公式可能会更改,因此,下次程序应解析该公式并添加新值。
任何想法/提示如何做这样的事情?
到目前为止,我只是来到解决方案中,编写一个解析器来计算这些公式,也许对此有什么想法?

解决方案

回答

使用Spirit(例如)进行解析(以及它提供的``语义动作''来构造一个表达式树,然后可以对其进行操作(例如评估))似乎是一个非常简单的解决方案。例如,如果需要,我们可以在其中找到算术表达式的语法...(提出自己的语法很简单)。

注意:Spirit很容易学习,并且非常适合此类任务。

回答

如果它会经常使用并且将来会扩展,我几乎建议我们将python或者LUA添加到代码中。 LUA是一种非常轻量级的脚本语言,我们可以将其插入并提供新的功能,运算符等。如果我们想做更健壮和复杂的事情,请改用Python。

回答

通常有两种方法可以实现,并有三种可能的实现方式:

  • 当我们触碰自己时,便是一个用于评估公式的库
  • 将公式编译成代码

通常,这里的第二个选项是通过编译可以作为一种插件加载的东西来完成的,或者可以将其编译成一个单独的程序,然后调用该程序并产生必要的输出。

对于C ++,我猜想用于评估的库可能存在于某个地方,所以这就是我的起点。

回答

如果要编写自己的内容,请搜索"形式自动机"和/或者"有限状态机语法"

通常,我们将要做的是解析字符串,并在运行时将字符压入堆栈。然后开始弹出字符并根据弹出的内容执行任务。如果我们将方程式强制设为反抛光符号,则编码起来会更容易。

回答

我们可以将公式表示为操作和子表达式的树。我们可能需要为操作类型和变量定义类型或者常量。

然后,我们可以轻松地编写一个遍历树的方法,将适当的操作应用于我们传入的任何值。

回答

为了使生活更轻松,我认为最好通过GUI来获得这种输入,在GUI中,用户只能输入内容。

如果我们打算从命令行执行此操作(这就是我从帖子中获得的印象),那么我们可能应该定义一组严格的允许输入(例如,仅单字母变量,无空格和某些数学符号:( )+-* /等。

然后,我们将需要:
读入输入字符数组
解析它以建立变量和动作的列表
按BOMDAS顺序执行这些操作

回答

为此,构建自己的解析器应该是直接的操作:

)将方程式从中缀转换为后缀表示法(典型的compsci分配)(我将使用堆栈)
)等待获取我们想要的值
)弹出中缀项堆栈,将变量的值放在需要的位置
)显示结果

回答

使用ANTLR,我们可以创建解析器/编译器来解释用户输入,然后使用Visitor模式执行计算。一个很好的例子在这里,但是在C#中。我们应该能够使其迅速适应需求,并继续使用C ++作为开发平台。