سؤال

كيفية تقييم التعبيرات المنطقية المعقدة التي تم إنشاؤها في وقت التشغيل في برنامج جافا؟

مثال:

(x وy أو z) وs

مع المتغيرات المنطقية x، y، z ...

شكرًا

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

المحلول

استخدم http://docs.codehaus.org/display/JANINO/Home لأدنى عمل.أستطيع أن أفعل أكثر من مجرد تعبيرات بسيطة.

نصائح أخرى

باختصار شديد، أنت بحاجة إلى "تمثيل متوسط" للتعبيرات المنطقية.هذه شجرة مكونة من Node أشياء. Node لديه هذه الفئات الفرعية AndNode, OrNode, NotNode, ، و VariableNode.ان AndNode لديه طفلين Nodeس، ان OrNode لديه طفلين Nodeق، و أ NotNode لديه طفل واحد Node.

أ VariableNode لديه فقط اسم متغير سلسلة، على سبيل المثال، "x".سيكون لديك HashMap<String, Boolean> حيث يكون لكل مفتاح اسم متغير قيمة منطقية مرتبطة.

تحتوي كل فئة عقدة على eval() الطريقة التي تقيم تعبيرها وترجع أ boolean.ال VariableNode.eval() تبحث الطريقة عن قيمة المتغير في ملفك HashMap ويعيدها. NotNode.eval() عائدات !child.eval(). AndNode.evaluate() عائدات child1.eval() && child2.eval(), ، بينما OrNode.evaluate() عائدات child1.eval() || child2.eval().لتقييم شجرة التعبير المنطقي بالكامل، ما عليك سوى استدعاء العقدة الجذرية eval() طريقة.

يمكنك إنشاء أشجار التعبير المنطقية هذه برمجيًا، باستخدام مُنشئات Java، وما إلى ذلك.

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

كيف تقيم التعبير المنطقي؟يمكن تقييم التعبيرات المنطقية مثل تلك على أنها شجرة بناء جملة ، وأعتقد أن هناك بعض المعلومات الجيدة في هذا السؤال ذي الصلة المنطقمحلل التعبير

الشيء الآخر الذي يتبادر إلى الذهن هو أنك تريد أن تكون قادرًا على التعامل مع التعبيرات المنطقية كبيانات ، والتي تبدو أكثر ملاءمة للغة برمجة مثل Jython أو JRuby أو Groovy أو Scala (بافتراض أنك مقيد بـفي JVM).على الرغم من أنني أشك في أنه سيكون من الصعب جدًا كتابة محلل للتعامل مع التعبيرات الأساسية و / أو غير المنطقية.

سيتعين عليك إنشاء شجرة تعبير وربط كل ورقة بقيمة منطقية.لتحليل هذا التعبير وإنشاء AST ، ألق نظرة على خوارزمية Dijkstra Shunting Yard .يتم شرح كل شيء هناك وهو سهل التنفيذ إلى حد ما.

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