5

我想找到一个可以处理和评估简单表达式的 javascript 解析器。解析器应该能够评估正则数学表达式,并支持带参数的自定义函数。它还必须支持字符串处理。使用 || 进行字符串连接 运营商支持是首选,但如果 + 可以解决问题也可以。

解析器应处理的表达式示例:

3 * (2 + 1) - 1

2 * 函数(2, 2)

func('你好世界', 0, 5) || ' 你'

有没有人实施过这样的事情,或者我在哪里可以找到类似的东西?

4

6 回答 6

9

我有一个支持自定义函数但不支持字符串的ActionScript 解析器的修改版本(用 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 转义序列)。它还使用逗号分隔所有函数的参数,并||作为字符串连接运算符而不是+,它只做加法。

于 2009-06-27T20:15:29.647 回答
3

没用过,但快速谷歌显示http://jsfromhell.com/classes/math-parser

编辑

您想要做的可能超出第一个链接的范围,您还可以查看 Douglas Crockford 的“用于简化 JavaScript 的解析器”

它只是一个解析器,因此您必须自己进行所有评估。但是,它会使它更容易一些,并且它不使用 eval。

于 2009-06-27T10:12:55.443 回答
3

试试 math.js:

http://mathjs.org

附带一个广泛且易于使用的解析器,它还支持变量和函数的赋值和使用,如您的示例表达式。与“本机”JavaScript 无缝集成:您可以从 Parsers 范围获取和设置变量和函数。

您的示例代码将被评估为:

var parser = math.parser();
parser.set('func', function () {
    // ... do something ...
});
parser.evaluate('3 * (2 + 1) - 1');
parser.evaluate('2 * func(2, 2)');
parser.evaluate('func("hello world", 0, 5) + " you"');

函数也可以在解析器本身中定义(目前只有单行函数):

parser.evaluate('function f(x, y) = x ^ y');
parser.evaluate('f(2, 3)'); // 8
于 2013-04-22T18:53:50.167 回答
2

假设您的意思是 javascript 中的 javascript 解析器您可能需要 eval()

见:https ://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval

请注意,如果使用不当,eval 可能会带来安全风险。

于 2009-06-27T09:48:23.090 回答
0

有关如何构建任意解析器/编译器的信息,请参阅本教程。(基本上,它自动从语法构造递归下降解析器,这意味着您可以轻松更改表达式语法)。整个教程都是用 JavaScript 完成的,所以它直接适用于你。

http://www.bayfronttechnologies.com/mc_tutorial.html

于 2009-07-15T00:13:52.833 回答
0

Narcissus在 JS 中实现了一个合适的 JS 解析器:http: //mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js。也由 Brendan Eich(JS 创建者)编写!

于 2009-10-29T20:49:43.627 回答