2009-06-27 3 views
5

Je voudrais trouver un analyseur JavaScript qui peut gérer et évaluer des expressions simples. L'analyseur doit être capable d'évaluer les expressions mathématiques normales et de 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îne avec || le support de l'opérateur est préféré, mais ça va si + va faire l'affaire.Analyseur Javascript pour l'expression simple

Des exemples d'une expression qui doit être manipulé par l'analyseur:

3 * (2 + 1) - 1

2 * func (2, 2)

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

Est-ce que quelqu'un a mis en place une telle chose ou où puis-je trouver quelque chose de similaire?

+0

recherchez-vous un analyseur javascript courir dans une langue différente? comme une implémentation C++ d'un analyseur JavaScript? Ou quelque chose en javascript pour javascript? –

+0

Désolé si je n'étais pas clair à ce sujet. Non, je veux dire un analyseur écrit en javascript qui analyse et évalue une expression simple comme décrit ci-dessus. –

+0

est l'ensemble des fonctions "personnalisées" connues? –

Répondre

8

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

Édition: J'ai ajouté un support de base pour les chaînes assez facilement. Il ne supporte pas les séquences d'échappement et toJSFunction ne fonctionne pas, mais cela n'a pris que quelques minutes pour le faire fonctionner. Modification de l'opérateur de concaténation en "||" devrait être assez facile aussi.

Voilà comment vous évaluer vos expressions par exemple:

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 je comme séparateurs des points-virgules argument; Je pense que cela a quelque chose à voir avec la différenciation entre les fonctions et les fonctions "opérateur" intégrées.

Une autre édition:

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

+0

Merci mon ami. J'apprécie vraiment votre aide. Celui-ci correspond à ce que j'ai décrit et il est également facile à modifier et à étendre. C'est ce que je cherchais. Je suis vraiment reconnaissant pour cela. –

+0

Un autre commentaire ... Matthew, ai-je oublié de dire que vous êtes génial! J'apprécie vraiment la modification dans la troisième version de l'homme. Continuez votre bon travail. Bonne chance. –

+0

Pas de problème. J'avais l'intention de jouer avec cela pendant un certain temps (je ne l'ai pas touché depuis plusieurs mois). Une grande partie du mérite revient à Raphael Graf, qui a écrit la version originale. –

3

En supposant que vous voulez dire un analyseur javascript dans javascript, vous voulez probablement eval()

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

noter que juste eval, si elle est utilisée de manière incorrecte, peut représenter un risque pour la sécurité.

+0

Non, eval n'est pas un choix pour moi. Comme vous l'avez dit, cela présentera des risques pour la sécurité et, dans mon cas, le risque est très élevé. Je veux un analyseur personnalisé et limité pour faire ce qui est décrit ci-dessus. Mais merci –

3

ont pas utilisé, mais un rapide Google révèle http://jsfromhell.com/classes/math-parser

modifier:

Qu'est-ce que vous voulez faire peut-être hors de portée du premier lien, vous pouvez aussi jeter un oeil à C'est un simple analyseur, donc vous devriez faire toute l'évaluation vous-même. Cela rendrait cependant un peu plus facile et n'utilisera pas eval.

+0

Merci. Celui-ci semble prometteur et le plus proche de ma demande, cependant, il manque de support de chaînes. Il est également difficile de le modifier pour prendre en charge les chaînes, car il ne se contente pas d'une approche récursive plutôt que d'une méthode d'analyse optimisée (mais agréable). Quelqu'un peut-il aider à le modifier pour soutenir les chaînes? –

0

Consultez ce didacticiel pour savoir comment créer des analyseurs/compilateurs arbitraires. (Fondamentalement, il automatise la construction des analyseurs de descente récursifs à partir des grammaires, ce qui signifie que vous pouvez changer votre syntaxe d'expression facilement). Le tutoriel complet est fait en JavaScript, donc il s'applique directement à vous.

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

2

Try math.js:

http://mathjs.org

équipement bénéficie d'un et facile à utiliser l'analyseur, qui prend également en charge l'affectation et l'utilisation des variables et des fonctions comme dans votre exemple d'expression. S'intègre de manière transparente avec le JavaScript "natif": vous pouvez obtenir et définir des variables et des fonctions à partir de la portée des analyseurs.

Votre exemple de code serait évaluée comme:

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 (actuellement que des fonctions d'une seule ligne):

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