Pregunta

Me gustaría encontrar un analizador de JavaScript que pueda manejar y evaluar expresiones simples. El analizador debería poder evaluar las expresiones matemáticas regulares y admitir funciones personalizadas con parámetros. También tiene que soportar el manejo de cadenas. Concatenación de cadenas con || Se prefiere el soporte del operador, pero está bien si + hará el truco.

Ejemplos de una expresión que el analizador debe manejar:

3 * (2 + 1) - 1

2 * func (2, 2)

func ('hola mundo', 0, 5) || 'usted'

¿Alguien ha implementado algo así o dónde puedo encontrar algo similar?

¿Fue útil?

Solución

Tengo una versión modificada de un analizador de ActionScript (escrito en AS, no analiza AS) que admite funciones personalizadas, pero no cadenas. Sin embargo, probablemente sería fácil agregar soporte de cadena. Lo cargaré en algún lugar para que pueda obtenerlo en http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js .

Editar: agregué soporte básico para cadenas con bastante facilidad. No admite secuencias de escape y toJSFunction no funciona, pero solo tardó unos minutos en hacerlo funcionar. Cambiar el operador de concatenación a & Quot; || & Quot; también debería ser bastante fácil.

Así es como evaluaría sus expresiones de ejemplo:

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

No recuerdo por qué usé punto y coma como separadores de argumentos; Creo que tiene algo que ver con diferenciar entre funciones y & Quot; operator & Quot; funciones.

Otra edición:

He estado jugando un poco con esto, y ahora hay una versión con mejor soporte de cadenas en http: // silentmatt.com/parser3.js (toJSFunction funciona, y puede usar secuencias de escape JavaScript estándar). También utiliza comas para separar los argumentos de todas las funciones y || como operador de concatenación de cadenas en lugar de +, que solo suma.

Otros consejos

Suponiendo que se refiere a un analizador de JavaScript en javascript, probablemente desee evaluar ()

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

Solo tenga en cuenta que eval, si se usa incorrectamente, puede representar un riesgo de seguridad.

no lo ha usado, pero un rápido google revela http://jsfromhell.com/classes/ analizador matemático

editar :

Lo que desea hacer puede estar fuera del alcance del primer enlace, también puede echar un vistazo a Douglas Crockford's " analizador de JavaScript simplificado "

Es solo un analizador, por lo que tendría que hacer toda la evaluación usted mismo. Sin embargo, lo haría un poco más fácil y no utiliza eval.

Pruebe math.js:

http://mathjs.org

Viene con un analizador extenso y fácil de usar, que también admite la asignación y el uso de variables y funciones como en su expresión de ejemplo. Se integra perfectamente con & Quot; native & Quot; JavaScript: puede obtener y establecer variables y funciones desde el ámbito de los analizadores.

Su código de ejemplo se evaluaría como:

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

Las funciones también se pueden definir en el analizador (actualmente solo funciones de una sola línea):

parser.eval('function f(x, y) = x ^ y');
parser.eval('f(2, 3)'); // 8

Vea este tutorial sobre cómo construir analizadores / compiladores arbitrarios. (Básicamente, automatiza la construcción de analizadores de descenso recursivo de gramáticas, lo que significa que puede cambiar la sintaxis de su expresión fácilmente). Todo el tutorial está hecho en JavaScript, por lo que se aplica directamente a usted.

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

Narcissus implementa un analizador JS adecuado en JS: http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse. js . ¡Escrito por Brendan Eich (el creador de JS) también!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top