سؤال

أرغب في العثور على محلل جافا سكريبت يمكنه التعامل مع التعبيرات البسيطة وتقييمها.يجب أن يكون المحلل اللغوي قادرًا على تقييم التعبيرات الرياضية العادية ودعم الوظائف المخصصة باستخدام المعلمات.كما يجب أن يدعم التعامل مع السلاسل.سلسلة متسلسل مع || يفضل دعم المشغل ، ولكن لا بأس إذا كان + سيقوم بالخدعة.

أمثلة على التعبير الذي يجب أن يتعامل معه المحلل اللغوي:

3 * (2 + 1) - 1

2 * وظيفة (2، 2)

Func ('Hello World' ، 0 ، 5) || ' أنت'

هل قام أحد بتنفيذ شيء من هذا القبيل أو أين يمكنني العثور على شيء مماثل؟

هل كانت مفيدة؟

المحلول

لدي نسخة معدلة من محلل أكشن سكريبت (مكتوب باللغة AS، وليس التوزيع AS) يدعم الوظائف المخصصة، ولكن ليس السلاسل.ربما يكون من السهل إضافة دعم السلسلة بالرغم من ذلك.سأرفعه في مكان ما حتى تتمكن من الحصول عليه http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js.

يحرر: أضفت الدعم الأساسي للسلاسل بسهولة تامة.إنه لا يدعم تسلسل الهروب ولا يعمل 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، ويمكنك استخدام تسلسلات الهروب القياسية لجافا سكريبت).كما يستخدم الفواصل لفصل الوسائط لجميع الوظائف و || كمشغل تسلسل السلسلة بدلاً من +, ، والذي يقوم فقط بالإضافة.

نصائح أخرى

وعلى افتراض تقصد محلل جافا سكريبت في جافا سكريبت، وربما كنت ترغب حدة التقييم ()

وانظر: https://developer.mozilla.org/En/Core_JavaScript_1 .5_Reference / Global_Functions / وحدة التقييم

ولكن لاحظ أن وحدة التقييم، إذا ما استخدمت بشكل غير صحيح، يمكن أن تمثل خطرا أمنيا.

لم تستخدم، ولكن يكشف عن جوجل سريعة http://jsfromhell.com/classes/ الرياضيات محلل

تعديل : ل

وماذا تريد أن تفعل قد يكون بعيدا عن متناول الحلقة الأولى، هل يمكن أن يكون أيضا نظرة على دوغلاس كروكفورد في <لأ href = "http://javascript.crockford.com/tdop/index.html" يختلط = "نوفولو noreferrer"> "محلل للالمبسطة جافا سكريبت"

وانها مجرد محلل، لذلك سيكون لديك للقيام بكل تقييم نفسك. فإنه، مع ذلك، تجعل من السهل إلى حد ما، وأنها لا تستخدم وحدة التقييم.

وحاول math.js:

http://mathjs.org

ويأتي مع واسعة وسهلة الاستخدام اللغوي، والذي يدعم أيضا مهمة واستخدام المتغيرات والوظائف كما هو الحال في المثال التعبير الخاص بك. يدمج بسهولة مع جافا سكريبت "الأصلي": يمكنك الحصول على وتعيين المتغيرات وظائف من نطاق موزعي

وسيتم تقييم رمز المثال لديك ما يلي:

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

ويمكن أيضا تعريف وظائف في محلل نفسه (حاليا فقط وظائف سطر واحد):

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

وانظر هذا البرنامج التعليمي لكيفية بناء موزعي التعسفية / المجمعين. (اساسا انها بأتمتة بناء الترميز التكراري النموذجي من قواعد النحو، مما يعني أنه يمكن تغيير التعبير اللغوي بسهولة). ويتم ذلك البرنامج التعليمي كله في جافا سكريبت، لذلك ينطبق مباشرة لك.

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

نرجس تنفذ محلل JS السليم في JS: <أ href = ل "http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js" يختلط = "noreferrer نوفولو"> http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse. شبيبة . كتبه برندان إيتش (الخالق JS) أيضا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top