طيب بسم الله الرحمن الرحيم اليوم إن شاء الله بدنا
نستكمل آخر فرع موجود في دارس ال translator اللي هو
ال translation scheme يعني احنا لما قولنا
translator أول ما بدينا قولنا فيه نوعين في نوع
اسمه syntax directed definition وفي عندنا
translation scheme طبعا بالنسبة لل syntax directed
definition اتفقنا أنه ال grammar في نصو ال rules
في نص تاني وبعد ما نعمل له عملية ال parsing و
نخلصها بنعمل عملية visiting لل notes بطريقة bottom
-up أو depth traversal عشان نحل ال semantic rules
عليها واتفقنا أن طريقة ال bottom-up و ال depth
traversal بتظبط إذا كانت كل ال attributes من نوع
synthesized يعني أني لازم أشوف الأبناء قبل الأب
عشان أحسب القيام وهذا خلصناه المرة اللي فاتتقلنا
قبل هيك أيضا و اليوم بنأكد ان ال translation
scheme إيش أفرج عن ال definition؟ ان ال rules
بتكون موجودة جوا ال grammarليش موجودة جوا ال
grammar؟ لأنه بيكون ال code ساعتها efficient أكتر
يعني عامل شغال في شغلتين مع بعض بيعمل عملية
parsing لل syntax تأكد أنه سليم و في نفس التوقيت
بتظهر ال semantics خلال عملية ال parsing ال
semantic rules بتظهر عشان تعمل المهمة المطلوبةسواء
عملية حسبة، سواء عملية translation، تحويل إلى
أخرها، تمام؟ وحناخد اليوم كمثال موضوع ال-infix ل
-bosfix نفس اللي أخدناها قبل هيك ك definition،
بدنا ناخده اليوم على السريع ك translation scheme
الان أول ملاحظة تلاحظيها أن كيف احنا بنضيف هذا ال
semantic rule جوا لجرامر، جال بنضيفه على بين قسين،
زي هيكبنميزه بين قصيره يعني طبعا لما تفتح هذا القص
و تسكري هذا القص بتعرف ان اللي في النص بقصد فيه
semantic rule طبعا ال semantic rule ممكن يكون
action ممكن يكون print ممكن يكون fragment of code
ممكن يكون whatever هذا اتكلمناه زمان ال semantic
rule تاخد أشكال عديدة تمام المهم انه لما احنا بدنا
نحطه جوا ل grammar لازم نميزه بشو؟بالجثين هدول
طبعا واحدة ممكن تيجي تسأل و تقول طب لو انا بدي هذا
الجث كجزء من ال grammar يعني افترضي انا بدي اوصف
ال if condition مثلا و ال if condition جثة ماشي زي
هيكالـ bracket كيف بدي أسوي إذا أنت بتقولي هيفهم
أن هذا عبارة عن semantic أكيد لازم أكون أحط إشارة
تميز أني بقصد ال bracket بتاع ال semantic أو ال
bracket اللي بديها في ال grammar فبنحط slash زي
بالظبط في الجابة لما بدك ال quotation أنت لما بتحط
ال quotation و quotation بتكتب ال string اللي
بديكي إيها في النص طب افرض أن أنا بدي ال quotation
تكون ضمن ال string تضطر تحط علامة زيادة اللي هي ال
slash علشان تقولي أنا بقصد ال quotation هذه تبين
جوا ك characterمش بقصد ال key اللي هي لازم نكتب
جبناتها لل string وهنا نفس الفكرة انا لما احط
الجثين هدول ل brackets بدون اي اشارات ال default و
المفهوم انه ايش انه semantic rule انا بديش يكون
semantic rule لأ بدي الجث نفسه بحطله slash بس عشان
نطلع من ايش من موضوع التمييز بين الجثين هدول اذا
اول شغلة بنلاقيها انه هيك احنا بنعمل ال semantic
rule طبعا مش بالضرورة ال semantic rule يجي في
الآخرزي هذا المثال ممكن يجيهان ممكن يجيهان يجيهان
ممكن يكون فيه أكتر من semantic هذا هنتكلم عنه كمان
شوية بس كشكل بيظهر على شكل بين قصينطب في الرسم كيف
بظهر؟ يعني انا لما بتعمل parsing لهذا ال grammar
مش احنا بنستبدل كنا زمان بدون ما تكون هذه موجودة
كنا بنستبدل expression عبارة عن expression زائد
term و أكمل بس الآن صار ضمن ال grammar حاجة زي هيك
كيف بتتعامل معاه في عملية ال parsing؟ جال برضه
بسهولة بعمل خط مقطع زي هيك و بنفذ هذا ال action
يعني لما أنا أطلع على parsing tree و ألاقي خطوط
مقطعة زي هيك إيش بفهم أن هذه جاية من مين؟ من
semantic rule إذا في الرسم مميز و في ال grammar
مميز لكن هو بيكون في النهاية قطع من ال grammar مش
منفصل عنه يعني أي حد بعد اليوم بدي استبدل ال
expression مش على كيفه ممنوع يستبدلها بدل و يسكت
لازم يستبدلها بهذه مع هذه مع هذه مع هذه مع أي
semantic rule أنا بحطه لأنه بطل منفصلواضحة الفكرة
العامة؟ طيب، ليش أنا بحط الـ Semantic Rule جوا؟
وليش هذا بالنسبالي أفضل؟ لأن في الحالة هذه بدل
بعصفرين بحجر بكون أنا قاعد عامل بتأكد من الـ
syntax بتاع ال sentence وفي نفس الوقت قاعد بعمل
عملية التحويلة المطلوبة حسب حسب حسبة value أو
translation زي ما هنشوف كمان شوية طيبالان نجي
للمثال تبعنا اللى احنا خدناه المرة اللى فاتت من
infix ل postfix الان السؤالش بيقول اعملي
translator او translation scheme بيحول من infix ل
postfix تعالوا نشوف كيف الحل و نشوف كيف طلعوه او
كيف فهموه جال معاكوا خبر لو انا اضفت اللى هو طباعة
الإشارةفي آخر ال production يعني هنا زائد طبعت في
الآخر زائد هنا ناقص طبعت هنا ناقص حتى لو كملنا تحت
الضرب و طبعنا ضرب في الآخر و القسم و طبعنا قسم في
الآخر بعدين لحظة الأرقام بطبعهم في الآخر جالي هذا
ال only grammar هو بيزعم ان اتأكد صار يحول من
infix ل postfix يعني مهما تجيبيله صيغة ان شاء الله
صعبة زي اللي تقت المرة اللي فاتت لازم يطيلك ال
postfix صحفاحنا شوية هنستغرب طب هو كيف عرف أنه هذا
بتطلع لل postfix يعني كيف توصل لهذه النتيجة تعالى
أقولك يا كيف توصل وهذه سهل استنباطها لما نيجي نقول
مثلا تسعة ناقص خمسة أنتي ببساطة هتقولي ال
expression مش هيك؟ عبارة عن إيش؟ expression في
الأول ك grammar انسيلي الأضافة عشان أقول كيف هنضيف
ناقص term صح؟ مش هذا في الآخر بتطلع تسعة؟وهذا
بيطلع في الآخر خمسة مش أنت وراهم بدك تطبع الزائد
عشان يطلع ال postfix مش أنت ال postfix بيجي بعد
الأرقام عشان هيك هو قال ضروري نطبع هنا زائد طيب
السؤال لما أنا بطلع تسعة مش برضه بدي أطبع تسعة
كرقم فعشان ايش عمل قال برضه بدي أطبع هنا تسعة
فتخيل لما بعد ما بطلع تسعة تطبع تسعة و بعد ما بطلع
خمسة تطبع خمسةو بعدين هذه كلها تطبع الإشارة تبع
تسعة خمسة ناقص تبع تسعة خمسة ناقص فانت مهيه طبقتها
بعد مش هيها expression minus term يعني انا عارف في
النهاية في expression بدها تصيرالإشارة بقت فبطبع
بعده مش إشرتها الآن خلاص يومي ماعملتش أي طبعة غير
الأرقام فإيش طلعت معايا التسعة انطبعت والخمسة
انطبعت والإشارة وراهم عشانك صار لازم أنا أطبع
الإشارة وين في الآخر وصار لازم أنا أطبع الرقم وراه
طيب أديكي مثال لو أنا أخدت ال print هاي وحطيتها في
النص إيش تتوقع هيصير؟ هيظل صح؟مش هيطبع .. بالظبط
مش هيطبع الناقص بعد الأرقام هيطبعها في النص ليش
اتغيرت؟ لأنك انت غيرتي في مكان ال action او في
مكان ال semantic فانت بدك تكوني حذرة و أنت بتحط
جاعة في إيش؟ في ال rule تبعك و إيش ال rule اللي
بدي أحطه لكن هنا ليش سهل استنباطها؟ لأن كل القصة
ال boss fix هيبقى على إيش؟ أني باطبع الأرقاموباطبع
الإشارة بعد الأرقام باختصار عشان كيش جال جال كل ما
بطلع رقم بده أطبعه كل ما بطلع رقم بده أطبعه لكن
ماذا بده أطبع الإشارة وراهم عشان أضمن أن يجيني شو
الـ Postfix هي باختصار عشان هيك هو مش مكمل الكود
لو احنا كملناه و كتبنا expression ضرب term هتعمل
.. طبعا هي .. عفوا هي term في factor هنعمل print
ضرب و بعدين term على factor print الجسمة و بعدين
factor و خلاص بتكملي كودك عادي يعني جزة لو
تعملتيها extension مش صعبةبس هو عشان يوضح المثال
اعمل بس ع جد الزائد والنقص وفي أغلب شغلنا في
الشبات الرجاية كل ما بده حاجة في هذا المثال بعملي
زائد ونقص بس لكن طالما فهمت الزائد والنقص سهل
عليكي تضيفي نفس المبدأ للضرب والقسمة طيب الان ناخد
مثال صغير على هذا عشان نشطب النقطة هاي ونعدّع ال
section الجديد لو بدنا نشوف التسعة ناقص خمسة زائد
اتنين طبعا يا بناتانت جادرة في البيت المثال الطويل
اللي أخدناه أخر المحاضرة السابقة مش احنا عملنا له
tree لو روحتي بس أضفتي عليه ال rules هتلاقي طبعلك
ال postfix بالكامل بدون ماعمل حلول semantic rules
بس ضيفيالـ Print في مكانها اللي زي ما هي موجودة
ارجعيها بس ضيفي عليها إضافات هتلاقي تطبعلك الـ
Postfix طبعا وين بتطبع حسب بدك تطبعه في ملف بدك
تطبعه في Console حسب أنت وين بدك تطبعه تمام؟
تعالوا نجرب كمثال تسعة ناقص خمس زائد اتنينكل
المطلوب منك تشتغلي ان تعملي لها parsing عادي تمام؟
عشان تتأكدي من ال syntax تبعها سليم فإيش هتقوللي؟
هتقوللي ال exception هذه مالها تستفدل بإيش؟ ب
exception زائد term تمام طبعا غلط أوقف لها لأن في
غصب عني صار في مقطع جديدفي ال grammar هذا لازم
اتعامل معاه كوحدة موجودة عشان ايه؟ كيف بدك تعبري
عنه هذا؟ بدك تعبري عنه بخط مقطع زي هيك؟ وإيش معنى
print؟ يعني بدنا نطبع عملية زائد في الآخر طبعا؟
طيب خليني نكمل ال expression اللي هان عبارة عن
إيش؟ expression minus term
وهنا إيش يكون؟ إطبع minus صح؟طيب ال expression
اللي هنا term شايفة أنا ببدل زي ما هو مكتوب مش
طالب من اللي أطبع ولا أعمل حاجة هنا خلاص بنفذ
المطلوب طيب و بعدين إيش هنا ال term عبارة عن إيش
خلاص على طول واحد هنا مش كامل هذا تسعة عفوا و
بعدين إيش اللي أقوله هنا في print لتسعة بنفذ
الموجود طيب ال term هذا عبارة عن إيشخمسة وفي وراها
ايش اطبعي خمسة الان مين ضال ماخلصناش ال term هاي
ال term هاي عبارة عن ايش اتنين و ايش في وراهاأطبعي
اتنين الان انت عارف فتشي على الانطبعة من الشمال
اليامين ايش هتلاقي انطبع تسعة انطبعات خمسة انطبعات
ماينوس انطبعات اتنين زاد يعني انطبع تسعة خمسة
ماينوس اتنين زاد اللي هو مين ال boss fixed لهذا
ولو جربت المثال الطويل تبع المرة اللي فاتت هتلاقيه
بظبط مظبوط وبيديك ال boss fixed مظبوطباختصار خلاص
طبعا مين بتتوقع أسرع و efficient أكتر هاد لإيش
لأنه قاعد بيعمل الشغلتين مع بعض قاعد بيعمل عملية
التحقق من ال syntax و في نفس اللحظة قاعد بيعمل
عملية إيش التحويل طبعا إذا كان ال syntax مكتوب غلط
خلاص مافيش داعي بأخدش النتائج اللي طلعت معاه لإن
أصلا هو غلط فإيش بدي في التحويلة الغلططول ما ان ال
syntax طلع خلاص مظبوط معناها بقدر اخد ايش النتيجة
انها مظبوطة تحت تحويل ال infix ل postfix باختصار
واضحة؟ طبعا كمان مرة عملية إضافة ال semantic rules
جوا ل grammar عملية مش كتير سهلة برضه بدوا الواحد
يقعد يفكر فيها ويستنبط فيها كيف انا اقدر اعمل
المطلوب من خلال إضافات لأن اي إضافة غلط في مكان
غلط بطلع غلطيعني لو أنا بهدل ال brand زي ما قلت
قبل شوية حطيتها في مكان تاني مش هطلع boss fixمثلا
و بعدين قدام ان شاء الله انا مش عارف يمكن في
chapter 5 هنتعلم كيف لو انا عندي syntax directed
definition بصروط معينة كيف احوله ل transition
scheme يعني هيدون الدرس هذا قدام ان لو انت عندك
طلعت syntax directed definition كيف احوله ل
transition scheme طبعا لازم يكون فيه مواصفات و
شروط معينة هذا هناخدها بعدين طب ليش هو هيديني هذا
الدرس لأهمية ال transition schemeأسرع بكتير من
مين؟ من الـ definition ليش أنا أخلص عملية ال
parsing و بعدين أعمل عملية visiting جديدة لل nodes
و أقعد أحلي ال attributes عشان أوصل ل translator
إذا أنا جادر طبعا أحطهم وين بطريقة ما جوا ل
grammar ما خلص في نفس اللحظة اللي بيعمل فيها ال
parsing نعمل عملية إيش؟ تنفيذ ال actions مثلا إذا
نوضح ال transitions scheme ماله أفضل أسرع أحسن طيب
إذا أنت عم نفوت على الدرس الجديداللي هو اتنين
اربعة ال
parsing وهنا يعني انا في عندي سؤال استنكاري شوية
احنا من حد ما بدينا في شبطر اتنين ايش كنا نعمل كنا
نعمل parsing انت ايش يعني لما كنا نقولك هذه ال
sentence موجودة في ال grammar ولا لأ مش كنت تروح
تعمل ال tree عشان تقوليلي موجودة او مش موجودةلما
كنت أسألك سؤال ambiguous ولا مش ambiguous مش كنت
تروح تشوفيلها إلها شجرتين ولا لأ عشان تقول
ambiguous ولا لأ هذا العملية اللي كنت تعملها هي
parsing إن مجرد ما تعملي tree ل sentence من ال
grammar هذا parsing طب احنا من أول ما دخلنا في
الشبط روحنا بنعمل parsing شو الفكرة اليوم جايبلي
section منفصل من أربعة أبقى إيش بده يقولي تتوقع
يعني؟ إيش لجديد؟طب خلاص عرفنا ال parsing و 100% اش
ليش جايبليها تاني بشكل مستقل ما رأيك؟ في حد بتعرفش
تعمل parsing في الموجودات؟ بتعرفي تعمل parsing ولا
لا؟ خلاص عندك grammar عندك sentence طالعيها من هاي
اعملي parsing خلصت ال parsing يعني مش ايش القصة
يعني جايبليها في section تاني شطرين
طيب، الآن أنا لما كنت أعمل parsing قبل هيك كنت
أعمله ك human ولا ك system؟ ك human كنت تطلع إلى
حالك و تقعد يتحذري و تفذري اه اجلب هاي اجلب هاي و
ادي هاي اجيب هاي عبارة توصل للشجرة صح ولا لأ؟ لكن
احنا كحاسوب و ك system لازم نتعلم ك system نتم
العمليةكيف ككمبيوتر بده يعمل عملية؟ صح ولا لا؟
عشان هيك الآن احنا هنتقل خطوة باتجاه البرمجة
ونحاول نشوف بشكل systematic كيف بنعمل عملية ال
parsing؟ كيف بنعمل الاختيار؟ يعني أنا دي مش هخليها
للحيرة انت كنت تستبدل قبل شوية expression
expression زائد term ولا ناقص term وتقعد يتفكري
ويتحذري لأ هذي مش هذي صح ولا لا؟ طب ككمبيوتر كيف
يعرف انه بدي هاي مش هاي ولا هاي مش هاي؟عشان هيك
الآن هذا ال section بس بتكلم الآن بعملية
systematic كيف عملية ال parsing بتتم لأنه بده
يأهلني كيف أبرمج كمان شوية لإن أنا مستحيل أقدر
أبرمج إذا أنا مش عارف بشكل systematic كيف بيعمل
عملية ال parsingصح ولا لأ فلازم أعرف في الأول بشكل
systematic كيف العملية بتتم بالظبط عشان أقدر
أحولها لبرنامج وهذا اللي هنسويه ان شاء الله في
محاضرة اليوم نشوف ال parsing كيف بنعمل و بعدين
نفكر كيف نعمل البرنامج و نخلص اليوم ان شاء الله
طيب تعالوا ناخد مثال طبعا بالنسبة لموضوع ال
parsingفي اكتر من method في اكتر من way احنا هنركز
على ال top-down parsing ايش بنقصد بال top-down
parsing ان انت بتيجي تبدأ من ال rootو بتسير ال
route هذا تستبدليه بحاجات و بعدين تمسك كل non
terminal تستبدليه بحاجات لغاية ما توصل إلى وين لل
leaves ال leaves ايش بيكونوا terminals في الآخر
تسعة ماقص خمسة زي اتنين مش هيك لازم توصل في الآخر
لل terminals لكن انت بتبدي من وين من non terminal
بيش يستبدل و هذا ممكن تطلع non terminal تاني بيش
يستبدل لما تخلصي فهذه الطريقة اللي كنا نمشي فيها
مالها بنسميهااللي هو top-down تمام؟ طيب هذا شو
معناته؟ معناته أنه في طرق تانية و مش هناخدها احنا
اللي هي زي ال bottom-up ايش هال bottom-up؟ يعني
بيبدأ من ال leaves و بيبدأ شويه شويه يطلع لغاية ما
يصل ال root يعني بيجي يقول التسعة هذي طلعت من term
ال term طلعت من factor مثلا هذه الخمسة من .. من ..
من .. هذي expression هذي من term بعدين بيقولك هذي
.. شوفتي كيف؟ يعني بيحاول أنه يرجع بالعكسإن هذه من
أين أتيت وهذه من أين أتيت وهذه من أين أتيت لغاية
ما يوصل للـ root في النهاية فهذه نسميها الـ bottom
-up ويلها طرق كثيرة ويلها methods ويلها تفاصيل
كثيرة وشبطة اللي ممكن خاص فيه لكن هذا مش في ال
scope تبعنا ان شاء الله احنا هنركز بشكل أساسي على
مين؟ على ال top-down طيب تعالوا نشوف قصة ال top
-down كيف بتتم وناخد مثال ونتكلم فيه بالتفصيل هذه
المثال
تشايفين ال grammar اللي على اللوح؟ الان هنا اش
بتكلم جايب لي subset تعريف ال statement بشكل صغير
ان ال statement هي عبارة عن expression فاصلة
منقوطة او if condition بهذه الصورة او for بهذه
الصورة او other طبعا مش كاتب كل التفاصيل ال while
و the while و ال if else و مش عارف ايه مش كاتبه مو
بس بده يوريني الفكرة فاقتصر ان ال statement ممكن
يكون كل هدولوطبعا في عندي non-terminal تاني هو
optional expression وهذا يحتمل أن يكون expression
معينة أو epsilon لأنه مسموح في ال for إنه في
الجابة أو في ال C أن يكون هذه فرغات مش مسموح تكتب
ال for فأصلا مابقوتها فرغات، مسموح وبالتالي هنا
قاعد بيعكس هو اللي مسموح في ال language أو مش
المسموح طبعا المسموح يبقى لازم يحط ل epsilon كان
الان بيقوللي خلاص هذا ال grammar اللي بيوصف ال
statements هدولة الان ايش بيوريني؟ بيوريني شو
المبرمج كتب، شو ال user كتب ال user مثلا قاللي كتب
زي هيك مثلا هاي كتاب for هذا
مين كاتبه؟ ال user هدول مين هيجيبليهم ك tokens؟ ال
lexicalلأن هذا في الملف مكتوب فال lexical هيروح
يقرا ال F و ال O و ال R و يقول لي لقيتلك keyword
for لقيتلك فتحة ghost لقيتلك لقيتك .. و يبعتلي هيك
ال lexical بيشتغل تمام؟ بالدور طيب فاصلة مرقوطة
expression بعدين إيش other هذا المكتوب تمام؟ في
المقابل في عندي إيش في عندي شجرة اسمها statement
الـ root تبعها statement معروف لـ start symbol
البداية فأول ما ببدأ معروف عندي بداية ل tree ال
statement وهي دائما بتكون ال start symbol يا بنات
طيب الآن دعوني أشوف كيف العملية بدأ تتم الأول حاجة
بنستوعبها أن ال statement هاي لابد أن تستبدلبهاي
أو هاي أو هاي أو هاي مافيش خيار خامس طالما هيك
بيقوللي هو في ال grammar إيش .. إيش معنى هذا يا
بنات؟ إيش يعني؟ هنا معناه إن ال statement هاي ممكن
تستبدل بهاي أو بهاي أو بهاي أو بهاي هي كل الخيارات
مافيش غيرها و بعدين هاي تستبدل بهاي أو بهاي مش
هيك؟ مش هيك معناها؟ طيب الآن على أي أساس أنا بدي
أستبدل ال statement؟جالي عشان تعرف علي أستاذك
تستخدم ال statement اركزي معايا لازم نكون عارفين
ال token الأول اللي كاتبه المبرمج و جاي من ال
lexical اللي هو في حالتي هاي مين هو ال four فحاجة
بنسميها يا بناتي ال look ahead في مؤشر اسمه look
ahead وفي مؤشر واقف عند ال statement يعني مؤشرين
اتنين لازم يشتغلوا مع بعض طالما انا بدي اقارن اشي
مع اشي ففي مؤشرين لازم يمشوا مع بعض واحد واقفعند
ال statement اللي هي ال start symbol اللي هي اللي
هتبدأ تفرد في ال tree والتاني واقف عند ال look
ahead المكتوب اللي كاتبه المبرمج اللي جاييني هذه
لسه البداية طبعا طيب الآن إيش اللي بده يصير؟ الجهة
اللي بده يصير مقارنة بين هاي وبين ال look ahead
هذه كبداية عشان نشتغل الآن هنا statement صح؟وش ال
look ahead؟ four هل بتقدر تقوليلي مين بتستبدل من
هدول بناء على هذه المعلومة؟ هتقوليلي أكيد لازم
أختار هذا ال production يعني انت حتى لو human شفت
.. شفت المبرمج كاتبلك four في أول كلمة لحالك هتروح
تستبدلي ال statement بهذه صح؟ ليش انت عقلك استبدله
بهذه؟ لأنك شفت أول كلمة شو؟ four و لجيتي هذه بتبدأ
بشو؟ ب four فعرفتي انك هتستبدلي هذه مش هيك
هتشتغليه؟ و ال computer نفس الشيء بشكل systematic
الكمبيوتر ليش هيكون مسوي أو ال system؟ هيكون كاتب
if else إذا ال look-ahead expression بده أختار هذه
إذا ال look-ahead if بده أختار هذه كلها إذا ال
look-ahead for بده أختار هذه كلها إذا ال look
-ahead other بده أختار هذه كلها إذا ال look-ahead
غير هذول error يعني افترض ال look-ahead كان مثلا
while مثلا و أنا statement طب ولا واحدة بتبدأ ب
whileمعناه مستحيل نلاقي شجرة من ال statement تبدأ
ب while صح ولا لا؟ طب أنت كيف عرفتي؟ لأنه مالاقيتش
البداية while في هدولة إذا مافيش أي استبدال ل
statement بطلعلك while حتى لو كانت while مكتوبة في
النص ولا برا مش هيكلا لأ فانت هتفت كنت ك human و
تقولي ليه؟ تقولي ليه مابتطلع هذه ال while من هنا
ليش كعرفتي؟ لأنه واقف هذه على whileوهنا ال
statement اللي هي الأساس اللي لازم أبدأ منه و لا
واحدة بتستبدل فيها بواعي طب كيف تطلع واعي بيبقى
مستحيل تطلع الشجرة مش هيك انت هتشتغل ك human و ك
system كذلك إذا كل اللي هيصير ببساطة مجرد مقارنة
if else أو switch إذا بدك كمان مرة if look ahead
expression اللي هناك بده اختار high if look ahead
if بدي اختار high if look ahead اللي جاي بنهيغات
for بدي اختار high if look ahead other بدي اختار
high else ايش بدي اقول error خلاص مابتيجيش واضحة
كيف الان انا مابديش افترضها واحد خليني اشتغل على
الصح الان انه كانت واقفة على for اكيد نتيجة ال if
else if else if else ايش هيختار هيستبدل ال
statement بشوبخريطة ال four هيقوللي لازم يجي four
الخريطة كامة طبعا تستبدل الآن بس تبدلش نص كل
الخريطة عشان الخريطة بتقوللي لازم four لازم فتحة
course لازم ال non terminal اسمه optional مش هيك
بعدين لازم فاصلة منقوطة هيك لازم تستبدل بعدين ايش
بعدين optional مظبوط بعدين فاصلة منقوطة بعدين
optionalبعدين تسكير ال course بعدين ايش statement
طبعا هذه لازم تستبدل بياش بكل بكل
هدول مش هيك؟ اذا مين اللي عرفني اني هستبدل بكل
هدول ال look ahead يعني ان انا مش بس بدي اقارنه
خلاص حتى هو بساعدني اعرف مين انا بدي اخد من ال
productions اللي عندي وانت تخيلي حالك ارجع لما كنت
تشغلي humanلما كنت تستبدل، كنت تستبدل من دماغك؟
ولا كنت تشوف شو أول شي مكتوب عشان تستبدليه؟ اتذكر
حالك كنت تشوف الشي المكتوب عشان تستبدل الطلعيه
وهنا الكمبيوتر نفس الفكرة انت look ahead انت اللي
جايين من ال lexical انت اللي كاتبه المبرمج شو انت؟
انت four؟ خلاص بدا استبدل ال statement باللي بتبدأ
ب four انت if؟ بدا استبدل ال statement باللي بتبدأ
ب if انت مش من هدول؟ معناه انت غلط مش من عندي
error و بطلعواضحيت؟ طيب خلونا الآن نكمل ال step
اللي وراها، الآن صار السهم وين واقف؟ واقف على four
لأنه أنا استبدالت in a statement بأشياء وقفت على
أول استفدالي، لسه ماعملتش ولا action ولا حاجة،
الآن هذا non terminal ولا terminal؟ نون تيرمال ولا
تيرمال؟terminal يعني لا يستبدل صح طب افترضي كان
افترضي كان طالع معايا في الخريطة كمان مرة في الأول
statement و الله طالع معايا اي non-terminal ايش
هتسوي هتعيدي نفس القصة هتشوفي هذا ال non-terminal
اللي هنا افترضي كان optional هتشوفي ال optional و
تشوفي ال look ahead عشان تتعرفي تختاري مين يعني
طول ما انت بتلاقي السهمواجف على الـ non-terminal
كل ما تفعله هي أن تشاهد الـ lookahead الحالي
وتحاول أن تعرف من الاستبدال طب طلع كمان non
-terminal برجع للـ lookahead من الاستبدال دل
استبدال لغاية واحدة من اتنين اتنين يا بتظبطش
الاستبدال لو نقول قرر وخلصنا يا أوصللـ Terminal
نهاية يعني حاجة لا تُستبدل مش هيك أنا طلعت النهاية
من الأول من الأول استبدال طلع خلاص Terminal بس أنا
بقولك حلقة ممكن تطلع معاكي ان هو كنت جاي non
terminal طب كمان مرة استبدلته طلع non terminal
كمان مرة استبدلتهطلع ال terminal خلاص وقفت طب لقيت
non terminal مش قادر استبدل error وطلعت خلاص يعني
انت كنت ممكن يصير في error في الطريق في الاستبدال
لكن بدنا نفترض ان ماصارش error ووصلنا لمين لل
terminal السؤال طب كيف بدنا نكمل خلاص وصلنا ل
terminal ايش التكميل قال كل اللي بده يصير بدنا
نقارن بدنا نجيب function نستدعيها اتقارن ال for
هاي مع ال for اللي كتبهاالمبرمج طبعاً فيه فرق بين
التنتين هذه ال four المكتوبة وهذه ال four بتاعة
الخريطة بإيش لازم ييجي الآن الأثنين لاجيناهم شبه
بعض إذا الأثنين لاجيناهم شبه بعض خلاص تجاوزنا
الفحص الأول يعني أنت يعطيكي العافية خلاص اتحرك لل
token اللي ورا و أنت يعطيكي العافية هو كاتب صح
ابدأ قارن مع اللي ورايا لو كانوا شبه بعضلو كانوا
مش شبه بعض اطلع خلاص Error انت قاعد كاتب حاجة غير
اللي المفروض تيجي هيك المعنى الاختلاف ايش عن
اختلاف بينهيوها ايش عن اختلاف يعني كاتب اشي مش
مفروض ييجي شوفتي كيف فبطلع لكن طول ما هم شبه بعض
اش بيصير هذا بيمشي خطوة و هذا بيمشي خطوة و بكمل
عملية الفحص يعني هانقيد نفس الشغل الآن كمان مرة
افترضي هذا كاتب جزيه كبنادرمثلًا، الآن هذا الـ
Terminal صح؟ و هذا الـ Terminal صح؟ إيش هنعمل
فيهم؟ هيروح يقارنهم مع بعض المقارن هذا اللي
هيقارنهم الـ function هتلاقيهم مش مختلفين لو أنا
كاتب بالأحمر زي ذلك، هيقوللي error طب إيش معناه ال
error؟ معناه إن المبرمج كتب حاجة غلط، معناه كتب
حاجة لا تتبع الـ syntax السليم والصحيح لأنه لازم
إذا هو كاتب صح يكتب هذه الخريطةمش هيك .. ليش هطيني
grammar؟ و ليش هطيني وصف؟ عشان نتأكد أنه كاتب زي
ال grammar زي ال syntax فإذا كاتب جوس مختلف عن هذا
الجوس ال function هذه بتاعة match هتقوله غلط هذا
مش كاتب زي ال syntax الصحيح و بنطلع خلاص هذا هو
كان كاتب غلط نرجع نفترضه إيش كاتب صح نفترضه كاتب
صح
تمام؟ وهي الجثث وقعدت الحين هيقارن هذا مع هذا ايش
هيلاك الاتنين شبه بعض معناه انت لحد الآن مافيش
عندك أخطائي مبرمج ايش معناها؟ يعني خلاص امشي انت
خطوة تمام؟ وامشي انت ايش؟ خطوة الآن وصلنا لمين؟ ل
non terminal اه non terminal ايش هنسوي؟بدنا
نستبدله يعني ال non-terminal هدف يستبدل يابهاي
يابهاي كيف أعرف؟ بدي أشوف ال look أهد الحالي ال
look أهد الحالي فاصلة منقوطة هل الفاصلة المنقوطة
بتطلع من هنا؟ يعني هل بقدر استبدل ال option اللي
بحاجة تطلع الفاصلة المنقوطة؟لأ مش هيك المفروض إيش
كنت أقول غلط لكن ليش مش هقول غلط لأنه ال epsilon
هذه منعتني أني أقول غلط لأنه إيش معناه ال epsilon
معناه أن ال option هذه ممكن تكون فراغ خلاص كمل
فالغلط بيبين بعدي شوية عارفين لو هذه ال epsilon مش
موجودة كان خلاص ولا عمره ال option اللي بتطلع
الفاصلة المنقوطة كان بقوله قرر و بخلصلكن وجود الـ
Epsilon أن هذا خيار .. ماذا يقول؟ يقول ممكن الـ
Optional تكون فراغ، يعني مافي ولا حاجة، يعني امشي
كام ميل، قارن في اللي ورانا، إذا غلط هو كاتب،
هيبين من اللي ورانا، إذا كاتب صح، هيمشي صح، فأجل
عملية أنه غلط ولا مش غلط لمين، للي وراها، لأنه
مسموح تكون الـ Optional شو فراغ، ففعلا هي فراغ و
راحت ع اللي وراها، هذا واردعشان هيك انت انتبه لهذه
حالة خاصة إذا كان فيه إبسلون ممنوع تقوله غلط طب
إيش هساوي في الحالة هيجالب تاخد الخيار أنه استبدلت
ال optional بإبسلون يعني سبتيها ومشيتفهمت كيف؟
يعني لو بدى أرجع لهذه الأولى يا بنات و لو كان كاتب
while في الأول كنا بنقول إيش هنسويه، غلط لكن عارف
لو كان حاط إبسلون بقولش غلط بقوله أعتبر فرخ و بكمل
و بشوف بعدين إذا غلط ولا لأ فاهمة؟ يعني الإبسلون
عمل حالة مختلفة شوية فانتبهي لما تشوف إبسلون ما
تروحش يقولي غلط حتى لو مابتطلعش خلاص بتختار إبسلون
لأنك ولا خيارة جادة بتستبدليه فبتختار استبدال
للإبسلون و بكملمافيش epsilon على طول تستنيش لأن هو
الشهر مافيش epsilon يعني لازم يا بهاي تستبدلها يا
بهاي يا بهاي فلازم تطلع مابتطلعش غلط واضحة جثة ال
epsilon طيب خلينا الآن نتابع الان وان وصلنا احنا
وصلنا لل optional صح ال optional هي و ال look
ahead ايش ال look ahead فاصلة منقوطة مظبوط مافيشش
هأقول غلط و الله هلا .. مش هقول غلط لإن في إبسلون
إيش هعمل؟ هقول هنا .. هقول خلاص اعتبر إن هذا
استبدال لأ بإبسلون يعني ولا حاجة يعني خلاص و يمشي
هذا لوين؟ لهذا ليش؟ لإن افترض إن ال optional خلاص
فراغ مالهاش استبدال خلاص أخدت الإبسلون إن ما
استبدلتاش بحاجة فرمشيت عشان أكمل ليش إيش؟ شوف ال
look ahead ال look ahead expressionخلاص ليش ده
استبدالة بـ exception أنا باستبدلش على كيفي أنا
باستبدل حسب ال look ahead عشان أعرف صح إيش أستبدل
فالآن هاي مش exception معناه ممنوع أخد هاي ماقدرش
أقول غلط لإنه في إبسلون لإنه في خيار خد إبسلون
معناه خلاص إذا ولا خيار موجود و الإبسلون موجودة خد
الإبسلون هيك بقول القاعد أو القانون مامشيش
أنا الحين واقف على فاصلة منقوطةوهذا واقف عند ال
optional معناها أن ال optional لازم تستبدل بشيء
عشان يمشي ال optional لجاها مش expression يعني
مايقدرش أخد هذه الخيار وولا خيار موجود إيش نعمل في
الحالة هذه ماقدرش أقوله غلط خلاص أخد الفراغ إيش
يعني أخد الفراغ يعني خلاص ماشي خطوة يعني استبدلها
ب epsilonيعني ولا حاجة يعني امشي امسك في اللي بعدك
يعني هذا ماتعملوش في ثابت خلاص هذا اعتبره فراغ
وانك مش موجود أساسا وانت كنت ماشي واصل ال .. ال ..
الفاصلة المنقوطة هاي الآن وصل هذا لوين؟ لل
terminal إيش هيسوي؟ هيقارن حاله مع مين؟ مع ال look
ahead افترضي هذا كاتب غلط فاصلة عاديةفاصلة عادية
مش متابقة مع فاصلة منقوطة يعني هذا مش كاتب نفسه
المفروض يكون مانه اقرر و بطلع شوفتي لو كان هذا
الكاتب صح فاصلة منقوطة ال match هتقول اه فاصلة
منقوطة او فاصلة منقوطة شبه بعض يبقى لحد تلان هو
كاتب بشكل سليم مافيش مشاكل اتفضل امشي نشوف اللي
ورا ايش اللي كاتب ورا و ايش اللي المفروض ييجي ورا
هيك معناه ماشي تتنتت ايش هو كاتبو إيش المفروض
ييجي؟ إيش هو كاتب و إيش هو المفروض ييجي؟ طول ما
شبه بعض .. إيش هو كاتب و إيش هو المفروض ييجي؟ خلصت
للآخر .. خلصت .. صح .. كتب كل اللي المفروض ييجي في
النص .. صار في أي مكان مشاكل .. بيطلع بيقولك error
.. باختصار .. واضحة؟ طيب .. خلوني أكمل .. الآن ..
هذا ممكن يروح على expressionوهذا هو اللي بده يروح
على non-terminal ايش بنقول اننا بنسوي لما بنلاقي
non-terminal بنرجع نشوف ال non-terminal بيش
نستبدله ايش ال look-ahead واقف موجودة يبقى خلاص
هتستبدل ال option هذي بيش ايش يعني استبدلتيها يعني
صار هنا كاتب expression وصار السهم عليها لان هذي
مش فراغة انه يمشي عنها صار ماسك terminal الان ايش
هنسوي طالما هذا صار terminal هيرجع يقارنه مع ال
look-aheadالحالي هذا و هذا شبه بعض إذا هذا شماله
بمشي و هذا شماله بمشي فاصلة منقوطة فاصلة منقوطة
شبه بعض هذا بمشي و هذا بمشي الآن هنعيد تاني
optional بده يستبدلها ايش ال look ahead الحالي
expression يبقى هيروح يستبدل هذه بإيش ب expression
و يحط عليها السهم الآن هذا ايش terminalوهذا
terminal إذا هيقارنهم شبه بعض بيمشي هذا هنا و
بيمشي هذا هنا افترضي كاتب غلط كاتب جوس غلط هلاقي
ان هذا مش هذا ال terminal و هذا ال terminal
هيروحوا ل ال function match تفحصهم هتلاقي هذا
الشكل غير الشكل المفروض يكون لو كان كاتب حاجة أو
جوس مختلف فهيقوله قرره يطلع لأنه كاتب غلط لو كان
كاتب غلط بس هو مش كاتب غلطالان لو كتب صح زي هيك
هلاقي هذا و هذا شبه بعض هيمشي على statement هذا
هيمشي وين على other الان طالما وصلنا ل non
terminal بدي يرجع من جديد بدي يستبدل ايش ال look
ahead other يبقى هنختار مين other يبقى ال
statement ده ايش ده تصير other و الساهم هنا other
مع other matching خلصت امشينا على كل ال sentence
بدون مشاكل يبقى يتبع ال grammar يبقى يتبع ال
syntax يبقى مظبوط و مافيش فيها مشاكل باختصار عاد
لو اي غلط انكتب في اي مكان كان باين معناه و احنا
ماشيين الان بتتلاحظ اشي مهم احنا ماعملناش ال tree
بشكل explicit احنا ماعملناش ال tree يعني مارسمناش
nodesو leaves و edges ماعملناش هيك لكن التصرف اللي
احنا تصرفنا و ال algorithm اللي احنا قمشينا هو
implicit tree يعني احنا ايش سوينا عشان افهمك احنا
ايش قولنا قولنا بدنا نستبدل statementإيه بهدي صح
مش هيك عملنا و بعدين قلنا بدنا نستبدل هدي بإبسلون
و بدنا نستبدل هدي ب exception مش هيك قلنا توفر في
شغلنا و بدنا نستبدل هدي ب exception و بدنا نستبدل
هدي ب other إيش يعني أنا مقول ده استبدل هدي و
استبدل هدي و استبدل هدي كإني قاعد بعمل في ال tree
لكن عمليا أنا ماعملتش tree صح ولا لأ لكن الأسلوب
اللي مشيت فيه طريقة التعلم اللي مشيت فيها هو كإنه
قاعد بعمل tree لكن أنا ال tree أنا عملت بشكل ضمني
إيش بقصد لما أقول لك ال tree انه عملت بشكل
explicit يعني رسمت لها notes رسمت لها leaves رسمت
لها edges هيك أنا بكون عملت ال tree explicit شايفة
فعملية ال parsing لا تتطلب منك عمل ال tree بشكل
explicitطب واحدة هتقولي طب أنا كنت أرسم لل tree
ماهذا تعبير الرسم عن عملية استبدالات أنه انت قاعد
بتقولي في ال tree بستبدل هذه و بستبدل .. مش هيك
معناه ال tree اللي كنت ترسميها استبدالات؟ طب إيش
يعني لما جيت أنا قولتلك استبدليلي ال statement ب
high و استبدليلي هذه ب epsilon و استبدليلي هذه ب
expression و استبدليلي هذه ب expression و
استبدليلي هذه ب other عشان تطلع high معناه أنا كأن
اشتغلت treeبس بشكل ضمن صح ولا لأ فبس بتنتبهي للقصة
هي ان احنا قاعدين فعلا بنعمل عملية parsing ولا
عملناها بشكل systematic ولا بفكر ولا بوجع راسي كل
قصتي if else ايش يا look ahead عشان اعرف ايش اللي
اخترته طب عرفت ان اخترت هاي خلاص matching هاي شبه
ولا مش شبه فمرة بمشي هان ومرة بمشي هان طبعا احنا ك
summary فينا اكتر من حالة لازم اخد بالي منهاإذا
كان هنا non-terminal هنا طبعا لازم ع الشق هذا يكون
دايما terminal لازم يكون هنا دايما terminal ليش؟
لأن هذا من وين جاي؟ من ال lexical مش هيك؟ مش ال
lexical اللي كتبه المبرمج بيجيب ليها بيقولي لأ جت
ال token الفلاني و الفلاني و الفلاني فهنا دايما
terminalsلتريعد ممكن تكون المكان اللي أنا واقف
عليه ممكن يكون non-terminal أو ممكن يكون terminal
قال لي سهل القصة إذا non-terminal شوف شو اللي أهد
الحالي عشان تعرف إيش الاستبدال اللي بدك تستبدله
لجيت له استبدال هينا استبدلنا مالجتلهش استبدال
error إلا إذا في إبسلون إذا في إبسلون خلاص امشي
عنهباختصار، هذا لو كنت ماسك بـ Non-terminal طب أنا
مش ماسك بـ Non-terminal، ضالتني ماشي ماشي و أصلت
لـ Terminal، هذه الحالة التانية قال لي خلاص، قارن
هذا الـ Terminal اللي أنت مسكته، اللي معناه
المفروض ينكتب مع الـ Lookahead الحالي اللي هو
كاتبه فعليًاواحدة من تنتين شبه بعض و لا مش شبه بعض
إذا مش شبه بعض غلط ليش يعني غلط لأن هو كاتب حاجة
غير اللي المفروض تكون مش متابع ال syntax تبع ال
language هيك معناه الغلط فبقوله اطلع و خلصناه طب
الاتنين شبه بعض تجاوزت الفحص بسلام انت كاتب صح زي
ال syntax على ال language اتفضل امشي خطوة و انت
امشي خطوة وكمل فحصك لل components اللي بعد اللي
جايوصل للآخر بسلامة خلاص النتيجة سليمة السنتاكس
سليم مافيش مشاكل أي خلل في الطريق بطلع و بقول لي
غلط باختصار عشانك انتبهي للخصية و انا طوا فرضت و
احنا بنشتغل فرضت انه مرة كتب فاصلة عادية مرة فاصلة
مرقوطة فرضت انه كتب while في الأول فرضت انه كتب
goes غلط فكل مرة كنا لما بنغلط في الكتابة بنلاقي
يوقفني في مكان ما واضحت الصورة العامة تمام هيكفي
أي مشاكل طبعا هايها إذا بتشوفوها كرسم طلعوا
عليها أنا هايها عشان لما تدرسوا الخطوات اللي احنا
عملناها هايها باختصارأجى جالك هاي ال statement و
هاي اللي كاتبه المبرمج و من بناء عليها بدأ يقرر
إيش ال statement تختار فيها و صار يمشي خطوة بخطوة
و كل ما بيلاقي non terminal إيش بيسوي فيه بيستبدله
حسب ال look ahead و حسب إيش ال productions تبعته و
جالك امشي هيك للآخر بتكون عملتي عملية ال parsing
باختصار طبعا و مش مكملها لكن بيديكي كيف بدأ و في
بين السطور بيقولك إيش اللي صار أنا هنا أشتغل تامل
كامل معاكم من الالف إلى اليابس و فرط أخطأ و فرط صح
طيب، الآن قبل ما نتقل على النقطة اللي وراها، في أي
حد بده يسأل، في أي حد عنده استفسار أو في عنده نقطة
مش واضحة أو تردد في مكان ما، اللي عنده أي سؤال
تتفضى، مافيش مشاكل، خودي راحتك، اسأليه آه، مافيش
أسئلة؟ واضحة الأمور؟ الـY شوية، طيببالنسبة لوضوع
ال y كمان مرة الان لو انا عندي x انطلعالي زائد
افتح قوس سكر قوس مثلا ناقص افتح قوس سكر قوس مثلا
فاصلة عادية فاصلة منقوطة انا من عندي بفرض زائد
زائد ناقص من عندي فرضية خلاص تمام وال root ال root
اسمه xوالـ look ahead المبرمج كاتب زائد
الآن هذه الـ X ماذا بقصد فيها؟ الـ root على الـ
tree هذا ال grammar اللي بيوصف وهذا اللي كاتبه
المبرمج كمان مش واحد مش كاتبالان انا في الخيار
الأول ال X هذي بدي اختار هاي و الله هاي و الله هاي
هتقوليلي على حسب ال look ahead الحالي صح؟ إذا ال
look ahead زائد إيش هتقولليلي هختار ال production؟
وامشي فيه طب إذا كان ال look ahead minus هتقولليلي
هختار هذي و امشي فيها طب إذا كان ال look ahead
فاصلة منقوطة هتقولليلي هختار هذي و امشي فيها طب
إذا كان ال look ahead فاصلة عاديةهتقوليلي error ما
عمره مابتطلع الفاصلة العادية من ال X فهتقوليلي
error على طول طيب افترضي غيرت في السؤال شوية و
قولتلك كان فيه خيار Epsilon و كانت هذه فاصلة عادية
مش هيقولليه error زي قبل شويةهيقول لي مافيش مشاكل
و هيختار مكان X إيش Y و يمشي عنها و خلاص إذا هذه
غلط بتتكشف من الناس اللي ورايا يعني هنا مش هيحددلي
إنها غلط لأنه ليش بقوله هنا إنه مسموح ما تكونش
موجودة ال X مسموحنا كانت فراغ فيمكن هذه الفاصلة
جاية من الناس اللي ورايا ليش أنت تروح تقول غلطفمين
اللي خلاني أسمح بالمرور عنها بدون غلط وجود ال
epsilon لكن لو هاي مش موجودة لأ محالة لازم ال X
تجلب يا هاي يا هاي يا هاي هيك بيقول ال grammar
خلاص
بيسيبها إيش يعني سابها يعني استبدلها ب epsilon
يعني بمعنى آخر لما أقوله سيبها يعني كأنه بدلها ب
epsilon ومش عنها واضحة؟ طيب أه إيش في عندكم أسئلة؟
واضح أن الطلاب أشطر منكم يعني حتى أسئلتهم سألوا
أسئلة هنا في مكانها في محلها و أنا منتظر أنكم
تسألوني أيام فإيش في منكم أسئلة أنا
منتظركم تسألوني سؤال مهم هنا يعني دلل
على أنهم فاهمين مستوعبين ودخلوا في ال process كويس
وصاروا يحللوا اه ما شاء الله عليكم
إيش سؤالهم كان بيقول؟ كان بيقول طيب أنت على فرض
أنه كان في fourين يعني structure تاني مش في ال F
مرات مرتين و ال four مرتين طيب كيف بدي أعمل في ..
كيف بدي أسوي في الحالة هذه؟ طيب غلط؟
طيب بيطلع في ال .. و تبتد أني غلط؟
يعني بتجاوبوا تقريبا حوالين الإجابة الصح المهم طيب
طب إذا التانية غلط مشي مشي و لجها غلط طيب لجها صح
طيب و لجها غلطلأ مش ده بالحالة خلاص خلاص ايوة كويس
الان كمان مرة الان لو في عندي fourين او تلاتة او
اربعة مافيش اي تعارض عن اللي قلناه هيمسك الأولى
ويمشي فيها عادي بس طبعا طالما فيه مكررات هيسجل لما
بصل لأولى ايش كان ال look ahead وان كانو إيش الـ
non-terminal اللي كان عنده و هيفوت الآن و يمشي في
الخريطة الأولى إن لجأ غلط بفتيش زي قبل شوية و بطلع
من ال system لأنه عارف أنه في غيرها بتبدأ before
فمش هيستعجل و يقول غلط هيعيد ال look ahead مطرح
مكان و هيرجع لل non-terminal تاني من جديد و يجرب
الـ four التانية إن لقى كمان فيها غلط إذا فيه four
تالتة هيرجع لنفس النقطة ويجرب ال four التالتة
لقاها غلط خلاص جربت التلاتة و غلط غلط غلط بطلع
بقول غلط شوفتي كيف لكن أكيد هلاحظ أن هذا شوية ممكن
يبطف ال system تكرار البدايات يعني إذا أنا قادر ما
تكونش البداية مكررة هذا إيش إيجابي عشان يكون يروح
مايرجعش وهذه النقطة هنتناولها كمان شوية نتكلم فيها
بالتحديدأول مرة الجهة حسب الوقت تمام؟ إذا مافي
إشكالية تكون في بداية مكررة بس في الحالة هذه مش
هستعجل و عند أول غلط أقول غلط و أطلع لأ في مجال
التاني تكون صح فلازم أجرب التاني فإذا مشيت للآخر
صح خلاص بيضل مكمل يعني هفرض ال for التاني اللي
استخدمها شفتي كيف؟ بس هي النقطة اللي احنا بدنا
نوّه إليها طيب
طيب الآن تعالوا نتكلم شوية من ناحية برمجية بدنا
نتكلم شوية من ناحية برمجية طيب خلوني نبدأ الآن و
نرجع تاني الآن بدنا نتكلم من ناحية برمجية كيف ممكن
نعمل برنامجللكلام اللى قبل شوية قولناه ان انا
بختار ال statement كيف بختارها كيف بستبدلها كيف
بقارن terminal مع terminal فهذا الكلام اللى كنا
نتكلم فيه قبل شوية بنشوف من ناحية برمجية كيف نعمله
الان بس فيه شوية ملاحظات ان احنا ال code اللى بدنا
نعمله بنسميه recursive decent parsing او ال parser
اللى بدنا نعمله recursive decent parsing ليش؟ لأن
احنا كمان شوية هنعمل function تستدعي نفسها ليش
هعمل function تستدعي نفسها؟ لو انت تطلعت شوية على
ال grammar مثلا هتلاقي انهإذا أنا ال statement
function مثلا لأنه احنا كل non terminal هنعملها
function هنشوف هذا الكلام كمان شوية فلاحظ ان ال
statement تستدعي مالها نفسها فطالما ال function
تستدعي نفسها معناها دخلنا على نظام ال recursion
طبعا مافيش طرق غير ال recursion اللي هنحل عليها لأ
في طرق في chapter اظن خمسة اربعة مش عارف بعدين
هناخدها لاتعتمد على ال recursion نسميها non
recursive decent parser طبعا ليش بقول مصطلح parser
لأنه أنا العملية اللي بيشتغلها parsing يعني ال
code اللي بيدي أسويه عشان يعمل عملية ال parsing
اسمه parserفعشانك هذا ال parser حسب طريقة برمجته
إذا أنا اعتمدت على recursion بيصير اسمه recursive
decent parsing إذا أنا ماعتمدتش على ال recursion
في عمله زي ما الشفاتر اللي قدام بتقول بيصير non
recursive decent parser اليوم احنا بس هنركز عالميا
في هذا ال chapter على ال recursion recursive
decent parser بس من ناحية تسمية تمام؟ هذه أول
ملاحظة الآن الشيء التاني ان هذا recursive decent
parserفي منه اتنين في واحد بيسمح بالرجوع بنسميه
with packet tracking زي ما في أسئلة ال exercises
بتقول وفي لا يسمح بالتراجع without packet tracking
ال without packet tracking هذا بنعطيه مصطلح
predictive parsingعشان نكون واضحين يعني لما انا
اقولك بدي تعمليه ل predictive parser او predictive
parsing معناه هذا parser من النوع اللي بيروح
مابيرجعش خلاص مالش فحص يرجع فيه تمام؟ مش بس هيك
وهذا من نوع recursive يعني هذا نوعه recursive
decent parsing فاحنا هنركز على هذا ال predictive
parser طبعا الان لو رجعت انا لمثال اللي جابلي شوية
وقلتلك على فرضفي فرتين تحت بعض لازم على طول تجيكي
معلومة لا يمكن عمل predictive parser في الحالة هذه
ليه؟ لأن طالما في فرين لازم أخده الأولى و أعمل
backtracking و أجرب التانية إذا لا يمكن عمل
predictive parser إلا في حالة واحدة إذا قعدت صياغة
ال grammar بطريقة تمنع تكرار البداية وهذه هنشوفها
بعد المشي الآنالمهم أنه أنا لا أستطيع عمل
predictive parser لما تكون البداية مالها مكررة لأن
المنطق يقول طالما البداية مكررة لازم أجرب الأولى و
لازم أرجع و أجرب التانية إذا بطل إيش؟ ال
predictive parser يبقى لما أنا من هنا و طالع أقولك
اعملي ال predictive parser لازم ال grammar اللي
يكون قدامك ماله مافيش فيه بداية مكررة طب إيش أعمل
لو فيه بداية مكررة؟إذا بنقدر نشيلها نشيلها يعني
إذا بنقدر نعيد كتابة ال grammar بطريقة ما أنه نمنع
البداية المكرمة بحنعمل هيك وهذا الكلام هنلاقيه
وارد بس بعدين مش اليوم بس أنا بدي أفهمك كمصطلح
طبعا هل في مشاكل تانية لل predictive parser؟ أه في
مشاكل تانية المرة الجاية بنتكلم عنها بس اليوم بدي
أعتبر الأمور سهلة شوية خلاص إيش هو ال predictive
parser؟ هو recursive decent parsing without packet
tracking تمام؟ طيباللي بتعرف تكتب و تتعلم و تكتب
ال predictive parser مش هيفرج معها لما يصير فيه
تكرار صح و بيبطل اسمه predictive لكن ك code بتقدر
تعمليه لأن كل اللي هتسوي انت تعيدي خطوة ترجع شوية
و تجرب اللي وراها يعني حتى سؤال ال exercise الخاص
بال backtracking مش صعب يعني مش هتلاقي حاجة بتتكلم
عن ال backtracking إلا من خلال سؤال exercise في
هذا ال section لكن كل ال section بعدين بتتكلم عن
إيش withoutbacktracking خلاص اللي هو تحديدًا
predictive parser وهذا اللي دائمًا بنسأل عنه طيب
الان تعالوا نشوف كيف أعمله هذا ال predictive
parser كيف أعمله لحسن الحظ طريقة عمله سهلة جدًا و
systematic جدًا تعلمتيها مرة بتعمليها كل مرة يعني
مافيش مجال أنه والله بدي أقعد أفكر و أبرمج و القصص
المتعبية لأطب كيف؟ وارينا الخطوات أول خطوة بقولك
إياها بشكل واضح وصريح كل non-terminal بدك تعمل
إليها function يعني الآن في السؤال هذا كام non
-terminal؟ تنتين؟ بدك تعمل إتين functionطبعا غير
ال function الأساسية اللي هي مين تاعة ال match مش
احنا قبل شوية قولنا لازم يكون في function بتقارن
الشغلتين اللي بروحوا عليها إذا مش متساويين بقول لي
غلط و بطلع و إذا متساويين بيمشي ال look أهد خطوة
للي ورا مش قولناها قبل هيك شوية ال match و بيمشي
التاني تنسيش function ال match لأن ال match هذه
أساسية و سيضاف إلها مين functional لل statement و
function لمينللـ object expression إذا كل non
terminal له function هذه أول ملاحظة طيب الملاحظة
التانية لما نيجي نتكلم عن ال statement function
هاي إيش في جواتها بدي يكون؟ من إيش مكوّنة هذه ال
function؟ قال بس مكوّنة من if else أو مكوّنة من
switch فال if else و ال switch زي بعض نفس الأشي
كيف يعني؟ يعني باختصارانت لما فُت جوا ال statement
هاد ال function مين بتختار هاي و لا هاي و لا هاي و
لا هاي؟ قولنا بناء على ال look-ahead صح؟ فانتش
هتسوي .. هتكتب ببساطة if look-ahead بيساو
exception إذا اختار هاي else if لسه أنا مش عارف
كيف هي انا اختارها كمان مش عارف اقول كيف هي انا
اختارها بس بديديكي ال condition else if look-ahead
بيساوي if إذا اختار هايelse if lookahead for إختار
هاي else if lookahead بيساوي other إختار هذه else
error طب لو كان epsilon بقولش إشي بقولش error
شوفتي كيف عملنا هاي؟ طيب ال function هاي تتوقعش
يكون جواها نفس الفكرة if lookahead بيساوي
expression إختار هاي else أه خلاص ماتعملش إشي
مليش إيش؟ وين هانا السؤال و لا هانا السؤال انت
ركزتي معايا هانا بدى اعتبر هانا epsilon تمام عشان
تشوف كيف بشترلها خلاص و بعدين نجي للي تحت if look
ahead بساوي expression هنختار هذه كلها else if
look ahead if هنختار هذه كلهاelse if look ahead
for نختارها دي كلها else if other نختارها دي other
else خلاص بعملش شيء بحطها أش حتى بكتبش else خلاص
بعملش شيء لكن لو هي مش موجودة else error فهي نسيها
خالص من قموسك في الآخر بس هي هتفرق معاكي أن ال
else الأخيرة تعمليها error و لا ماتعمليهاش error
فإذا في أحد الخيارات epsilon ماتعمليش error هيك
أنت بتكون نفّذت ال epsilonيعني خلاص ماعملتي إشي
إذا مش موجودة ال epsilon لازم تقولي error إذا أنا
ماجيت أعمل ال function هاي، هاي مافيش فيها غير
جملة واحدة خلاص if lookahead expression هختار
expression خلاص else مافيش شيءواضحة هذه كيف الآن؟
طيب الآن السؤال طب يعني كيف أنت أختار هذه؟ okay
أنا فهمت ال structure الأساسي تاع ال function أنه
switch أو if else لكن افترض مثلا look ahead for
أنت بتقولي اختار هاي كيف أختارها؟ كيف أمشي فيها؟
أقولك كيف تختاريها و ركزي معايا الآن لو جينا نقول
if look ahead تمام يساوي for مثلا طلع كيف أختار؟
بدأ أقول له match .. و هشرح لك أيش اللي أنا كتبته
match for فاصلة منقوطة match .. أحيانا ده أشرحك
اللي سويته فتحة الجوس study ال function .. مش هذي
function optional expression وراها match ايش أفهمك
أيش اللي سويته عشان تستطيع .. و بعدين هنكمل بنفس
العليه ركزي معاياماذا يعني match for يا بنات؟
معناه أنه يذهب لمكان معاه ويأخذ هذا الـ argument
معاه ويقارن هذا الـ argument اللي هو المفروض يكون
مكتوب مع من؟ مع الـ lookahead اللي كاتبه المبرمج
افترض هناك لجاهم زي بعض مش هناك ال lookahead هيمشي
هنا مش هيصير هيرجع هنا بكون خلص ال function مش روح
استدعاه ورجعماذا يعني رجع؟ يعني خلاص تجاوز الـ
four هذه اللي هنا صار بده يفحص اللي هو كاهد مع
مين؟ مع اللي ورايا لأنه رجع افترض يلاجأ غلط من
هناك يعني يلاجأ ان أنا بقوله بدي four و هدا كاتب
حاجة تانية هيقوله قرر يطلع مش هيرجعلي هنا لكن رجوع
هنا بالظبط معناه أنه ماشي خطوةو هناك في function
ال match ايش عمل لما لجيها نفس المكتوبة هي نفس
الجهة جالة ال lookahead امشي فانا ضمنت في ال match
ماشي خطوة ال lookahead لجديد و ضمنت رجوعه هنا انه
already تحرك عن ال four فايش بقوله بعد ال four ايش
ال function بديها طالما ال terminal هدا بقوله الآن
ارجع افحصفتحت جوس هيرجع ل match الآن إيش في ال
lookahead هناك؟ لجديد، هيقارنه مع مين؟ مع الجوس
اللي المفروض ينكتب، شابع بعض ال lookahead هناك
حيسر فيه، هيمشي و ترجع ال function هنا وصلت تبلجة
غلط، بطلعإذا رجوعه من ال function معناها إيش؟ أنه
تجاوز فحص ال four تجاوز فحص ال high طب الآن هذي
كيف بستدعيها؟ هل هذي بعملها match؟ هذي لأ هذي non
-terminal إيش هال non-terminal؟ يعني هذي function
بدي أستدعيها هيروح على ال function هذه if else ومش
عارف إيش ويشوف إيش المظبوط وهم يخلصوا لجيها مظبوطة
برجع ليكمل إنه لجيتإيش معناه ان اتجوزتها؟ انه
لقينا حاجة تستبدل بال optional expression ووصلنا
لهنا فبكون ال look ahead وصل هنا و بكون رجعت أنا
هنا إيش بقوله الآن؟ كمل إيش تكميلتي؟ match
semicolon استدعي optional match semicolon استدعي
ال optional match تسكيرة ال ghost استدعي ال
statement هاي خريطة إيش؟الـ for طيب إيش تتوقعي
خريطة ال expression يعني if lookahead تساوي
expression إيش بدي أقوله بدي أقوله match
expression match فاصلة منقوطة else if lookahead if
إيش بدي أقوله match if match افتح جوس match
expression match ساكر جوس study ال function
statement يعني كل non terminal يستدعى وكل terminal
بحطه في match بنفس الترتيب اللي لازم يكونالـ four
اتكلمنا عنها و بعدين match other تعالوا نشوف ال
code الآن و نختم عنده المرة جابنا نعمله simulation
ال code simple بدوش شيء هاي شايفينه اول
شي اشعملعمل function اسمها statement وعمل function
اسمها optional وعمل function اسمها ال match ركزيلي
على ال match لإنه ثابتة ال match هذه مالها طول
عمرها نفس الأشياء تتغيرش طلع ال match ايش بيقولك
في ال match بيقولك
بدي اشوف ال look aheadمع مين؟ مع اللي جاء من
الخريطة فتحة الـ GOS أو الـ FOR اللي كان المفروض
ينكتب يعني الـ T تمثل اللي المفروض ينكتب و الـ
Lookahead تمثل اللي كاتب و المبرمج بنقرنهم
متساويين، خلاص متساويين، بدنا نرجع، صح؟ بس إيش
بدنا نسوي؟ إن الـ Lookahead صار يمشي عالي ورا و
الـ function اللي بترجع يعني خلاص، اتجوزنا الفحص
طب في غلط؟بطلع خلاص بكملش بطلع ب error فال match
هي اختصار ال match الآن تعالى نشوف ال statement
اللي فوق
أيش بيقول في ال statement؟ عملها switch ال switch
لمن؟ لل lookahead زي FL's case expression شايفها
match expression match فاصلة منقوطة خلصنا هذه
خريطة ال production الأول match if إذا كانت if
match if match افتح قوس match expression match سكر
قوس خلصنا ال four طلعي؟بس إيش بيساوي دايما الـ non
-terminal؟ إيش يا بنات بيساوي فيه؟ الـ non
-terminal يُستدعى ك function ماليش علاقة و .. أه
طبعا هيروح على ال .. ال function إذا صح وفيش ..
فيها مشاكل وفيها chat وفيها كل شيء بيرجع إنه خلاص
لجينا optional سواء الـ epsilon أو ال expression
المرة الجاية حمل simulation كامل بس الآن شوفي بس
طريقة الكتابة simple خالص مافيش في أي شيءmatch
optional match optional match statement break شايف
ال case الأخيرة match other else إيش error عارف لو
كان فيها epsilon ماكانش هيحط ال error هذا لكن
مافيش epsilon يعني هي هي هي هي هي غلط إذا كانت
بعجة غيرهم آخر واحدة
هذه الـ Optional وين الـ Optional؟ هذه الـ
Optional إذا لك أهد إكسبيريشن ماتش إيش؟ إكسبيريشن
طب ليش ماعملش else error؟ لإن فيها إبسلون عارف لو
مش فيها إبسلون؟ كان عامل else error طبعا أنا ال
code هوقف الآن عنده هنا المرة الجاية ايش بدي أسوي؟
بدي أعتبر أن المبرمج كاتب four و أعتبر أن هاي ال
code موجود عندى و بدي أشوف كيف ال code هيكشف إذا
كاتب صح ولا كاتب غلط يعني المرة الجاية بدي أعمله
simulation كامل و نخلص من النقطة هاي إن شاء الله
يعطيكم الصحة والعافية