【问题标题】:Evaluate Mathematical Function from String [closed]从字符串评估数学函数[关闭]
【发布时间】:2016-11-21 00:11:30
【问题描述】:

你能给我一些关于如何用 C 语言制作一个简单的数学表达式解析器的想法吗?

用户在一个字符串中输入一个数学函数,并从我想在 C 中创建函数的字符串中输入一个数学函数。 例如。 x + sin(2*x)

->return x + sin(2x);

提前致谢。

【问题讨论】:

标签: c parsing math


【解决方案1】:

您可以解析基于“Shunting-Yard 算法”http://en.wikipedia.org/wiki/Shunting-yard_algorithm 的表达式。您将需要扩展以处理函数调用,例如 sin、cos 等...

【讨论】:

  • +1 用于调车场。这是解析它可以处理的任务的正确方法(算法简单,没有堆栈溢出的风险)。
【解决方案2】:

这根本不是一件简单的事情,从表面上看,这是一件很难的事情。您需要一个完整的语法解析器,并结合预定义的常量/函数(sinlogpi 等)。

如果您以前没有丰富的 C 经验,我不建议您这样做,但如果您真的想这样做,请查看 recursive descent parsing,这可以说是最简单的方法(不会给用户带来负担,例如反向波兰符号)。

最后但同样重要的是,您说您想从用户生成的输入中创建一个 C 函数。这几乎总是错误的做法 - 从用户输入生成代码,相反,最简单的方法是预处理以创建可以有效执行的中间表示。

【讨论】:

  • 我会强调你应该学习BNF (Backus-Naur Form) rule
  • 我认为这不是一件简单的事情。这并不可怕,实际上它相当优雅,但绝不简单。递归体面是最简单的方法,运算符优先级更复杂但相当复杂
【解决方案3】:

编写表达式解析器和求值器是讨论解析器编写技术时常用的示例之一。 例如,您可以查看 flex/bison 或 lex/yacc 的文档。这将有构建解析器/表达式评估器的示例。

【讨论】:

    【解决方案4】:

    一种方法是对表达式使用逆波兰表示法,对操作数使用堆栈。 一些快速的伪代码:

    if element is operand
         push in stack
    else if element is operation
         pop last 2 elements
         perform operation
         push result in stack
    

    重复直到表达式结束。最终结果是栈中唯一的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 2018-02-23
      • 1970-01-01
      • 2012-09-16
      • 2012-05-29
      • 1970-01-01
      相关资源
      最近更新 更多