هل هناك طريقة بسيطة يمكنني تميز سلسلة بدون Lexer الكامل؟
-
22-09-2019 - |
سؤال
أنا أتطلع إلى تنفيذ خوارزمية الساحة, ، لكنني بحاجة إلى بعض المساعدة في معرفة ما هي أفضل طريقة لتقسيم سلسلة إلى الرموز.
إذا لاحظت ، فإن الخطوة الأولى من الخوارزمية هي "قراءة رمز". هذا ليس بالضبط شيء غير تميز. يمكن أن تتكون الرموز من الأرقام والمشغلين والباريس.
إذا كنت تفعل شيئًا مثل:
(5+1)
سوف تعطيني سلسلة بسيطة.
ومع ذلك ، يصبح الأمر أكثر تعقيدًا إذا كان لديك أرقام بأرقام متعددة مثل:
((2048*124) + 42)
الآن سلسلة ساذجة. split () لن تقوم بالخدعة. الأرقام متعددة الأرقام مشكلة.
أعلم أنه يمكنني كتابة Lexer ، لكن هل هناك طريقة للقيام بذلك دون كتابة Lexer الكامل؟
أنا أقوم بتنفيذ هذا في JavaScript وأود تجنب الاضطرار إلى النزول في مسار Lexer إن أمكن. سأستخدم المشغلون "*" و "+" و "-" و "/" ، إلى جانب الأعداد الصحيحة.
المحلول
ماذا عن التعبيرات العادية؟ يمكنك بسهولة كتابة Regex لتقسيمها بالطريقة التي تريدها ، وتقبل طريقة js.split regex كمعلمة أيضًا.
على سبيل المثال ... (تعديل لتضمين جميع chars التي تحتاجها وما إلى ذلك)
/([0-9]+|[*+-\/()])/
نصائح أخرى
يمكنك استخدام تطابق عالمي كما هو موضح في http://mikesamuel.blogspot.com/2009/05/fetication-parsing-in-javaScript.html
في الأساس ، يمكنك إنشاء regex واحد يصف رمزًا
/[0-9]+|false|true|\(|\)/g
ووضع 'g' في النهاية بحيث تتطابق مع العالم ، ثم تسمي طريقة المطابقة الخاصة بها
var tokens = myRegex.match(inputString);
واستعادة صفيف.