هل "Regex" في لغات البرمجة الحديثة حقًا "قواعد حساسة للسياق"؟

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

سؤال

على مر السنين ، أصبحت مطابقة نمط "Regex" أكثر قوة إلى النقطة التي أتساءل فيها: هل هو مجرد مجرد مطابقة للسياق حساسة للسياق؟ هل هو تباين/تمديد لمطابقة الجارام الخالية من السياق؟ أين هو الآن ولماذا لا نسميها فقط من "التعبير العادي" القديم المقيد؟

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

المحلول

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

نصائح أخرى

الطريقةالتي اراه بها:

  • اللغات العادية:
    • تتطابق مع آلات الدولة. يمكن استخدام متغير واحد فقط لتمثيل "الموقع" الحالي في القواعد المراد مطابقة: لا يمكن تنفيذ العودية
  • لغات خالية من السياق:
    • يتطابق مع آلة مكدس. يتم تمثيل "الموقع" الحالي في القواعد النحوية بمكدس في شكل أو آخر. لا يمكن "تذكر" أي شيء حدث من قبل
  • اللغات الحساسة للسياق:
    • معظم لغات البرمجة
    • الجميع معظم اللغات البشرية

أنا أعرف عن محلات التعبير المنتظمة التي تسمح لك بالمطابقة مع شيء واجهه المحلل بالفعل ، حيث حقق شيئًا مثل قواعد حساسة للسياق.

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

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

هناك ميزات في تطبيقات التعبير العادية الحديثة التي تحطم قواعد تعريف التعبير العادي الكلاسيكي.

فمثلا Microsoft's .NET مجموعة موازنة (?<name1-name2> … ):

^(?:0(?<L>)|1(?<-L>))*(?(L)(?!))$

هذه يفعل تطابق اللغة ل₀₁ = {ε, ، 01 ، 0011 ، 000111 ، ...}. لكن هذه اللغة ليست منتظمة وفقًا لـ ضخ ليما.

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