1

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

我已经尝试了一些使用循环和分割条件字符串的实验......但我觉得我错过了某种可以使这更有效和更直接的技术。我感觉正则表达式在这里可能有用,但也许没有。

这是一个示例字符串:

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

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

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

4

1 回答 1

0

您面临的问题称为解析,并且有许多解决方案。首先,您可以为您的迷你语言编写自己的“解释器”,包括词法分析器(将字符串拆分为标记)、解析器(从标记流构建树结构)和执行器,它遍历树并计算最终值。或者您可以使用像PEG这样的解析器生成器并自动为您构建整个东西 - 您只需提供您的语言规则。最后,您可以使用 javascript 内置的解析器/评估器eval。这是迄今为止最简单的选择,但 eval 只理解 javascript 语法 - 所以你必须在 eval 之前将你的语言翻译成 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
于 2013-05-30T15:58:56.820 回答