بناء الجملة (لغات البرمجة)

تُعرَّف بنية شيفرة المصدر الحاسوبية بأنها شيفرة مُهيكلة ومرتبة وفقًا لقواعد لغة البرمجة. وكما هو الحال في اللغة الطبيعية ، تُحدد لغة البرمجة (أي لغة الحاسوب ) البنية الصحيحة لتلك اللغة. [ 1 ] ويحدث خطأ في البنية عندما تتم معالجة شيفرة مصدر غير صحيحة نحويًا بواسطة أداة مثل المُترجم أو المُفسِّر .
تعتمد اللغات الأكثر استخداماً على النصوص ، وتستند قواعدها النحوية على السلاسل النصية. في المقابل، تعتمد قواعد لغة البرمجة المرئية على العلاقات بين العناصر الرسومية.
عند تصميم قواعد اللغة، قد يبدأ مصمم أي لغة بكتابة أمثلة على السلاسل النصية الصحيحة وغير الصحيحة ، قبل محاولة استنباط القواعد العامة من تلك الأمثلة المستخدمة. بحيث يمكن تحديد البنية العامة لقواعد اللغة من خلال شكل تركيبها، وذلك لإنتاج نطاقات صحيحة دلاليًا في كل مرة لكل تغيير محتمل. وإلا، فإنها تُرجع أخطاءً وتحذيرات لكل مُدخل غير صالح. [ 2 ]
مستويات بناء الجملة
يتم تصنيف بناء جملة لغة الحاسوب عمومًا إلى ثلاثة مستويات:
- الكلمات – المستوى المعجمي، الذي يحدد كيفية تشكيل الأحرف للرموز ؛
- العبارات – المستوى النحوي، بالمعنى الضيق، الذي يحدد كيفية تشكيل الرموز للعبارات؛
- السياق – تحديد الكائنات أو أسماء المتغيرات التي تشير إليها، وما إذا كانت الأنواع صالحة، وما إلى ذلك.
يؤدي التمييز بهذه الطريقة إلى نمطية، مما يسمح بوصف كل مستوى ومعالجته بشكل منفصل وغالبًا بشكل مستقل.
أولاً، يقوم المحلل المعجمي بتحويل التسلسل الخطي للأحرف إلى تسلسل خطي للرموز؛ وهذا ما يُعرف باسم " التحليل المعجمي " أو "التحليل المعجمي". [ 3 ]
ثانيًا، يُحوّل المُحلِّل التسلسل الخطي للرموز إلى شجرة نحوية هرمية ؛ وهذا ما يُعرف بـ" التحليل النحوي " بالمعنى الدقيق. يضمن هذا أن يتوافق سطر الرموز مع القواعد النحوية الرسمية للغة البرمجة. يمكن تقسيم مرحلة التحليل النحوي نفسها إلى جزأين: شجرة التحليل ، أو "شجرة النحو الملموسة"، التي تُحددها القواعد النحوية، ولكنها عادةً ما تكون مُفصَّلة للغاية بحيث يصعب استخدامها عمليًا، وشجرة النحو المجردة (AST)، التي تُبسِّط هذا التسلسل إلى شكل قابل للاستخدام. يمكن اعتبار شجرة النحو المجردة وخطوات التحليل السياقي شكلًا من أشكال التحليل الدلالي ، حيث إنها تُضيف معنىً وتفسيرًا إلى النحو، أو بديلًا عن ذلك، تطبيقات يدوية غير رسمية لقواعد نحوية يصعب أو يستحيل وصفها أو تطبيقها رسميًا.
ثالثًا، يُحلل السياق الأسماء ويتحقق من الأنواع. هذه النمطية ممكنة أحيانًا، ولكن في العديد من لغات البرمجة الواقعية، تعتمد خطوة سابقة على خطوة لاحقة - على سبيل المثال، يعود سبب استخدام مُحلل معجمي في لغة C إلى أن تجزئة الكلمات تعتمد على السياق. حتى في هذه الحالات، يُنظر إلى التحليل النحوي غالبًا على أنه يُقارب هذا النموذج المثالي.
تتوافق المستويات عمومًا مع مستويات التسلسل الهرمي لتشومسكي . الكلمات في لغة منتظمة ، محددة في قواعد نحوية معجمية ، وهي قواعد من النوع الثالث، تُعطى عادةً على شكل تعابير منتظمة . العبارات في لغة خالية من السياق (CFL)، وعادةً ما تكون لغة خالية من السياق حتمية (DCFL)، محددة في قواعد نحوية لبنية العبارة ، وهي قواعد من النوع الثاني، تُعطى عادةً على شكل قواعد إنتاج بصيغة باكوس-ناور (BNF). غالبًا ما تُحدد قواعد العبارات بقواعد نحوية أكثر تقييدًا من القواعد النحوية الكاملة الخالية من السياق ، لتسهيل تحليلها؛ فبينما يستطيع محلل LR تحليل أي لغة خالية من السياق حتمية في وقت خطي، فإن محلل LALR البسيط، ومحلل LL الأبسط منه، أكثر كفاءة، لكنهما لا يستطيعان تحليل إلا القواعد النحوية التي تكون قواعد إنتاجها مقيدة. من حيث المبدأ، يمكن وصف البنية السياقية بواسطة قواعد نحوية حساسة للسياق ، وتحليلها تلقائيًا بوسائل مثل قواعد النحو الخاصة بالسمات ، على الرغم من أن هذه الخطوة تتم بشكل عام يدويًا، من خلال قواعد حل الأسماء والتحقق من النوع ، ويتم تنفيذها عبر جدول رموز يخزن الأسماء والأنواع لكل نطاق.
طُوِّرت أدواتٌ تُنشئ تلقائيًا مُحلِّلًا معجميًا من مواصفات معجمية مكتوبة بتعبيرات نمطية، ومُحلِّلًا نحويًا من قواعد الجملة المكتوبة بصيغة BNF. يُتيح هذا استخدام البرمجة التصريحية ، بدلًا من الحاجة إلى البرمجة الإجرائية أو الوظيفية . ومن الأمثلة البارزة على ذلك زوج lex - yacc . يُنتج هذان الزوجان تلقائيًا شجرة بناء جملة ملموسة ؛ ويتعين على مُبرمج المُحلِّل النحوي كتابة شيفرة برمجية يدويًا تُوضِّح كيفية تحويل هذه الشجرة إلى شجرة بناء جملة مجردة . كما يُنفَّذ التحليل السياقي عادةً يدويًا. على الرغم من وجود هذه الأدوات الآلية، غالبًا ما يُنفَّذ التحليل النحوي يدويًا لأسبابٍ مُتعددة، منها أن بنية الجملة قد لا تكون خالية من السياق، أو أن هناك تطبيقًا بديلًا يُحسِّن الأداء أو الإبلاغ عن الأخطاء، أو يُسهِّل تغيير القواعد. غالبًا ما تُكتب المُحلِّلات النحوية بلغات البرمجة الوظيفية، مثل Haskell ، أو بلغات البرمجة النصية ، مثل Python أو Perl ، أو بلغات البرمجة الإجرائية ، مثل C أو C++ .
تعريف بناء الجملة

يُعرَّف بناء جملة لغات البرمجة النصية عادةً باستخدام مزيج من التعابير النمطية (للبنية المعجمية ) وصيغة باكوس-ناور ( لغة وصفية للبنية النحوية ) لتحديد الفئات النحوية ( غير الطرفية ) والرموز الطرفية استقرائيًا . [ 4 ] تُعرَّف الفئات النحوية بقواعد تُسمى قواعد الإنتاج ، والتي تُحدد القيم التي تنتمي إلى فئة نحوية معينة. [ 1 ] الرموز الطرفية هي الأحرف الملموسة أو سلاسل الأحرف (على سبيل المثال، الكلمات المفتاحية مثل define و if و let و void ) التي تُبنى منها البرامج الصحيحة نحويًا.
يمكن تقسيم بناء الجملة إلى بناء جملة غير مرتبط بالسياق وبناء جملة مرتبط بالسياق. [ 4 ] بناء الجملة غير المرتبط بالسياق هو قواعد تُحددها اللغة الوصفية للغة البرمجة. لا يتقيد هذا النوع من بناء الجملة بالسياق المحيط به أو الذي يشير إليه، على عكس بناء الجملة المرتبط بالسياق.
قد تمتلك اللغة قواعد نحوية متكافئة مختلفة، مثل التعبيرات النمطية المتكافئة (على المستوى المعجمي)، أو قواعد عبارات مختلفة تُنتج اللغة نفسها. استخدام فئة أوسع من القواعد النحوية، مثل قواعد LR، يُتيح قواعد أقصر أو أبسط مقارنةً بالفئات الأكثر تقييدًا، مثل قواعد LL، التي قد تتطلب قواعد أطول بقواعد أكثر. تُنتج قواعد العبارات المختلفة، وإن كانت متكافئة، أشجار تحليل نحوي مختلفة، على الرغم من أن اللغة الأساسية (مجموعة المستندات الصالحة) تبقى نفسها.
مثال: تعابير S في لغة ليسب
فيما يلي قواعد نحوية بسيطة، مُعرَّفة باستخدام تدوين التعابير النمطية وصيغة باكوس-ناور الموسعة . وهي تصف بناء جملة تعابير S ، وهي بناء جملة بيانات للغة البرمجة Lisp ، والتي تُعرِّف قواعد الإنتاج للفئات النحوية: التعبير ، والذرة ، والرقم ، والرمز ، والقائمة .
التعبير = ذرة | قائمة الذرة = رقم | رمز الرقم = [ + - ] ؟ [ '0' - '9' ] + الرمز = [ 'A' - 'Z' ][ 'A' - 'Z''0' - '9' ]. * القائمة = '(' , التعبير * , ')'تحدد هذه القواعد النحوية ما يلي:
- التعبير إما أن يكون ذرة أو قائمة ؛
- الذرة إما أن تكون رقماً أو رمزاً ؛
- الرقم هو سلسلة متصلة من رقم عشري واحد أو أكثر، ويسبقه اختيارياً علامة زائد أو ناقص ؛
- الرمز هو حرف متبوع بصفر أو أكثر من أي أحرف (باستثناء المسافات البيضاء)؛ و
- القائمة عبارة عن زوج متطابق من الأقواس، يحتوي على صفر أو أكثر من التعبيرات بداخله.
هنا، الأرقام العشرية والأحرف الكبيرة والصغيرة والأقواس هي رموز نهائية.
فيما يلي أمثلة على تسلسلات الرموز الصحيحة في هذه القواعد النحوية: ' 12345', ' ()', ' (A B C232 (1))'
قواعد نحوية معقدة
يمكن تصنيف القواعد النحوية اللازمة لتحديد لغة برمجة ما وفقًا لموقعها في التسلسل الهرمي لتشومسكي . يمكن تحديد قواعد العبارات لمعظم لغات البرمجة باستخدام قواعد من النوع الثاني، أي أنها قواعد خالية من السياق ، [ 5 ] على الرغم من أن بناء الجملة العام حساس للسياق (بسبب تعريفات المتغيرات والنطاقات المتداخلة)، وبالتالي فهي من النوع الأول. ومع ذلك، توجد استثناءات، وبالنسبة لبعض اللغات تكون قواعد العبارات من النوع صفر (كاملة تورينج).
في بعض اللغات مثل بيرل وليسب، تسمح مواصفات اللغة (أو تنفيذها) بوجود بنيات تُنفَّذ أثناء مرحلة التحليل. علاوة على ذلك، تحتوي هذه اللغات على بنيات تُمكِّن المبرمج من تغيير سلوك المحلل. هذا المزيج يُطمس فعليًا التمييز بين التحليل والتنفيذ، ويجعل تحليل بناء الجملة مشكلة غير قابلة للحسم في هذه اللغات، مما يعني أن مرحلة التحليل قد لا تنتهي. على سبيل المثال، في بيرل، من الممكن تنفيذ التعليمات البرمجية أثناء التحليل باستخدام BEGINعبارة، وقد تُغيِّر نماذج دوال بيرل التفسير النحوي، وربما حتى صحة بناء الجملة للتعليمات البرمجية المتبقية. [ 6 ] [ 7 ] يُشار إلى هذا بشكل عام بعبارة "بيرل فقط هي التي تستطيع تحليل بيرل" (لأن التعليمات البرمجية يجب تنفيذها أثناء التحليل، ويمكنها تعديل القواعد النحوية)، أو بشكل أكثر وضوحًا "حتى بيرل لا تستطيع تحليل بيرل" (لأنها غير قابلة للحسم). وبالمثل، تُنفَّذ وحدات ماكرو لغة ليسب المُعرَّفة بواسطة defmacroبناء الجملة أثناء التحليل، مما يعني أن مُصرِّف ليسب يجب أن يحتوي على نظام تشغيل ليسب كامل. في المقابل، تُعد وحدات ماكرو لغة سي مجرد استبدال للسلاسل النصية، ولا تتطلب تنفيذ أي كود. [ 8 ] [ 9 ]
بناء الجملة مقابل الدلالات
يصف بناء الجملة في اللغة شكل البرنامج الصحيح، لكنه لا يُقدم أي معلومات حول معنى البرنامج أو نتائج تنفيذه. يُعالج المعنى المُعطى لمجموعة من الرموز بواسطة الدلالات (سواء كانت رسمية أو مُضمنة في تطبيق مرجعي ). يجب إثبات صحة بناء الجملة قبل أن تتمكن الدلالات من استخلاص المعنى منه. [ 4 ] ليست كل البرامج الصحيحة نحويًا صحيحة دلاليًا. فالعديد من البرامج الصحيحة نحويًا مع ذلك غير سليمة البنية، وفقًا لقواعد اللغة؛ وقد تُؤدي (بحسب مواصفات اللغة وسلامة التنفيذ) إلى خطأ في الترجمة أو التنفيذ. في بعض الحالات، قد تُظهر هذه البرامج سلوكًا غير مُحدد . حتى عندما يكون البرنامج مُحددًا جيدًا ضمن اللغة، فقد يحمل معنىً لم يقصده كاتبه.
باستخدام اللغة الطبيعية كمثال، قد لا يكون من الممكن تحديد معنى لجملة صحيحة نحوياً، أو قد تكون الجملة خاطئة:
- " الأفكار الخضراء عديمة اللون تنام بغضب ." عبارة سليمة نحوياً ولكن ليس لها معنى مقبول بشكل عام.
- "جون أعزب متزوج." جملة صحيحة نحوياً ولكنها تعبر عن معنى لا يمكن أن يكون صحيحاً.
الجزء التالي من لغة C صحيح نحويًا، ولكنه ينفذ عملية غير محددة دلاليًا (لأنه pمؤشر فارغ ، وبالتالي فإن العمليتين و ليس لهما معنى):p->realp->im
complex * p = NULL ; complex abs_p = sqrt ( p -> real * p -> real + p -> im * p -> im );كمثال أبسط،
int x ; printf ( "%d" , x );صحيحٌ نحويًا، لكنه غير مُعرَّف دلاليًا، لأنه يستخدم متغيرًا غير مُهيَّأ . مع أنَّ مُترجمات بعض لغات البرمجة (مثل جافا وسي شارب) قد تكتشف أخطاء المتغيرات غير المُهيَّأة من هذا النوع، إلا أنه ينبغي اعتبارها أخطاءً دلالية وليست أخطاءً نحوية. [ 10 ] [ 11 ]
انظر أيضاً
مراجع
- 1 2 فريدمان، دانيال ب.؛ ميتشل واند؛ كريستوفر ت. هاينز (1992). أساسيات لغات البرمجة ( الطبعة الأولى). مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 0-262-06145-7.
- ↑ سميث، دينيس (1999). تصميم برمجيات قابلة للصيانة . سبرينغر ساينس آند بيزنس ميديا.
- ↑ باي، فايكونتا؛ أيثال، ب.س. (31 ديسمبر 2020). "مراجعة منهجية للأدبيات حول تقنيات تطبيق المحلل المعجمي في تصميم المترجمات" . المجلة الدولية لرسائل الهندسة التطبيقية والإدارة . 4 (2): 285-301 . doi : 10.47992/IJAEML.2581.7000.0087 . ISSN 2581-7000 . SSRN 3770588 .
- 1 2 3 سلونيغر، كينيث؛ كورتز، باري (1995). بناء الجملة الرسمي ودلالات لغات البرمجة . شركة أديسون-ويسلي للنشر . ISBN 0-201-65697-3.
- ↑ مايكل سيبسر (1997). "2.2 أوتوماتا الدفع لأسفل". مقدمة في نظرية الحوسبة . دار نشر PWS. الصفحات 101-114 . ISBN 0-534-94728-X.
- ↑ تعليق من جامعة ليفربول للتكنولوجيا يوضح أن المشكلة غير القابلة للحل هي الانتماء إلى فئة برامج بيرل
- ↑ مثال chromatic على كود Perl الذي يُظهر خطأً في بناء الجملة اعتمادًا على قيمة المتغير العشوائي
- ↑ "مقدمة إلى وحدات الماكرو في لغة Common Lisp" . Apl.jhu.edu. 1996-02-08. مؤرشف من الأصل في 2013-08-06 . تم الاطلاع عليه في 2013-08-17 .
- ↑ "كتاب طبخ لغة Common Lisp - وحدات الماكرو وعلامات الاقتباس الخلفية" . Cl-cookbook.sourceforge.net. 16-01-2007 . تم الاطلاع عليه بتاريخ 17-08-2013 .
- ↑ الأخطاء الدلالية في جافا
- ↑ هل المسألة تتعلق بالنحو أم بالدلالات؟
روابط خارجية
- تراكيب نحوية متنوعة مستخدمة في لغات برمجة الحاسوب
- خطأ بايثون "ImportError: No module named" لماذا؟ كيف؟ هل تم حله عبر سطر الأوامر؟ [تم الحل في 2021] . مؤرشف بتاريخ 9 أكتوبر 2021 على موقع Wayback Machine.
- بناء جملة لغة البرمجة
- مواضيع لغات البرمجة
- شفرة المصدر
