Парсер Javascript для простого выражения - PullRequest
5 голосов
/ 27 июня 2009

Я хотел бы найти анализатор javascript, который может обрабатывать и оценивать простые выражения. Парсер должен уметь оценивать регулярные математические выражения и поддерживать пользовательские функции с параметрами. Он также должен поддерживать обработку строк. Конкатенация строк с || поддержка оператора предпочтительна, но это нормально, если + добьется цели.

Примеры выражения, которое должно обрабатываться парсером:

3 * (2 + 1) - 1

2 * func (2, 2)

func ('hello world', 0, 5) || 'ты'

Кто-нибудь реализовал такую ​​вещь или где я могу найти что-то подобное?

Ответы [ 6 ]

8 голосов
/ 28 июня 2009

У меня есть измененная версия синтаксического анализатора ActionScript (написанного на AS, а не на синтаксическом анализе AS), который поддерживает пользовательские функции, но не строки. Вероятно, было бы легко добавить поддержку строк, хотя. Я выложу его куда-нибудь, чтобы вы могли получить его на http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js.

Редактировать: Я довольно легко добавил базовую поддержку для строк. Он не поддерживает escape-последовательности и 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 работает, и вы можете использовать стандартные escape-последовательности JavaScript). Он также использует запятые для разделения аргументов для всех функций и || в качестве оператора конкатенации строк вместо +, который выполняет только сложение.

3 голосов
/ 27 июня 2009

не использовал его, но быстрый Google показывает http://jsfromhell.com/classes/math-parser

редактировать

То, что вы хотите сделать, может оказаться вне досягаемости первой ссылки, вы также можете взглянуть на "парсер для упрощенного JavaScript" Дугласа Крокфорда

Это просто синтаксический анализатор, поэтому вам придется выполнять всю оценку самостоятельно. Это, однако, сделает его несколько проще и не использует eval.

3 голосов
/ 27 июня 2009

Предполагая, что вы имеете в виду анализатор JavaScript в javascript, вы, вероятно, хотите eval ()

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

Просто отметьте, что eval при неправильном использовании может представлять угрозу безопасности.

2 голосов
/ 22 апреля 2013

Попробуйте math.js:

http://mathjs.org

Поставляется с обширным и простым в использовании синтаксическим анализатором, который также поддерживает назначение и использование переменных и функций, как в вашем примере выражения. Легко интегрируется с «родным» 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
0 голосов
/ 29 октября 2009

Нарцисс реализует правильный JS-синтаксический анализатор в JS: http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js. Написано Бренданом Айхом (создателем JS) тоже!

0 голосов
/ 15 июля 2009

В этом руководстве вы узнаете, как создавать произвольные парсеры / компиляторы. (В основном это автоматизирует конструирование парсеров рекурсивного спуска от грамматики, то есть вы можете легко изменить синтаксис выражения). Весь учебник сделан на JavaScript, поэтому он применим непосредственно к вам.

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

...