4

我正在编写一个基于规则的小型“数学”引擎。我意识到这不清楚,所以我将提供一个小例子。

假设您有一些变量 a,它包含一个整数。您还可以将一些功能应用于该号码,即

  • sqr- 平方数
  • flp- 翻转数字的位
  • dec- 减少数字
  • inc- 增加数字

然后你可以说,do_formula(a, "2sqr+inc+flp")。如果 a 是 3,它会将它平方两次(81),增加它(82),然后翻转它的位(~82——如果处理有符号整数,我相信它是 -83)。

解析公式的最佳方法是什么?它相对简单,我正在考虑将所有操作码都设为 3 个字符……使用 Lex 会不会过大?我应该只写一个简单的自制解决方案还是完全使用其他东西?

我意识到上面的例子很愚蠢;我不是在构建一个可以做到这一点的计算器,但它说明了我想要做得足够好。

4

5 回答 5

3

If your grammar isn't super-complex and you don't mind doing it in Python, pyparsing could be just what the doctor ordered. I implemented something fairly similar for parsing chemical equations and it took me an hour or so to do it. I'd add the code here, but it wouldn't be particularly relevant.

于 2010-01-05T00:56:12.873 回答
1

是的,在这种情况下似乎有点矫枉过正。只需将字符串拆分为“=”,然后依次应用操作。感谢上帝提供字典和函数作为一等公民,您的引擎可以用 0.5 - 1 页代码编写。

dct = {'sqr' : lambda a: a * a, ...}

ntimes, op = token[:-3], token[-3:]
ntimes = 0 if len(ntimes) == 0 else int(ntimes)

..
dct[op](a)
于 2010-01-04T19:19:46.237 回答
0

这实际上取决于您的项目最终会有多大:如果您正在考虑创建一种新语言或解析比 + 更有趣的语法的东西,那么我会说 lex 将是一种有趣且有趣的消费方式一个下午。

另一方面,如果您事先真正考虑过语法,编写自己的解析器会提供非常丰富的信息并且不是特别难。

问题实际上最终是用哪种语言进行解析?几年前,当我编写第一个解析器时,Haskell 将是一个非常有趣的选择,并为我提供了很多有趣的启示。

于 2010-01-04T19:22:49.007 回答
0

你的宿主语言是什么?对于 Ruby,我真的很喜欢treetop。开始有点困难,但我已经成功地使用它来解析更复杂的数学表达式。

于 2010-01-05T00:59:48.997 回答
-1

如果您有空闲时间并想学习新的编程范式,请试一试 Prolog!

于 2010-01-04T19:24:24.370 回答