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