Python 我应该使用Lex还是自制的解决方案来解析公式?

Python 我应该使用Lex还是自制的解决方案来解析公式?,python,lex,ply,Python,Lex,Ply,我正在编写一个基于规则的小型“数学”引擎。我意识到这还不清楚,所以我将提供一个小例子 假设你有一个变量a,它包含一个整数。您还可以对数字应用一些函数,即 sqr-将数字平方 flp-翻转数字位 dec-减少数字 inc-递增数字 然后你可以说,do\u公式(a,“2sqr+inc+flp”)。如果a是3,它将平方它两次(81),增加它(82),然后翻转它的位(~82——如果处理有符号整数,我相信是-83) 解析公式的最佳方法是什么?它相对简单,我正在考虑让所有的操作码都是3个字符。。。使用莱

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

假设你有一个变量a,它包含一个整数。您还可以对数字应用一些函数,即

  • sqr
    -将数字平方
  • flp
    -翻转数字位
  • dec
    -减少数字
  • inc
    -递增数字
然后你可以说,
do\u公式(a,“2sqr+inc+flp”)
。如果a是3,它将平方它两次(81),增加它(82),然后翻转它的位(~82——如果处理有符号整数,我相信是-83)

解析公式的最佳方法是什么?它相对简单,我正在考虑让所有的操作码都是3个字符。。。使用莱克斯会不会太过分了?我应该只写一个简单的自制溶液,还是完全使用其他的


我意识到上面的例子很愚蠢;我并没有建立一个可以做到这一点的计算器,但它充分说明了我正在努力做的事情。

是的,在这种情况下,似乎有些过火了。只需在“=”上拆分字符串,然后依次应用这些操作。感谢上帝,作为一等公民,您的引擎可以用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)

这真的取决于你的项目最终会有多大:如果你想创造一种新的语言或是一种解析比+更有趣语法的东西,那么我会说lex将是一个有趣和有趣的方式来度过一个下午

另一方面,编写自己的解析器是非常有用的,如果您事先真的考虑了语法,那么编写解析器也不是特别困难


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

如果你有一些空闲时间,想学习一种新的编程范式,那么就让Prolog来转一转吧!

如果你的语法不是超级co你不介意用Python来做,这可能正是医生要求的。我实现了一个相当类似的东西来解析化学方程式,花了我一个小时左右的时间。我想在这里添加代码,但它不会特别相关。

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