【问题标题】:What's the best way to read a mathematical function f(x,y) command line argument?阅读数学函数 f(x,y) 命令行参数的最佳方法是什么?
【发布时间】:2021-08-19 23:22:48
【问题描述】:

来自main(),我希望用户通过命令行输入一个数学函数(I,e:2xy)。从那里开始,我最初想遍历字符串并解析出不同的算术运算符 x、y 等。但是,对于更复杂的函数,这可能会变得相当复杂(例如:(2x^2)/5 + sqrt(x^4) )。有没有更通用的方法可以解析像这样的数学函数字符串?

【问题讨论】:

  • 1.使用可能存在的数学解析器/评估器库之一。 2. 使用 lex/flex 和 yacc/bison(或其他一些词法分析器和解析器生成器)实现解析器 3. 滚动你自己的解析器
  • 您在下面有很好的答案,但首先您需要定义一个formal grammar。仅从四个操作开始,然后尝试阅读有关词法分析器和解析器的信息。

标签: c math command-line-arguments


【解决方案1】:

你需要的是一个表达式求值器

不久前,我为嵌入式系统上的命令行处理器和脚本语言编写了一个完整的 C 表达式求值器(即使用 C 语法编写的求值表达式)。我使用this 对算法的描述作为起点。你可以直接使用随附的代码,但我不喜欢它的实现,并根据算法描述编写了自己的代码。

它需要一些工作来支持所有 C 运算符、函数调用和变量,但这是一个清晰的解释,因此是一个很好的起点,特别是如果您不需要那种级别的完整性。

基本原理是使用堆栈和“反向波兰表示法”的计算机更容易进行表达式评估,因此该算法将具有相关优先顺序和括号的固定表示法表达式转换为 RPN,然后通过以下方式对其进行评估弹出操作数、执行操作并压入结果,直到堆栈上没有任何操作和一个值。

如果您选择处理隐式乘法运算符(例如2xy 而不是2 * x * y,这可能会变得更复杂一些。尤其是因为您需要明确区分变量xy来自单个变量xy。这可能只有在您只允许单个字符变量名称时才可行。我建议您这样做并在运算符堆栈上插入显式乘法运算符作为解析的一部分,或者您不允许隐式乘法。

【讨论】:

    【解决方案2】:

    处理此类解析问题最有用的方法之一是将输入方法从诸如此类的方程式切换到基于 RPN 的输入,其中参数在前,运算符在后。

    重写你的复杂方程最终会看起来像:

    2 2 x ^ * 5 / x 4 ^ sqrt +

    这通常更容易实现,因为您可以使用简单的堆栈来实现 - 将新参数推入,而操作员将需要的部分从堆栈中拉出并将结果放回。大大简化了解析,但还是需要实现函数。

    【讨论】:

    • 如果你想自己动手,并且对 CS 有点陌生,那么这是唯一实用的解决方案。解析比 RPN 解析器更复杂的东西比看起来要复杂方式。有很多个陷阱。如果您这样做是为了娱乐或学习体验,那么继续吧,编写一个 RPN 解析器和解释器是一个很好的练习。另一方面,如果您只是因为需要一个数学解析器作为其他项目的一部分而这样做,那么请不要打扰,使用现有的许多可嵌入数学或程序解释器中的一个。
    • 哦,如果您真的想编写一个接受中缀符号的数学解释器,那么拥有一个有效的 RPN 解析器和求值器将是一个很好的第一步。跨度>
    猜你喜欢
    • 2022-01-21
    • 2013-01-25
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多