我正在尝试构建一个可以解释简单条件的Javascript程序:
let condition = '5 + 6 > 10';
if( assert(condition) ){
//... do something
} else {
// ... do other thing
}
实现assert
的一种简单但不安全的方法是简单地使用eval
。它可以工作,但是会打开一个安全漏洞。我该如何解决?
我需要支持加减,字符串和数字比较以及括号管理。
有几种选择:
您可以手动为表达式编写标记器和解析器。对于这样的简单语法,这并不复杂,实际上是编程中的一个很好的练习]]
或者,您可以使用解析器生成器,例如peg或nearley。使用生成器,您可以使用特定语言编写语法,然后让生成器为您创建解析函数。看看他们的例子:https://pegjs.org/online,https://github.com/kach/nearley/tree/master/examples/calculator
最后,您可以使用成熟的Javascript解析器,例如esprima或acorn。这样,您将获得完整的javascript AST,您可以边走边进行计算。此方法比其他方法复杂得多,但是可以在表达式中提供javascript的全部功能,例如函数,正则表达式等。