2008-08-26 48 views
10

我们希望在我们的C++程序中有用户定义的公式。 例如值为v = x +(y - (z-2))/ 2。在程序的后面,用户将定义x,y和z - >程序应返回计算结果。
有些时候,公式可能会发生变化,所以下次程序应该解析公式并添加新值。

任何想法/提示如何做这样的事情?

到目前为止,我刚刚找到解决方案来编写解析器来计算这些公式 - 也许有关于此的任何想法?计算用户定义的公式(用C++)

回答

3

如果它会被频繁使用,并且将来会被扩展,我几乎建议在代码中添加python或LUA。 LUA是一种非常轻量级的脚本语言,您可以将其嵌入并提供新的函数,运算符等。如果您想要执行更强大和更复杂的操作,请使用Python代替。

0

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

注意:精神是简单易学,而且相当适应这样的任务。

0

一般有两种方法做这件事的,有三种可能的实现方式:

  1. 因为你已经对自己的触动,图书馆评估公式
  2. 编译公式为代码

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

对于C++,我会猜测评估库可能存在某处,所以这就是我要开始的地方。

0

如果你想编写自己的,搜索“正式自动”和/或“有限状态机语法”

一般你会做什么是解析字符串,在堆栈上推字符,当您去。然后开始弹出关闭的字符并根据弹出的内容执行任务。如果强制方程式反转抛光符号,编码更容易。

1

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

然后你可以很轻松地编写通过树递归的方法,将适当的操作的任何值你通过。

0

为了使您的生活更轻松,我觉得让这种投入的最佳途径是做一个图形用户界面,用户可以输入的内容受到限制。

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

然后,你将需要:
读取输入的字符数组中
解析它,以建立变量和动作列表
开展这些行动 - 在BOMDAS为了

1

构建您自己的解析器,这应该是一个直接的操作:

)从缀转换公式后缀符号(典型compsci分配)(我会使用一个堆栈) )等得到你想要 值)弹出一堆中缀项,将变量的值放在需要的位置 )显示结果

0

使用ANTLR您可以创建解析器/编译器来解释用户输入,然后使用访问者模式执行计算。 A good example is here,但它是在C#中。您应该能够快速适应您的需求,并继续使用C++作为您的开发平台。