التحقق من صحة المعادلات الخطية مع التعبيرات العادية؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

كيف يمكنني التحقق من صحة المعادلات الخطية مع تعبيرات منتظمة أو هل هناك طريقة أخرى إلى جانب استخدام التعبيرات العادية. سأستخدم ^ للإشارة إلى الأسس.

2x + 3 = 8 // يجب التحقق من صحة الغرامة

3x + 2y + 4Z = 12 // يجب التحقق من صحة الغرامة

4x^2 + 2y = 22 // لا ينبغي التحقق من صحة بسبب القوة.

4xy + 3y = 45 // لا ينبغي التحقق من صحة بسبب ناتج اثنين من المجهولين.

2/x + 4y = 22 // لا ينبغي التحقق من صحة هذا بسبب المجهول في المقام

(3/4) x + 3y + 2z = 40 // يجب التحقق من صحة الغرامة.

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

المحلول

سأبدأ بكتابة تعريف لمعادلة خطية صالحة باستخدام backus-naur تدوين ، مع أشياء مثل:

<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>

وهلم جرا.

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

قد تجد أن التعبيرات العادية محدودة للغاية لفعل ما تحتاجه - أنا فقط لا أستخدمها بما يكفي لمعرفتها.

نصائح أخرى

الحالات التي ذكرتها سهلة:

fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;

(هذا هو بناء جملة بيرل ، على افتراض $_ يحتوي على التعبير ، و fail هل ما تفعله عندما تريد الاستسلام.)

هنا يمكنك استبدال xyz مع كل ما هو تعبير صحيح لمتغير واحد.

ولكن بشكل عام ، سيتطلب ذلك تحليلًا فعليًا للتعبير ، وهو مهمة لـ LEX/YACC أو شيء من هذا القبيل ، وليس تعبيرًا منتظمًا.

على سبيل المثال ، إذا كان "XY" اسمًا متغيرًا شرعيًا ، فهذا بالطبع كل هذا ينهار.

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