تنفيذ ساحة Shunting في PHP اللازم ، وتفسير وتحليل السلسلة تؤدي مقارنة رياضية وإرجاع نتيجة منطقية

StackOverflow https://stackoverflow.com/questions/3664017

سؤال

أنا أبحث عن شيء يمكن أن يفسر سلسلة في PHP وأداء حساب الرياضيات البسيط ، ثم إعادة نتيجة منطقية فيما إذا كان التعبير صحيحًا أم خطأ.

فمثلا:

  1. أنواع سو في "3*{mysalary}/9 = 10000"
  2. PHP ينقسم هذا إلى تعبيرين - تنفجر ('=' ، سلسلة) ؛
  3. يأخذ PHP قائمة حقول قاعدة البيانات الخاصة بي ، ويحل محل أي حقول "{}" المحددة مع البيانات (typecasted to int)
  4. ثم يقوم PHP بتقييم تعبير الرياضيات
  5. ثم يقارن PHP الجانب الأيسر بالجانب الأيمن
  6. نتيجة منطقية أنتجت.

قد يبدو الأمر معقدًا ولكنه يجب أن يكون بسيطًا جدًا. فيما يلي القيود: يتم إصلاح 1/ المشغلات الرياضية على: + -/ * 2/ يتم إصلاح مشغلات المقارنة إلى: => <> = <= 3/ لا تحتاج إلى مقارنات عن نقطة عائمة ، يمكن القيام بكل شيء على مستوى عدد صحيح. لذلك يمكن تقريب أي أقسام إذا لزم الأمر أو ببساطة حول النتيجة النهائية

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

هل شاهد أي شخص شيئًا يمكنه فعل هذا بالفعل؟ أعلم أنه يمكنني صنع شيء ما ولكن لماذا إعادة اختراع العجلة بشكل صحيح؟

إذا لم تر أي شيء تهتم بإدراج بعض "Gotcha's" أو التحذير الذي يمكنك التفكير فيه عند بناء هذا.

بعد قراءة المزيد ، أدرك أنه يمكنني استخدام خوارزمية ساحة Shunting. هل لدى أي شخص تنفيذ هذا في PHP؟

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

شكرًا.

جيسون

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

المحلول

ألق نظرة على evalmath الفصل على phpclasses. يجب أن يفعل هذا كل ما تريده إلى حد كبير ، بما في ذلك الاستبدال المتغير (مثل تحديد قيمة لـ "mysalary" في مثالك قبل تقييم التعبير)

نصائح أخرى

هناك تعبير محرك المحلل (تطبيقات ل JavaScript+Node, بي أتش بي, بيثون و ActionScript) ، على جيثب Xpresion (ملاحظة. أنا المؤلف)

المحرك مرن للغاية وقابل للتكوين ، يمكن للمرء أن ينشئ محللًا يوسع أي تعبير يتضمن أيضًا المتغيرات المعرفة من قبل المستخدم, وظائف محددة المستخدم, مشغلي الأشكال وعامة مشغلات n-ary (على سبيل المثال. الثلاثية إذا كان ثين إيليس)

الخوارزمية عامة تمامًا (يمكن للمرء أن يقول ، تباين معمم لـ خوارزمية ساحة Shunting)

النهج الذي أتبعه هو:

  1. رمز التعبير
  2. تحليلها في شجرة بناء الجملة مجردة
  3. إجراء بدائل متغيرة (انظر التقييم الحريفي)
  4. حساب النتيجة

حاليا...

  • خوارزمية الساحة الشاقة هي وسيلة للقيام بالخطوات 1 و 2.
  • يمكنك التحقق مما إذا كان التعبير صحيحًا بشكل نحلي بعد الخطوة الثانية
  • تعتمد كيفية حساب النتيجة على كيفية بناء AST.

أصعب خطوة هي الثانية. عليك أن تفكر في أسبقية المشغل ، أقواس وأشياء أخرى ، ولكن هناك الكثير من الأدبيات حول ذلك (يمكنك فقط متابعة رابط ويكيبيديا)

لماذا لا تقوم ببساطة ببدائل المتغيرات ، ثم تفعل أ preg_replace("/[^0-9+-*\/]/", '', $inputString), ، ثم استخدم أي منهما eval() أو create_function()؟ إذا كنت تستخدم هذا ، فيجب عليك التأكد من إزالة "عبارات" غير آمنة ، ولهذا السبب استخدمت preg_replace ، لذلك سوف يزيل أي سلسلة حرفية

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