【发布时间】:2016-11-21 00:11:30
【问题描述】:
你能给我一些关于如何用 C 语言制作一个简单的数学表达式解析器的想法吗?
用户在一个字符串中输入一个数学函数,并从我想在 C 中创建函数的字符串中输入一个数学函数。
例如。 x + sin(2*x)
->return x + sin(2x);
提前致谢。
【问题讨论】:
你能给我一些关于如何用 C 语言制作一个简单的数学表达式解析器的想法吗?
用户在一个字符串中输入一个数学函数,并从我想在 C 中创建函数的字符串中输入一个数学函数。
例如。 x + sin(2*x)
->return x + sin(2x);
提前致谢。
【问题讨论】:
您可以解析基于“Shunting-Yard 算法”http://en.wikipedia.org/wiki/Shunting-yard_algorithm 的表达式。您将需要扩展以处理函数调用,例如 sin、cos 等...
【讨论】:
这根本不是一件简单的事情,从表面上看,这是一件很难的事情。您需要一个完整的语法解析器,并结合预定义的常量/函数(sin、log、pi 等)。
如果您以前没有丰富的 C 经验,我不建议您这样做,但如果您真的想这样做,请查看 recursive descent parsing,这可以说是最简单的方法(不会给用户带来负担,例如反向波兰符号)。
最后但同样重要的是,您说您想从用户生成的输入中创建一个 C 函数。这几乎总是错误的做法 - 从用户输入生成代码,相反,最简单的方法是预处理以创建可以有效执行的中间表示。
【讨论】:
编写表达式解析器和求值器是讨论解析器编写技术时常用的示例之一。 例如,您可以查看 flex/bison 或 lex/yacc 的文档。这将有构建解析器/表达式评估器的示例。
【讨论】:
一种方法是对表达式使用逆波兰表示法,对操作数使用堆栈。 一些快速的伪代码:
if element is operand
push in stack
else if element is operation
pop last 2 elements
perform operation
push result in stack
重复直到表达式结束。最终结果是栈中唯一的元素。
【讨论】: