تحليل المفردات

تحليل المفردات أو التحليل المعجمي (بالإنجليزية: Lexical analysis)‏، هي عملية في علم الحاسوب تهدف إلى تحويل سلسلة من الحروف، كما في برامج الحاسب أو صفحات الإنترنت إلى سلسلة من الرموز التي تحمل معاني محددة مسبقًا. يُعرف أيضًا باسم المعجم أو المرمز أو الماسح.[1] تُعتبر المرحلة الأولى في هذه العملية هي «الماسح».

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

تطبيقاته

[عدل]

قارئ المفردات يشكل أول مرحلة من مراحل معالجة المترجم. التحليل يحدث عادة في مسار واحد في اللغات القديمة.

في اللغات الأقدم لغة  ألغول "ALGOL"، المرحلة البدائية كانت إعادة بناء السطر وجعله أكثر وضوحاً بتطبيق حذف المسافات البيضاء والتعليقات (وكان الماسح التحليلي منفصل عن مرحلة المعجم). تُنَفَّذ الآن الخطوات كجزء من قارئ المفردات.

المعجم والمحلل غالباً ما يتم استخدامهم كأدوات تحليل في المترجمات، ولكن يمكن استخدامها مع أدوات اللغة الخاصة بالكمبيوتر، مثل المطبوعات الجميلة أو المثالية (prettyprinters or linters). يمكن تقسيم التحليل إلى مرحلتين: الماسح وهو تقسيم سلسلة المدخلات إلى وحدات مفصليّة تسمى المفردة ثم يتم تقسيمهم إلى تصنيفات مرمزة والتقييم بحيث يتم تقيمها بتحويلها إلى قيم يتم معالجتها.

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

المفردة

[عدل]

إن المفردة عبارة عن سلسلة من الأحرف في البرنامج المصدر تتطابق مع النمط الخاص برمز مميز[2] ويتم تحديده بواسطة المحلل اللغوي.

بعض الكتاب يعبرون عنه باستخدام كلمة «رمز» لتمثيل السلسلة التي تم ترميزها وهو بيانات مهيكلة ناتجة عن معالجة سلسلة تم ترميزها. [3][4]

كلمة مفردة في علم الحاسب تختلف عن معناها في علم اللغة. في علم الحاسب كلمة مفردة تتطابق تقريبا إلى مسمى «كلمة» في علم اللغة. على الرغم من أنه في بعض الحالات قد يكون أكثر تشابهًا مع الشكل المورفمي (Morpheme).

الرمز "Token"

[عدل]

الرمز المعجمي هو سلسلة مسند إليها معنى معرف مسبقاً. وهو هيكل يحتوي على زوج من المعلومات اسم الرمز وقيمة الرمز الاختيارية. اسم الرمز هو فئة من الوحدة المعجمية.[2]

أشهر أسماء الرموز هي:

  • المعرفات (identifier): أسماء يختارها المبرمج.
  • الكلمات الرئيسية (keyword): أسماء موجودة ومحجوزة مسبقاً في لغة البرمجة.
  • الفواصل المعروفة أيضا باسم علامات الترقيم (separators): أحرف الترقيم والمُحددات المزدوجة.
  • المقارنات أو عوامل الرياضيات (operators): الرموز التي تعمل على القيم وتنتج نتائج.
  • حرفية (literals): رقمية، منطقية، نصية، المرجعية الحرفية.
  • التعليقات (comments): سطر أو مجموعة من الأسطر.
