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