用于简单表达式的 Javascript 解析器

发布于 2024-07-25 19:06:57 字数 1543 浏览 8 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

白鸥掠海 2024-08-01 19:06:57

我有一个 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 转义序列)。 它还使用逗号分隔所有函数的参数,并使用 || 作为字符串连接运算符,而不是仅进行加法的 +

I have a modified version of an ActionScript parser (written in AS, not parses AS) that supports custom functions, but not strings. It would probably be easy to add string support though. I'll upload it somewhere so you can get it at http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js.

Edit: I added basic support for strings pretty easily. It doesn't support escape sequences and toJSFunction doesn't work, but it only took a few minutes to get it working. Changing the concatenation operator to "||" should be pretty easy too.

Here's how you would evaluate your example expressions:

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

I don't remember why I used semicolons as argument separators; I think it has something to do with differentiating between functions and built-in "operator" functions.

Another edit:

I've been playing with this a little, and now there's a version with better string support at http://silentmatt.com/parser3.js (toJSFunction works, and you can use standard JavaScript escape sequences). It also uses commas to separate arguments for all functions and || as the string concatenation operator instead of +, which only does addition.

浪漫人生路 2024-08-01 19:06:57

尝试 math.js:

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

Try math.js:

http://mathjs.org

Comes with an extensive and easy to use parser, which also supports assignment and usage of variables and functions like in your example expression. Integrates seamlessly with "native" JavaScript: you can get and set variables and functions from the Parsers scope.

Your example code would be evaluated as:

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"');

Functions can also be defined in the parser itself (currently only single-line functions):

parser.evaluate('function f(x, y) = x ^ y');
parser.evaluate('f(2, 3)'); // 8
岁月蹉跎了容颜 2024-08-01 19:06:57

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

编辑

您想要做的事情可能超出了第一个链接的范围,您也可以看看Douglas Crockford的"简化 JavaScript 的解析器"

它只是一个解析器,所以你必须自己完成所有的评估。 然而,它会让事情变得更容易,而且它不使用 eval。

haven't used it, but a quick google reveals http://jsfromhell.com/classes/math-parser

edit:

What you want to do may be out of reach of the first link, you could also have a look at Douglas Crockford's "parser for Simplified JavaScript"

It's just a parser, so you would have to do all the evaluation yourself. It would, however, make it somewhat easier and it doesn't use eval.

何时共饮酒 2024-08-01 19:06:57

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

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

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

Assuming you mean a javascript parser in javascript, you probably want eval()

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

Just note that eval, if used improperly, can represent a security risk.

葬シ愛 2024-08-01 19:06:57

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

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

See this tutorial for how to build arbitrary parsers/compilers.
(Basically it automates the construction of recursive descent parsers
from grammars, meaning you can change your expression syntax easily).
The whole tutorial is done in JavaScript, so it applies directly to you.

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

迷荒 2024-08-01 19:06:57

尝试 js-expression-eval

它是基于 javascript 的字符串表达式评估库。

该库可以计算字符串表达式并返回结果。 它支持基本的算术运算,还支持自定义变量和函数。

例子:

const parser = new ExpressionParser('A.B + A.C' ,
 { 
    A: (identifier) => {
    switch (identifier) {
        case 'B':
            return 2;
        case 'C':
            return 3;
        }
    }
});
const result = parser.evaluate();
console.log(result); // 5

Try js-expression-eval

It is javascript based string expression evaluation library.

This library can evaluate a string expression and return the result. It supports basic arithmetic operations and it also supports custom variables and functions.

Example:

const parser = new ExpressionParser('A.B + A.C' ,
 { 
    A: (identifier) => {
    switch (identifier) {
        case 'B':
            return 2;
        case 'C':
            return 3;
        }
    }
});
const result = parser.evaluate();
console.log(result); // 5
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文