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.
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? –
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. –
est l'ensemble des fonctions "personnalisées" connues? –