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

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

3 * (2 + 1) - 1

2 * 函数(2, 2)

功能(“ Hello World”,0,5)|| ' 你'

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

有帮助吗?

解决方案

我的的ActionScript解析器的修改版本(写在AS,不解析AS)支持自定义功能,但不是字符串。或许,这将是很容易,虽然添加字符串支持。我上传它的地方,这样你就可以在 http://silentmatt.com/parser2.js <得到它/ A> 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转义序列)。它还使用逗号的所有功能和||作为串并置运算符,而不是+,只做除了分隔参数。

其他提示

假设你的意思是一个JavaScript分析器的的JavaScript中,你可能想的eval()

请参阅: https://developer.mozilla.org/En/Core_JavaScript_1 .5_Reference / Global_Functions /评估和演示

不过请注意的eval,如果使用不当,可能对安全造成危险。

没有用它,但快速谷歌揭示 http://jsfromhell.com/classes/数学解析器

修改

您想要做可能是出于第一个链接够不到的地方是什么,你也可以看看道格拉斯Crockford的的 “解析器,用于简化的JavaScript”

这只是一个解析器,所以你必须自己做所有的评价。它将,但是,使其比较容易,它不使用eval。

尝试math.js:

http://mathjs.org

具有广泛的和易于配使用解析器,这也支持像在您的示例表达分配和变量和函数的使用。集成了“原生”的JavaScript无缝:你可以从解析器范围设置变量和函数

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

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

请参阅本教程如何构建任意的解析器/编译器。 (基本上,它可自动递归下降语法分析器的结构 从语法,这意味着你可以很容易地改变你的表达式语法)。 整个教程在JavaScript中完成的,因此它直接适用于你。

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

水仙花 在 JS 中实现正确的 JS 解析器: http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js. 。也是由 Brendan Eich(JS 创建者)编写的!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top