将字符串格式的条件语句转换为实际逻辑

时间:2013-05-30 15:01:48

标签: javascript conditional

我对实时图形编程和Web开发有很好的了解,并且我已经启动了一个项目,它要求我采用用户创建的条件字符串并在代码中实际使用这些条件。这对我来说是一种全新的编程问题。

我尝试了一些使用循环和切片条件字符串的实验...但我觉得我缺少某种技术可以使这更有效和直接。我有一种感觉,正则表达式在这里可能有用,但也许不是。

以下是一个示例字符串:

"IF#VAR#>=2AND$VAR2$==1OR@VAR3@<=3"

这些实际变量的值将来自一个对象数组。此外,变量周围的不同标记符号表示可以找到实际值的不同对象数组(变量名称是索引)。

我可以完全控制条件字符串的格式(在IF / ELSE / ELSEIF和/或中添加符号) 以及不同操作数周围的特殊符号)所以我的选择相当开放。你会如何处理这样的编程问题?

1 个答案:

答案 0 :(得分:0)

您遇到的问题称为parsing,并且有许多解决方案。首先,您可以为您的迷你语言编写自己的“解释器”,包括词法分析器(将字符串拆分为标记),解析器(从标记流构建树结构)和执行程序,它们遍历树并计算最终价值。或者您可以使用像PEG这样的解析器生成器,并自动为您构建整个内容 - 您只需提供语言规则。最后,您可以使用javascript内置解析器/评估器eval。这是迄今为止最简单的选项,但是eval只能理解javascript语法 - 所以你必须在评估它之前将你的语言翻译成javascript。由于eval可以运行任意代码,因此不能在不受信任的环境中使用。

以下是如何在样本输入中使用eval的示例:

expr = "#VAR#>=2AND$VAR2$==1OR@VAR3@<=3"

vars = {
    "#": {"VAR":5},
    "$": {"VAR2":1},
    "@": {"VAR3":7}
}

expr = expr.replace(/([#@$])(\w+)(\1)/g, function($0, $1, $2) {
    return "vars['" + $1 + "']." + $2;
}).replace(/OR/g, "||").replace(/AND/g, "&&")

result = eval(expr) // returns true