我想找到一个可以处理和评估简单表达式的javascript解析器。解析器应该能够评估常规数学表达式,并支持带参数的自定义函数。它还必须支持字符串处理。字符串连接||操作员支持是首选,但如果+可以做到这一点就没关系。
应由解析器处理的表达式示例:
3 *(2 + 1) - 1
2 * func(2,2)
func('hello world',0,5)|| '你'
有没有人实现过这样的事情,或者我在哪里可以找到类似的东西?
答案 0 :(得分:8)
我有一个ActionScript parser的修改版本(用AS编写,而不是解析AS),它支持自定义函数,但不支持字符串。虽然添加字符串支持可能很容易。我会将其上传到某处,以便您可以在 http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js上找到它。
编辑:我非常轻松地添加了对字符串的基本支持。它不支持转义序列,并且toJSFunction不起作用,但只需几分钟就可以使其工作。将连接运算符更改为“||”应该也很容易。
以下是评估示例表达式的方法:
js> var parser = new Parser();
js> parser.parse("3 * (2 + 1) - 1").evaluate();
8
js> parser.parse("2 * func(2; 2)").evaluate({ func:Math.pow });
8
js> function substr(s, start, end) { return s.substring(start, end); }
js> parser.parse("func('hello world'; 0; 5) + ' you'").evaluate({ func:substr });
hello you
我不记得为什么我用分号作为参数分隔符;我认为这与区分功能和内置“操作员”功能有关。
另一个编辑:
我一直在玩这个,现在有一个版本在http://silentmatt.com/parser3.js有更好的字符串支持(toJSFunction工作,你可以使用标准的JavaScript转义序列)。它还使用逗号分隔所有函数的参数,并使用||
作为字符串连接运算符而不是+
,这只是添加。
答案 1 :(得分:3)
假设你的意思是 javascript中的javascript解析器,你可能想要eval()
请参阅:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval
请注意,如果使用不当,eval可能会带来安全风险。
答案 2 :(得分:3)
尚未使用它,但快速谷歌显示http://jsfromhell.com/classes/math-parser
修改强>:
您想要做的事情可能超出了第一个链接,您还可以看看Douglas Crockford的"parser for Simplified JavaScript"
它只是一个解析器,所以你必须自己做所有的评估。但是,它会使它更容易,并且不使用eval。
答案 3 :(得分:2)
尝试math.js:
附带一个广泛且易于使用的解析器,它还支持在示例表达式中分配和使用变量和函数。与" native"无缝集成。 JavaScript:您可以从Parsers范围获取和设置变量和函数。
您的示例代码将评估为:
var parser = math.parser();
parser.set('func', function () {
// ... do something ...
});
parser.eval('3 * (2 + 1) - 1');
parser.eval('2 * func(2, 2)');
parser.eval('func("hello world", 0, 5) + " you"');
函数也可以在解析器本身中定义(目前只有单行函数):
parser.eval('function f(x, y) = x ^ y');
parser.eval('f(2, 3)'); // 8
答案 4 :(得分:0)
有关如何构建任意解析器/编译器的信息,请参阅本教程。 (基本上它自动构建递归下降解析器 来自语法,意思是你可以轻松地改变你的表达式语法)。 整个教程是用JavaScript完成的,所以它直接适用于你。
答案 5 :(得分:0)
Narcissus在JS中实现了一个正确的JS解析器:http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js。由Brendan Eich(JS创作者)撰写!