Python中的安全表达式解析器
5 个回答
几周前,我做了类似的事情,不过是针对逻辑表达式(比如或、与、非、比较、括号等等)。我使用了Ply这个解析器来完成这个任务。我创建了一个简单的词法分析器和解析器。解析器生成了一个抽象语法树(AST),这个树后来用来进行计算。这样做的好处是你可以完全控制用户输入的内容,因为只有符合语法规则的表达式才会被解析。
你想要什么样的表达式呢?是变量赋值吗?还是函数计算?
SymPy
的目标是成为一个功能齐全的Python计算机代数系统。
Pyparsing提供的示例中包含了几个表达式解析器:
https://github.com/pyparsing/pyparsing/blob/master/examples/fourFn.py 是一个使用pyparsing实现的传统算术中缀表示法解析器/计算器。(尽管名字里有“四”,但它实际上支持五种运算,还包括一些三角函数。)
https://github.com/pyparsing/pyparsing/blob/master/examples/simpleBool.py 是一个布尔中缀表示法解析器/计算器,使用了pyparsing的一个辅助方法
operatorPrecedence
,这个方法简化了中缀运算符的定义。https://github.com/pyparsing/pyparsing/blob/master/examples/simpleArith.py 和 https://github.com/pyparsing/pyparsing/blob/master/examples/eval_arith.py 是对
fourFn.py
的重写,使用了operatorPrecedence
。第一个只是解析并返回一个解析树;第二个则增加了计算逻辑。
如果你想要一个更现成的解决方案,可以看看plusminus,这是一个基于pyparsing的可扩展算术解析包。