用于简单表达的Javascript解析器

问题描述 投票:5回答:6

我想找到一个可以处理和评估简单表达式的JavaScript解析器。解析器应该能够计算正则表达式,并支持带有参数的自定义函数。它还必须支持字符串处理。用||进行字符串连接首选操作员支持,但是可以用+做到这一点。

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

3 *(2 +1)-1

2 * func(2,2)

func('hello world',0,5)|| '你'

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

javascript parsing expression evaluation
6个回答
9
投票
[http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js

Edit:我非常轻松地添加了对字符串的基本支持。它不支持转义序列,并且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转义序列)。它还使用逗号分隔所有函数的参数,并使用||作为字符串连接运算符,而不是+,后者仅进行加法。


3
投票
in javascript,则可能需要eval()

请参阅:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval

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

3
投票

edit:

您想做的事可能超出了第一个链接的范围,您也可以看看道格拉斯·克罗克福德的"parser for Simplified JavaScript"

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

3
投票
http://mathjs.org

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

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

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


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.