用于简单表达的Javascript解析器

时间:2009-06-27 09:17:15

标签: javascript parsing expression evaluation

我想找到一个可以处理和评估简单表达式的javascript解析器。解析器应该能够评估常规数学表达式,并支持带参数的自定义函数。它还必须支持字符串处理。字符串连接||操作员支持是首选,但如果+可以做到这一点就没关系。

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

3 *(2 + 1) - 1

2 * func(2,2)

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

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

6 个答案:

答案 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:

http://mathjs.org

附带一个广泛且易于使用的解析器,它还支持在示例表达式中分配和使用变量和函数。与" 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完成的,所以它直接适用于你。

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

答案 5 :(得分:0)

Narcissus在JS中实现了一个正确的JS解析器:http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js。由Brendan Eich(JS创作者)撰写!