我正在编写一个基于规则的小型“数学”引擎。我意识到这一点尚不清楚,所以我将提供一个小例子。
假设你有一些变量a,它包含一个整数。您还可以使用一些函数来应用数字,即
sqr
- 将数字平方flp
- 翻转数字的位dec
- 递减数字inc
- 增加数字然后你可以说do_formula(a, "2sqr+inc+flp")
。如果a为3,则将它平方两次(81),递增它(82),并翻转它的位(~82 - 如果处理有符号整数,则为-83,我相信)。
解析公式的最佳方法是什么?这是相对简单的,我正在考虑使所有的操作码都是3个字符......使用Lex会不会有点难度?我应该写一个简单的自制解决方案还是完全使用别的东西?
我意识到上面的例子很傻;我不是在构建一个能够做到这一点的计算器,但它说明了我正在做的事情。
答案 0 :(得分:3)
如果你的语法不是超级复杂而且你不介意用Python做,那么pyparsing可能正是医生所要求的。我为解析化学方程实现了一些非常相似的东西,花了我一个小时左右来完成它。我在这里添加代码,但它不是特别相关。
答案 1 :(得分: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)
答案 2 :(得分:0)
这实际上取决于你的项目最终会变得多大:如果你正在寻找创造一种新语言或解析更有趣的语法而不仅仅是+那么我会说lex会很有趣并且很有趣花一个下午的方式。
另一方面,编写自己的解析器非常有用,如果你事先已经考虑过语法,那就不是特别难。
这个问题真的最终成为解析的语言? Haskell将是一个非常有趣的选择,并且在我几年前编写第一个解析器时为我提供了许多有趣的启示。
答案 3 :(得分:0)
你的主人语言是什么?对于Ruby,我真的很喜欢treetop。它有点难以入手,但我已经成功地使用它来解析更复杂的数学表达式。
答案 4 :(得分:-1)
如果你有空闲时间并想学习新的编程范例,请给Prolog一个旋转!