我们希望在我们的c ++程序中使用用户定义的公式。
例如值 v = x +(y - (z - 2))/ 2 。在程序的后面,用户将定义x,y和z - >程序应该返回计算结果。
稍后某些公式可能会被更改,因此下次程序应该解析公式并添加新值。
有任何想法/提示如何做这样的事情?
到目前为止,我刚刚找到解决方案来编写一个解析器来计算这些公式 - 也许是关于它的任何想法?
答案 0 :(得分:3)
如果它经常被使用并且将来会被扩展,我几乎建议在你的代码中添加python或LUA。 LUA是一种非常轻量级的脚本语言,您可以将其挂钩并提供新的函数,运算符等。如果您想要做更强大和复杂的事情,请使用Python。
答案 1 :(得分:1)
您可以将公式表示为操作树和子表达式。您可能希望为“操作类型”和“变量”定义类型或常量。
然后,您可以轻松地编写一个通过树进行递归的方法,将适当的操作应用于您传入的任何值。
答案 2 :(得分:1)
为此构建自己的解析器应该是一个简单的操作:
)将公式从中缀转换为后缀表示法(典型的compsci赋值)(我使用堆栈) )等待获得你想要的值 )弹出一堆中缀项,在需要的地方删除变量的值 )显示结果
答案 3 :(得分:0)
使用Spirit(例如)来解析(以及它提供的'语义动作'来构造一个你可以操作的表达式树,例如,评估)似乎是一个非常简单的解决方案。你可以找到算术表达式there的语法,例如,如果需要的话......(想出你自己的算法很简单)。
注意:精神非常简单易学,并且非常适合这些任务。
答案 4 :(得分:0)
通常有两种方法,有三种可能的实施方式:
这里的第二个选项通常是通过编译可以作为一种插件加载的东西来完成的,或者可以编译成一个单独的程序,然后调用它并产生必要的输出。
对于C ++,我猜想用于评估的库可能存在于某处,这就是我要开始的地方。
答案 5 :(得分:0)
如果你想自己编写,搜索“形式自动机”和/或“有限状态机语法”
一般来说,你要做的就是解析字符串,随时随地推送字符串。然后开始弹出字符并根据弹出的内容执行任务。如果你强制方程式反向抛光符号,它就更容易编码。
答案 6 :(得分:0)
为了让您的生活更轻松,我认为最好通过GUI来完成这种输入,用户可以在其中输入内容。
如果您计划从命令行执行此操作(即我从您的帖子中获得的印象),那么您应该定义一组严格的允许输入(例如,只有单个字母变量,没有空格,只有某些数学符号:()+ - * / etc。)。
然后,你需要:
读入输入字符数组
解析它以建立变量和动作列表
执行这些操作 - 以BOMDAS顺序
答案 7 :(得分:0)
使用ANTLR,您可以创建解释用户输入的解析器/编译器,然后使用访问者模式执行计算。 A good example is here,但它在C#中。您应该能够快速适应您的需求,并继续使用C ++作为您的开发平台。