طيب بسم الله الرحمن الرحيم اليوم إن شاء الله بدنا
نستكمل آخر فرع موجود في درس ال 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 ل
-postfix نفس اللي أخذناها قبل هيك ك definition،
بدنا نأخذه اليوم على السريع ك translation scheme
الآن أول ملاحظة تلاحظيها أن كيف إحنا بنضيف هذا ال
semantic rule جوا ال grammar، جال بنضيفه على بين قوسين،
زي هيك بنميزه بين قوسين يعني طبعًا لما تفتحي هذا القوس
وتسكري هذا القوس بتعرفي أن اللي في النص بقصد فيه
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 اللي
بدي أحطه لكن هنا ليش سهلة استنباطها؟ لأن كل القصة
ال postfix هيبقى على إيش؟ أني بطبع الأرقام وبطبع
الإشارة بعد الأرقام باختصار عشان كيش جال جال كل ما
بطلع رقم بده أطبعه كل ما بطلع رقم بده أطبعه لكن
ماذا بده أطبع الإشارة وراهم عشان أضمن أن يجيني شو
ال 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 لقيت لك فتحة قوس لقيت لك لقيتك .. و يبعت لي هيك
الـ 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 اللي هي الأساس اللي لازم أبدأ منه ولا
واحدة بتستبدل فيها بـ while طب كيف تطلع while بيبقى
مستحيل تطلع الشجرة مش هيك أنت هتشتغل كـ 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 لازم فتحة
قوس لازم الـ 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 ahead الحالي ال
look ahead الحالي فاصلة منقوطة هل الفاصلة المنقوطة
بتطلع من هنا؟ يعني هل بقدر أستبدل ال 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 يعني ال
الكود اللي بيدي أسويه عشان يعمل عملية ال parsing
اسمه parser فعشان كده هذا ال parser حسب طريقة برمجته
إذا أنا اعتمدت على recursion بيصير اسمه recursive
recursive descent parsing إذا أنا ما اعتمدتش على ال recursion
فيعمل زي ما الشفاتر اللي قدام بتقول بيصير non
recursive descent parser اليوم احنا بس هنركز على ال
في هذا ال chapter على ال recursion recursive
descent parser بس من ناحية تسمية تمام؟ هذه أول
ملاحظة الآن الشيء الثاني إن هذا recursive decent
parser فيه منه اثنين في واحد بيسمح بالرجوع بنسميه
with backtracking زي ما في أسئلة ال exercises
بتقول وفي لا يسمح بالتراجع without backtracking
ال without backtracking هذا بنعطيه مصطلح
predictive parsing عشان نكون واضحين يعني لما أنا
أقول لك بدي تعمل لي predictive parser أو predictive
parsing معناه هذا ال parser من النوع اللي بيروح
ما بيرجعش خلاص ما له فحص يرجع فيه تمام؟ مش بس هيك
و هذا من نوع recursive يعني هذا نوعه recursive
descent parsing فاحنا هنركز على هذا ال predictive
parser طبعًا الآن لو رجعت أنا لمثال اللي جاب لي شوية
و قلت لك على فرض في فرعين تحت بعض لازم على طول تجي لك
معلومة لا يمكن عمل predictive parser في الحالة هذه
ليه؟ لأن طالما في فرعين لازم آخده الأول و أعمل
backtracking و أجرب الثاني إذا لا يمكن عمل
predictive parser إلا في حالة واحدة إذا قعدت تصياغة
ال grammar بطريقة تمنع تكرار البداية و هذه هنشوفها
بعدين، المهم إنه أنا لا أستطيع عمل
predictive parser لما تكون البداية ما لها مكررة لأن
المنطق يقول طالما البداية مكررة لازم أجرب الأولى و
لازم أرجع و أجرب الثانية إذا بطل إيش؟ ال
predictive parser يبقى لما أنا من هنا و طالع أقول لك
اعملي ال predictive parser لازم ال grammar اللي
يكون قدامك ما له ما فيش فيه بداية مكررة طب إيش أعمل
لو فيه بداية مكررة؟ إذا بنقدر نشيلها نشيلها يعني
إذا بنقدر نعيد كتابة ال grammar بطريقة ما إنه نمنع
البداية المكررة هنعمل هيك و هذا الكلام هنلاقيه
وارد بس بعدين مش اليوم بس أنا بدي أفهمك كمصطلح
طبعًا هل في مشاكل ثانية لل predictive parser؟ أه في
مشاكل ثانية المرة الجاية بنتكلم عنها بس اليوم بدي
أعتبر الأمور سهلة شوية خلاص إيش هو ال predictive
parser؟ هو recursive descent parsing without backtracking
tracking تمام؟ طيب اللي بتعرف تكتب و تتعلم و تكتب
ال predictive parser مش هيفرج معها لما يصير فيه
تكرار صح و بيطلع اسمه predictive لكن ك code بتقدر
تعمليه لأن كل اللي هتسوي إنت تعيدي خطوة ترجع شوية
و تجرب اللي وراها يعني حتى سؤال ال exercise الخاص
بال backtracking مش صعب يعني مش هتلاقي حاجة بتتكلم
عن ال backtracking إلا من خلال سؤال exercise في
هذا ال section لكن كل ال section بعدين بتتكلم عن
إيش without backtracking خلاص اللي هو تحديدًا
predictive parser و هذا اللي دائمًا بنسأل عنه طيب
الآن تعالوا نشوف كيف أعمله هذا ال predictive
parser كيف أعمله لحسن الحظ طريقة عمله سهلة جدًا و
systematic جدًا تعلمتيها مرة بتعمليها كل مرة يعني
ما فيش مجال إنه والله بدي أقعد أفكر و أبرمج و القصص
المتعبة لأ طب كيف؟ ورينا الخطوات أول خطوة بقول لك
إياها بشكل واضح وصريح كل non-terminal بدك تعمل
لها function يعني الآن في السؤال هذا كم non
-terminal؟ اثنين؟ بدك تعمل اثنين function طبعًا غير
ال function الأساسية اللي هي مين تاعة ال match مش
إحنا قبل شوية قلنا لازم يكون في function بتقارن
الشغلتين اللي بيروحوا عليها إذا مش متساويين بقول لي
غلط و بيطلع و إذا متساويين بيمشي ال lookahead الخطوة
للي ورا مش قلناها قبل هيك شوية ال 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
فاصلة منقوطة استدعي الـ optional match فاصلة منقوطة استدعي
الـ 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 كامل ونخلص من النقطة هاي إن شاء الله
يعطيكم الصحة والعافية