Question

Je voudrais trouver un analyseur JavaScript capable de gérer et d’évaluer les expressions simples. L'analyseur doit pouvoir évaluer les expressions mathématiques habituelles et prendre en charge des fonctions personnalisées avec des paramètres. Il doit également prendre en charge la gestion des chaînes. Concaténation de chaînes avec || le support opérateur est préféré, mais il est normal que + fasse l'affaire.

Exemples d'expressions devant être traitées par l'analyseur:

3 * (2 + 1) - 1

2 * func (2, 2)

func ('bonjour le monde', 0, 5) || 'vous'

Quelqu'un at-il mis en œuvre une telle chose ou où puis-je trouver quelque chose de similaire?

Était-ce utile?

La solution

Je dispose d'une version modifiée d'un analyseur ActionScript (écrit en AS, pas d'analyse). AS) qui supporte les fonctions personnalisées, mais pas les chaînes. Il serait probablement facile d'ajouter un support de chaîne cependant. Je le téléchargerai quelque part pour que vous puissiez l'obtenir à l'adresse http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js .

Modifier: j'ai ajouté assez facilement le support de base pour les chaînes. Il ne prend pas en charge les séquences d'échappement et toJSFunction ne fonctionne pas, mais cela n'a pris que quelques minutes pour que cela fonctionne. Modification de l'opérateur de concaténation en & Quot; || & Quot; devrait être assez facile aussi.

Voici comment vous évalueriez vos expressions exemples:

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

Je ne me souviens pas pourquoi j'ai utilisé des points-virgules comme séparateurs d'arguments; Je pense que cela a quelque chose à voir avec la différenciation entre les fonctions et & "; Opérateur &" Intégré; fonctions.

Une autre modification:

Je joue un peu avec cela, et il existe maintenant une version avec un meilleur support des chaînes sur http: // silentmatt.com/parser3.js (toJSFunction fonctionne et vous pouvez utiliser des séquences d'échappement JavaScript standard). Il utilise également des virgules pour séparer les arguments de toutes les fonctions et || en tant qu'opérateur de concaténation de chaînes au lieu de +, qui ne fait que l'addition.

Autres conseils

En supposant que vous entendez un analyseur syntaxique javascript en javascript, vous souhaitez probablement eval ()

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

Notez que eval, s'il est utilisé de manière incorrecte, peut représenter un risque pour la sécurité.

ne l'a pas utilisé, mais un rapide Google révèle http://jsfromhell.com/classes/ analyseur mathématique

modifier :

Ce que vous voulez faire peut être hors de portée du premier lien, vous pouvez également consulter le " analyseur syntaxique pour JavaScript simplifié "

Ce n’est qu’un analyseur syntaxique, vous devez donc effectuer vous-même toutes les évaluations. Cela rendrait toutefois les choses un peu plus faciles et n’utilisera pas eval.

Essayez math.js:

http://mathjs.org

Fourni avec un analyseur complet et facile à utiliser, qui prend également en charge l’affectation et l’utilisation de variables et de fonctions, comme dans votre exemple d’expression. S'intègre parfaitement avec & Quot; native & Quot; JavaScript: vous pouvez obtenir et définir des variables et des fonctions à partir de la portée des analyseurs.

Votre exemple de code serait évalué comme suit:

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

Les fonctions peuvent également être définies dans l'analyseur lui-même (pour le moment, seules les fonctions sur une seule ligne):

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

Voir ce tutoriel pour savoir comment construire des analyseurs / compilateurs arbitraires. (Fondamentalement, il automatise la construction d’analyseurs de descente récursifs de grammaires, ce qui signifie que vous pouvez changer facilement la syntaxe de votre expression). L'ensemble du tutoriel est réalisé en JavaScript, il s'applique donc directement à vous.

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

Narcissus implémente un analyseur JS approprié dans JS: http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse. js . Écrit par Brendan Eich (le créateur de JS) aussi!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top