أمثلة على قيم رمزية معرفة:
اسم الرمز عينات على قيم الرموز
المعرفات (identifier) x, color, UP
الكلمات الرئيسية (keyword) if, while, return
الفواصل المعروفة أيضا بأسم علامات الترقيم (separators) }, (, ;
المقارنات أو عوامل الرياضيات (operators) +, <, =
حرفية (literals) true, 6.02e23, "music"
التعليقات (comments) // must be negative, /* Retrieves user data */

مثال لتعبير برمجي بلغة السي c

[عدل]

; x = a + b * 2

التحليل المعجمي لهذا التعبير ينتج التسلسل التالي من الرموز:

[(المعرف، x)، (عامل الرياضيات، =)، (المعرف، a)، (عامل التشغيل، +)، (المعرف، b)، (عامل التشغيل، *)، (قيمة حرفية،2)، (فاصل، ؛)]

اسم رمزي "token": هو ما يمكن أن يسمى جزءًا من الكلام في علم اللغة.

قواعد المعجم

[عدل]

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

يقسم المعجم إلى قسمين مهمين وهما المسافة البيضاء والتعليقات. وهم معرفين أيضاً في القاعدة وتعالج بواسطة قارئ المفردات؛ ولكن يمكن أن يهملها (لا ينتج أي رموز) ويعتبرها غير مهمة، وفي الغالب يفصل بين اثنين من الرموز (كما هو الحال في if  x بدلاً من ifx.). هناك استثناءان مهمان لهذا:

أولاً: في لغات القاعدة الجانبية التي تحدد الكتل ذات المسافات البادئة، تكون المسافة البيضاء الأولية هامة، لأنها تحدد هيكل الكتلة، ويتم التعامل معها عمومًا على مستوى المعجم. انظر هيكل العبارة، أدناه.

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

الترميز (Tokenizati

[عدل]

عملية الترميز هي عملية ترسيم وتصنيف أجزاء من سلسلة حروف الإدخال. ثم تنتقل الرموز المميزة الناتجة إلى شكل آخر من المعالجة. يمكن اعتبار العملية مهمة فرعية لتحليل المدخلات.

ملاحظة: الترميز في مجال امن علم الحاسب له معنى مختلف. على سبيل المثال، في السلسلة النصية التالية: الثعلب البني السريع يقفز فوق الكلب الكسول

The quick brown fox jumps over the lazy dog

لم تُقَسَّمْ السلسلة بشكل ضمني على المسافات، كما يفعل المتحدث بلغة طبيعية. يجب أن يتم تقسيم الإدخال الأولي، وهو 43 حرفًا، بشكل صريح إلى الرموز التسعة المميزة مع محدد مساحة أي (مطابقة السلسلة " " أو التعبير العادي /{s{1}/\).

يمكن تمثيل الرموز بلغة لغة الترميز القابلة للامتداد.

<sentence>

<word>The</word>

<word>quick</word> 

<word>brown</word>

<word>fox</word>

<word>jumps</word>

<word>over</word>

<word>the</word>

<word>lazy</word>

<word>dog</word>

</sentence>

أو كما في التعبير الرمزي: (s-expression)

(sentenc

(word The)

(word quick)

(word brown)

(word fox)

(word jumps)

(word over)

(word the)

(word lazy)

(word dog))

عندما تمثل فئة الرموز المميزة أكثر من مفردة واحدة، فإن قارئ المفردات غالباً ما يوفر معلومات كافية لإعادة إنتاج المفردة الأصلية، بحيث يمكن استخدامه في التحليل الدلالي. يسترد المحلل اللغوي عادة هذه المعلومات من قارئ المفردات ويخزنها في شجرة بناء الجملة.هذا ضروري لتجنب فقدان المعلومات في حالة الأرقام والمعرفات. يتم تحديد الرموز على أساس قواعد محددة من قارئ المفردات. تتضمن بعض الطرق المستخدمة لتحديد الرموز المميزة: التعبيرات العادية، وتسلسلات محددة من الأحرف التي تسمى علم، وأجزاء فصل محددة تسمى المحددات، وتعريف صريح من القاموس. تستخدم حروف خاصة بشكل شائع، بما في ذلك أحرف الترقيم، لتحديد الرموز المميزة بسبب استخدامها الطبيعي في اللغات المكتوبة واللغات البرمجية. غالباً ما يتم تصنيف الرموز حسب محتوى الحرف أو حسب السياق ضمن تدفق البيانات. يتم تعريف الفئات من خلال قواعد قارئ المفردات. تتضمن الفئات غالبًا عناصر قواعد اللغة المستخدمة في تدفق البيانات. غالبًا ما تصنف لغات البرمجة الرموز كمعرِّفات أو عوامل الرياضيات أو رموز التجميع أو حسب نوع البيانات. تصنف اللغات المكتوبة عادةً الرموز المميزة كأسماء أو أفعال وصفات وعلامات ترقيم. يتم استخدام الفئات للمعالجة اللاحقة للرموز إما عن طريق محلل ومن خلال وظائف أخرى في البرنامج. ليقوم محلل المعجمية عمومًا بأي شيء مع مجموعات الرموز، وهي مهمة متروكة للمحلل. على سبيل المثال، يتعرف محلل معجم نموذجي على الأقواس كرموز، ولكن لا يفعل شيئًا لضمان أن الكل "(" يتطابق مع ")". عندما يغذي قارئ الرموز، الرموز إلى المحلل اللغوي، يكون التمثيل المستخدم عادةً عبارة عن قائمة تعداد لتمثيل عدد. على سبيل المثال، يتم تمثيل «المعرفات» بـ0، «عاملا لتعيين» مع1، «مشغلا لإضافة» مع2، إلخ.يتم تعريف الرموز في كثير من الأحيان عن طريق التعبيرات العادية، والتي يفهمها مولد محلل معجمية مثلا لقانون. يقرأ المحلل اللغوي (الذي يتم إنشاؤه تلقائيًا بواسطة أداة مثلا لقانون، أو يدويًا) في مجموعة من الحروف، ويحدد اللفائف في التدفق، ويصنفها في رموز. هذا يسمى الترميز. إذا عثر قارئ المفردات على رمز مميز غير صالح، فسيبلغ عن خطأ. بعد الترميز هو التحليل. ومن هناك، يمكن تحميل البيانات المفسرة في هيا كل البيانات للاستخدام العام أو التفسير أو التجميع.

الماسح (Scanner)

[عدل]

الماسح وهو المرحلة الأولى، يعتمد الماسح على جهاز ذو حالة محدودة. وهو يقوم بترميز معلومات حول التتابعات المحتملة للأحرف التي يمكن احتواؤها على أي من الرموز التي تتعامل معها (تسمى التتابعات الفردية لهذه التتابعات المميزة المفردة).عل سبيل المثال، قد يحتوي العدد الصحيح على سلسلة من الأرقام الرقمية. في العديد من الحالات، يمكن استخدام أو لحرف غير المسافات البيضاء لاستخلاص نوع الرمز الذي يليه ثم تتم معالجة أحرف الإدخال اللاحقة في وقت واحد حتى الوصول إلى حرف ليس في مجموعة الأحرف المقبولة لهذا الرمز (هذا يُطلق عليها اسم «أكبر قضمة» أو «أطول تطابق». في بعض اللغات، تكون قواعد إنشاء المفردة أكثر تعقيدًا وقد تتضمن تراجعًا على أحرف سبق قراءتها. على سبيل المثال، فيC، لا تكفي حرف 'L' للتمييز بين المعرف الذي يبدأ بـ  'L' والسلسلة النصية الحرفية التي تبدأ ب الحرف ‘L’.

المُقيم (Evaluator)

[عدل]

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

على سبيل المثال، في مصدر الشفرة في برامج الكمبيوتر، السلسلة:

;(net_worth_future = (assets - liabilities

سوف يتم تحويلها إلى معجم الرموز، وسوف يتم إخفاء المسافات البيضاء والحروف المميزة التي لا تحتوي على قيم:

IDENTIFIER net_worth_future

EQUALS

OPEN_PARENTHESIS

IDENTIFIER assets

MINUS

IDENTIFIER liabilities

CLOSE_PARENTHESIS

SEMICOLON

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

يمكن تمثيل هذا بشكل مضغوط بواسطة السلسلة *[A-zap-Z _] [A-zA-Z_0-9]

وهذا يعني أي حرف من الأحرف A-Za-z قد يتبع بصفر أو أكثر من هذه الأحرف والأرقام 9-0.

التعبيرات العادية (Regular expressions) وآلات الحالة المحدودة (finite-state machines)التي تولدها ليست قوية بما يكفي للتعامل معا لأنماط المتكررة، مثل «عدد من فتح الأقواس، متبوعًا ببيان، متبوعًا بعدد من أقواس الإغلاق». فهم غير قادرين على الاحتفاظ بالعد، والتحقق من أن العدد هو نفسه في كلا الجانبين، ما لم تكن هنا كمجموعة محدودة من القيم المسموح بها. يأخذ محلل كامل للتعرف على هذه الأنماط في عموميتها بشكل عام. يمكن أن يقوم المحلل بدفع قوسين على كأس ثم محاولة إخراجها ومعرفة ما إذا كان الكأس فارغًا في النهاية. أنظر إلى المثال في كتاب[5](Structure and Interpretation of Computer Programs ).

العوائق (Obstacle)

[عدل]

عادة، يحدث الترميز على مستوى الكلمة. ومع ذلك، يصعب أحيانًا تحديد ما المقصود «بكلمة». يعتمد المرمز غالبًا على الاستدلال البسيط، على سبيل المثال:

  •  لا يتم تضمين علامات الترقيم والمسافات البيضاء في قائمة الناتجة.
  •  جميع السلاسل المتجاورة من الحروف الأبجدية هي جزء من رمز واحد. وبالمثل مع الأرقام.
  • يتم فصل الرموز عن طريق المسافات البيضاء على اعتبارها حرفاً، مثل: مسافة أو فاصل سطر، أو بأحرف الترقيم.

في اللغات التي تستخدم المسافات بين الكلمات (مثل الأكثر استخدامًا للحروف الأبجدية اللاتينية، ومعظم لغات البرمجة).

هذا النهج واضح إلى حد ما. ومع ذلك، حتى هنا، هناك العديد من حالات الحواف مثلا لتقلصات والكلمات الواصلة، والرموز، والبنى الكبيرة مثلURIs(والتي قد تعد لبعض الأغراض كرموز فردية).مثال: هو «مقرّه-نيويورك»

"New York-based"، قد يقسمها  المرمز الساذج على أساس المسافة على الرغم من أن هي من الممكن القول التقسيم الأفضل عند الواصلة.

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

البرمجيات

[عدل]
  • Apache OpenNLP: يتضمن ويعتمد على القواعد والرموز الإحصائية التي تدعم العديد من اللغات.
  • U-Tokenizer: واجهة برمجة التطبيقات على بروتوكول نقل النص التشعبي التي يمكن أن تقلل من الماندرينو الجمل اليابانية في حدود الكلمات. اللغة الإنجليزية مدعومة أيضًا.
  • HPE Haven OnDemand Text Tokenization API:(منتج تجاري، مع إمكانية وصول محدودة) يستخدم نمذجة المفهوم المتقدم الاحتمالي لتحديد الوزن الذي يحملها لمصطلح في فهارس النص المحددة.
  • أداة TheLex: تم تصميم الأداة ومترجمتها لتوليد رمز للتحليل المعجمية السريعة على أساس وصفر سمي للمعجمات المعجمية. ويعتبر عموما غير كافية للتطبيقات مع مجموعة معقدة من القواعد المعجمية ومتطلبات الأداء الشديدة. على سبيل المثال، يستخدم (GNU_Compiler_Collection (GCCرسائل مكتوبة بخط اليد.

مولد قارئ المفردات (lexer generator)

[عدل]

يتم إنشاء قارئ المفردات في كثير من الأحيان من قبل مولد قارئ المفردات، مماثلة لمولدات المحللات، وغالبا ما تأتي هذه الأدوات معا. الأكثر ترسخًا هو lex، مقترنًا بمولد محلل yacc، والمكافئ المجاني المرن / البيسون. هذه المولدات هي شكل من أشكال لغة محددة المجال، معا لأخذ في مواصفة معجمية –عموما التعبيرات العادية مع بعض العلامات- وتنبعث من قارئ المولدات. تنتج هذه الأدوات تطوراً سريعاً جداً، وهو أمر مهم جداً في التطوير المبكر، سواء للحصول على قاموس صحيح ولأن مواصفات اللغة قد تتغير في كثير من الأحيان. علاوة على ذلك، فإنها غالباً ما توفر ميزات متقدمة، مثلما قبل وبعد الشروط التي يصعب برمجة باليد. ومع ذلك، قد يفتقر قارئ المفردات الذي تم إنشاؤه تلقائيا المرونة، وبالتالي قد تتطلب بعض التعديل اليدوي، أو قارئ المفردات مكتوباً يدويا بالكامل. يعتبر أداء المفردات أمرًا مثيرًا للقلق، كما أن تحسينه أمر جدير بالاهتمام، وأكثر من ذلك في اللغات المستقرة حيث يتم تشغيل نقطة المفردات في كثير من الأحيان مثلHTML ولغة c.

lex/flex المفردات سريعاً بشكل معقول، ولكن التحسينات التي تتم مرتين أو ثلاث مرات ممكنة باستخدام مولدات أكثر ضبطًا. تستخدم أحيان المفكرة المكتوبة بخط اليد المفردات، ولكن مولدات المفتررات الحديثة المفترض أن تنتج أسرع نقطة المفردات من معظم تلك المشفرة يدويا.. تستخدم عائلة المولداتlex / flex أسلوبًا قائمًا على الطاولات وهو أقل كفاءة بكثير من النهج المُرمّز بشكل مباشر. [مشكوك فيه-يناقش] مع هذا الأسلوب الأخير ينتج المولد محركًا يقفز مباشرة إلى حالات المتابعة عبر عبارات أذهب إلى.لقد أثبتت أدوات مثلre2[7] أنها تنتج محركات تكون أسرع بمرتين وثلاث مرات من المحركات المرنّة. [بحاجة لمصدر] من الصعب بشكل عام أن تحل محللات الكتابة اليدوية بشكل أفضل من المحركات التي تولدها هذه الأدوات الأخيرة. من الصعب بشكل عام أن تحل محللات الكتابة اليدوية بشكل أفضل من المحركات التي تولدها هذه الأدوات الأخيرة.

قائمة مولدات قراء المفردات (List of lexer generators)

[عدل]
  • ANTLR – يمكن أن تولد محللات معجمية ومحللات.
  • DFASTAR– يولد مصفوفة الاتمتة المحدودة القطعية وجدوله قارئ المفردات في لغة c++.
  • Flex –البديل من القانون التقليدي لLex للغتي c++ / c.
  • Ragel _ آلة محدودة الحالات وقارئ المفردات مع المخرجات في لغات c++/ c / التجميع (assembly)
  • Re2c _ مولد قارئ المفردات في ++c / c.

يمكن للمحللات المعجمية التالية التعامل مع نظام الحروف الدولية الموحدة «يونيكود» (Unicode):

  • JavaCC _ يولد محلل معجمي مكتوب بلغة جافا.
  • JFLex- مولد محلل المعجمي للغة الجافا.
  • AnnoFlex - مولد شفرة مبني على مولد قارئ ماسح للغة جافا.
  • RE/flex _ يولد ماسح مع جدول الشفرة مباشرة للغة c++ بشكل سريع.
  • quex _ محلل معجمي مولد سريع عالمي كتب بلغة البايثون للغات c++ / c.
  • FsLex – قارئ مفردات مولد للبايت "نظام الحروف الدولية الموحدة" يونيكود"لإدخال حرفF#.
  • Re2c _ مولد قارئ المفردات في ++c / c.[8]
  • PLY - وحدة للغة البايثون ply.lex تمكن جزء التحليل المعجمي.

هيكل العبارة (Phrase structure)

[عدل]

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

ومع ذلك، قد يكون المعجم أكثر تعقيدًا بشكل كبير؛ ببساطة قد يحذف قارئ الرموز- الرموز أو يضيف رموزًا مضافة. إن حذف الرموز، ولاسيما المسافات البيضاء والتعليقات، أمر شائع جدًا، عندما لا يحتاج المترجم إليها. أقل شيوعا، يمكن إدراج الرموز المضافة. يتم ذلك بشكل أساسي لتجميع الرموز في عبارات أو من عبارات إلى كتل، لتبسيط المحلل اللغوي.

استمرار الخط (Line continuation)

[عدل]

استمرار الخط هو ميزة لبعض اللغات حيث يكون الخط الجديد عادة عبارة عن فاصل. في أغلب الأحيان، ينهى السطر بخط مائل عكسي (يتبعه سطر جديد مباشرةً) إلى استمرار الخط -يتم ربط السطر التالي بالخط السابق. يتم ذلك بشكل عام في قارئ الرموز: بحيث يتم تجاهلا لخط المائل العكسي والخط الجديد، بدلاً من أن يتم ترميز السطر الجديد. من الأمثلة على ذلك باش” يونكس.[9] “وغيرها من سكربت شل ولغة البايثون.[10]

إدراج الفاصلة المنقوطة (Semicolon insertion)

[عدل]

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

إدراج الفاصلة المنقوطة هو سمة من سماتلغة البرمجة الأساسية المختلطة(BCPL)ولغة (Go).[11] على الرغم من أنه غائب في Bأو C.[12] إدراج الفاصلة المنقوطة موجود في الجافا سكربت، على الرغم من أن القواعد معقدة إلى حد ما ومتعرضة للنقد؛ لتجنبا لأخطاء، يوصى البعض دائمًا باستخدام الفواصل المنقوطة، بينما يستخدم البعض الآخر الفواصل المنقوطة الأولية، التي تسمى الفواصل المنقوطة الدفاعية، في بداية العبارات التي يحتمل أن تكون ملتبسة.

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

قاعدة خارج الجانب المحدد (Off-side rule)

[عدل]

يمكن تنفيذ قاعدة خارج الجانب المحدد (الكتل التي تحددها المسافات البادئة) في قارئ الرموز، كما في لغة البايثون، حيث تزيد نتائج المسافات البادئة في قارئ الرموز الذي ينبعث منه رمز المسافة البادئة، ويقلل من نتائج المسافة البادئة في الاستخدام الذي ينبعث منه رمز معين.[10] تتوافق هذه الرموز مع الأقواس المفتوحة {واستكمال الأقواس المفتوحة بالأقواس المغلقة} في اللغات التي تستخدم الأقواس للكتل، وتعني أن عبارة النحو لا تعتمد على استخدام الأقواس أو المسافات البادئة. يتطلب هذا أن يحمل قارئ الكتاب حالة، أي مستوى المسافة البادئة الحالية، وبالتالي يمكنها لكشف عن التغييرات في المسافة البادئة عندما يتغير ذلك، وبالتالي فإن القواعد اللغوية ليست خالية من السياق (context-free)

: يعتمد INDENT-DEDENT على المعلومات السياقية لمستوى المسافة البادئة السابقة.

لغة حساسة للسياق (Context-sensitive lexing)

[عدل]

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

هناك استثناءات، ومع ذلك. تتضمن الأمثلة البسيطة: إدخال فاصلة منقوطة فيGo، والتي تتطلب البحث مرة أخرى رمزًا واحدًا. سلسلة من القيم الحرفية المتسلسلة في لغة البايثون[10]، والتي تتطلب الاحتفاظ برمز واحد في الذاكرة مؤقتاً قبل إرساله (لمعرفة ما إذا كان الرمز المميز  التالي هو سلسلة أخر حرفية)؛ وقانون الجانب السلبي في بايثون، والذي يتطلب الحفاظ على حساب مستوى المسافة البادئة (في الواقع، كومة من كل مستوى مسافة بادئة). هذه الأمثلة تتطلب فقط السياق المعجمي، وعلى الرغم من أنها معقدة قليلا، فهي غير مرئية للمحلل والمراحل اللاحقة.

المثال الأكثر تعقيدًا هو الاختراق «قارئ الرموز» فيC، حيث لا يمكن تحديد فئة الرموز المميزة لسلسلة أحرف حتى مرحلة التحليل الدلالي، لأن أسماء typedef وأسماء المتغيرات متطابقة معًا، ولكنها تشكل فئات رمزية مختلفة. وهكذا في القرصنة، يستدعي قارئ الرموز محلل الدلالي (مثلاً، جدول الرموز) ويتحقق مما إذا كان التسلسل يتطلب اسمًا مكتوبًا. في هذه الحالة، يجب أن تتدفق المعلومات وليس من محلل فقط، ولكن من محلل الدلالي إلى قارئ الرموز، مما يعقد التصميم.

المراجع

[عدل]
  1. ^ "Anatomy of a Compiler and The Tokenizer". www.cs.man.ac.uk. مؤرشف من الأصل في 2018-07-27.
  2. ^ ا ب page 111, "Compilers Principles, Techniques, & Tools, 2nd Ed." (WorldCat) by Aho, Lam, Sethi and Ullman, as quoted in https://stackoverflow.com/questions/14954721/what-is-the-difference-between-token-and-lexeme نسخة محفوظة 2016-12-30 على موقع واي باك مشين.
  3. ^ Perl 5 Porters. "perlinterp: Perl 5 version 24.0 documentation". perldoc.perl.org - Official documentation for the Perl programming language. perldoc.perl.org. مؤرشف من الأصل في 2018-10-18. اطلع عليه بتاريخ 2017-01-26.{{استشهاد ويب}}: صيانة الاستشهاد: أسماء عددية: قائمة المؤلفين (link)
  4. ^ Guy Coder (19 فبراير 2013). "What is the difference between token and lexeme?". Stack Overflow. Stack Exchange Inc. مؤرشف من الأصل في 2016-12-30. اطلع عليه بتاريخ 2017-01-26.
  5. ^ "Structure and Interpretation of Computer Programs". mitpress.mit.edu. مؤرشف من الأصل في 2017-01-02.
  6. ^ Huang, C., Simon, P., Hsieh, S., & Prevot, L. (2007) Rethinking Chinese Word Segmentation: Tokenization, Character Classification, or Word break Identification نسخة محفوظة 29 أغسطس 2017 على موقع واي باك مشين.
  7. ^ Bumbulis، P.؛ Cowan، D. D. (مارس–ديسمبر 1993). "RE2C: A more versatile scanner generator". ACM Letters on Programming Languages and Systems. ج. 2 ع. 1–4: 70–84. DOI:10.1145/176454.176487.
  8. ^ [1], re2c manual نسخة محفوظة 15 أغسطس 2017 على موقع واي باك مشين. [وصلة مكسورة]
  9. ^ Bash Reference Manual, 3.1.2.1 Escape Character نسخة محفوظة 13 أبريل 2018 على موقع واي باك مشين.
  10. ^ ا ب ج "3.6.4 Documentation". docs.python.org. مؤرشف من الأصل في 2006-07-20.
  11. ^ Effective Go, "Semicolons" نسخة محفوظة 16 أبريل 2018 على موقع واي باك مشين.
  12. ^ "Semicolons in Go", golang-nuts, Rob 'Commander' Pike, 12/10/09 نسخة محفوظة 29 سبتمبر 2018 على موقع واي باك مشين.