Вопрос

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

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

3 * (2 + 1) - 1

2 * функция (2, 2)

функция ('hello world', 0, 5) || 'ты'

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

Это было полезно?

Решение

У меня есть модифицированная версия Анализатор ActionScript (записывается как, а не разбирается КАК), который поддерживает пользовательские функции, но не строки.Хотя, вероятно, было бы легко добавить поддержку строк.Я загружу его куда-нибудь, чтобы вы могли получить его по адресу 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).Он также использует запятые для разделения аргументов для всех функций и || в качестве оператора конкатенации строк вместо +, который выполняет только сложение.

Другие советы

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

видишь: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval

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

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

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

То, что вы хотите сделать, может быть недоступно по первой ссылке, вы также могли бы взглянуть на Дугласа Крокфорда "анализатор для упрощенного 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.Автор сценария - Брендан Эйч (создатель JS) тоже!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top