أنا الرحيم اليوم إن شاء الله بدنا نكمل اللي أخدناه
المحاضرة السابقة المرة اللي فاتت أخدنا حاجة رئيسية
اسمها predictive parser تتذكروا؟ تمام، ولجينا إن
هذا الـ predictive parser سهل ينعمل ما بدوش إشي
قلنا أي grammar موجود عندي عشان أقدر أعمله
predictive parser كل المطلوب إنه لكل non terminal
أنا الـ function و هنضيف عليهم function اسمها match
وقلنا إن حتى الـ non-terminal هذي اللي أنا عملته
لها function الـ code اللي جواتها سهل هو مجرد if
else أو switch فهي باختصار يعني احنا المرة اللي
فاتت لما أخدنا هذا الـ grammar قلنا
العملية سهلة جدا بدي function اسمها statement
function اسمها optional expression function اسمها
match، ولما جينا نكتب تفاصيل الـ function اللي هن
قلنا if lookahead بيساوي expression بدنا نختار هاي
كيف الاختيار؟ match expression match فاصلة منقوطة
لأنه قلنا الـ terminal بعمله match الـ non terminal
بعمله استدعاء طبعا الآن else if lookahead بيساوي
if بده اختار هاي كيف بده اختارها؟ match if match
افتح قوس match expression match سكّر قوس استدعي
statement else if look ahead for match for match
افتح قوس استدعي optional expression match فاصلة
منقوطة استدعي optional expression match فاصلة
منقوطة استدعي optional expression match سكّر قوس
استدعي statement else if other match other else
error لو كان في إبسلون ما نعملش else error كما قلنا
المرة اللي فاتت ولما جينا نعمل optional
expression سهل جدا كان if look ahead expression
match expression else ما نعملش error لأن هنا فيه
إبسلون والماتش سهل جدا الماتش مجرد مقارنة بين
الشيء اللي أنا ببعته اللي المفروض يكون مكتوب مع
اللي كاتبه الـ user الـ lookahead أو المبرمج إذا شبه
بعض ما فيش مشاكل من الـ match بمشي الـ lookahead خطوة و
برجع الـ code من مطرح ما أجا استدعاء الـ match باختصار
يعني الموضوع ما كانش فيه أي مشاكل الآن بس قبل ما
أعمل simulation للـ code اللي قلناه المرة اللي فاتت
بدي تكوني برضه فاهمة المعنى إيش يعني أنا الـ
statement استبدلتها بهذه هذه شو معناها؟ هذه معناها
أنه لازم يجي four عشان كنت بعمل match four بعدها
لازم يجي فتحة قوس عشان كنت أقوله match فتحة قوس
عشان أتأكد أن فتحة قوس مكتوبة من المبرمج بعدين هذه
إيش كنت أسويها؟ هذه لأنها non terminal كنت أستديها
كـ function وبرضه تفهمي معناها أنه لازم ييجي في
المكان هذا حاجة اسمها optional expression طب شو الـ
optional expression؟ عبارة عن إيش ولا إيش؟ عبارة عن
فراغ هاي تعريفها أو عبارة عن expression وبالتالي
لازم إن عايش أشوف هنا يا بشوف الفراغ إنه ولا حاجة
يا بشوف الـ expression عارفة لو هاي كان فيها
تعريفات كثيرة كنت هنا هشوفها، فبنكوني فاهمة إيش يعني
خريطة الـ four يعني بيجي four بيجي فتحة قوس وبعدين
بيجي شيء يعبر عن option expression اللي هو فراغ أو
expression في الحالة هذه ثم يأتي فاصلة منقوطة ثم
يأتي شغلة تانية أخرى تعبر عن option expression ما
هي؟ ممكن برضه expression أو فراغ وهكذا طب إيش آخرش
الـ statement؟ إيش معنى الـ statement؟ إنه قد يأتي
Statement، طب شو تعرف الـ statement؟ حاجة يا
expression، يا if، يا for، يا other، يعني أنت لازم
يكون عندك هذا التصور موجود من شكل الخريطة هذه، إيش
معناها، تمام؟ طيب، الآن نقبل نعمل الـ simulation،
عشان أنا أعمل الـ simulation، بدي أبدأ في الأول
أكتب اللي كتبه المبرمج المرة اللي فاتت، اللي احنا
عملنا له parsing، اللي هو إذا تتذكروا four فاصلة
منقوطة expression فاصلة منقوطة expression مظبوط
other مش هذا اللي كان مكتوب المرة اللي فاتت وكنا
بنبدأ من وين المرة اللي فاتت الـ look ahead من وين
بعدي الـ look ahead بعدي من هنا الآن السؤال طب كيف
عملية الـ parsing بدها تبدأ من وين؟ أنا أبدأ الـ
parsing ببساطة بدك تبدأ تستدعي الـ function بتاعة الـ
start symbol اللي هي في حالتي مين؟ هي الـ function
بتاعة الـ start symbol الـ statement قال بمجرد ما
نستخدم هذه الـ function الـ statement automatic
عملية الـ parsing تحدث automatic هذا حيصير يمشي
ويفحص ويقارن نفسه بالخريطة تبع الـ statement واحدة
من اثنتين يا هذا بيمشي للآخر الـ look ahead وبتخلص
الاستدعاء الـ function بالكامل بدون أي مشاكل وفي
الحالة هذه بنقول عملية الـ parsing تمت بنجاح يعني
المكتوب من المبرمج يطابق الـ syntax اللي المفروض
يكون، طب إذا في خطأ في الطريق يعني مش كاتب صح إلا ما
يطلع من الطريق طب تعالوا نشوف simulation لهذا
الكلام وخلينا نبدأ بالـ code اللي عملناه المرة
اللي فاتت ونعمله simulation هذا الـ code عملناه
المرة اللي فاتت طيب statement optional match وجوه
الـ statement if ال زمان تفاجئنا الآن مين أول
function هنستدعيها عشان نتأكد إنه هذي مكتوبة على
اللي قلنا اللي هو مين؟ الـ statement ممتاز إذا هيفوت
أول ما يعدي من الـ statement طبعا يا بنات إذا وصل من
هنا وخلص هنا بدون أي رسالة error يعني خلاص استدعيت
الـ statement وخلصت إيش بدك تفهمي في الحلقة هاي إن
هذا كله مكتوب صح، معناها بالفعل هذه تمثل statement
مش هذا جوا تعريف الـ statement فطالما أنا استدعيت
statement وبدأ وخلص معناه كل المكتوب هذا يمثل
statement بشكل سليم، إذا بنقول ما فيش مشاكل في حال
وجود أي مشكلة هتلاقي هذا مش هيكمل للاخر هتلاقي هذا
في رسالة معينة عند الخطأ اللي ما يلاقيه يقول خطأ و
يطلع وهذا اللي هنشوفه الآن كيف يصير بس أنا فاهمة
اللي بتفهميه من البداية إنه أنا استدعيت الـ
statement والله إذا اكتمل تنفيذ الـ function من
الألف إلى الياء بدون أي مشاكل معناها إن هذا
المكتوب يتطابق مع الـ syntax إذا في مشكلة مش هيكمل طب
تعالوا نشوف كيف أول ما بدينا إيش هيعمل؟ switch لمين؟
للـ lookahead الـ switch إيش الـ look ahead
الحالية؟ four يعني هيفوت في case expression ولا
في case if ولا في case for؟ four ليش؟ لأنه خلاص
طالما الـ look ahead four معناه هيعدي هنا الآن مش
بقوله هنا بقوله تبقى كل هدول أول مبادئ إيش بقوله؟
match four الآن إيش يعني match four؟ يعني بدي يسيب
المكان ويروح على function وينفذ وبعد ما يخلص
تنفيذ هيرجع لهالّي بيقول لسه ما خلصش الـ statement
لسه بده إيش؟ يكمل بس مقروف يستدعي الـ function
بيسيب مكانه بيروح بنفذ الـ function بيخلص و بيرجع و
بكمل الـ code شكوا لأ؟ طيب الـ match four أنا إيش الـ
parameter اللي بعته أو الـ argument اللي بعته كلمة
four الآن وين الـ match تعالوا نشوف كلمة الـ match هي
هالـ match تحت، خليني بس أكبر شوية أو أصغر شوية هاي
الـ match إيش الـ argument T يمثل؟ في الحالة تبعتي
four والـ T يا بنات تمثل اللي المفروض ينكتب اللي
المفروض ييجي الـ syntax الصحيح هذه الـ T اللي أنا
جاية من الخريطة فجاييني بيقول لازم يكون مكتوب four
إذا بيكون صح الآن الـ look ahead إيش يمثل؟ الوضع
الحالي، الآن هل الـ look ahead هي four والـ T four شبه
بعض؟ شبه بعض، إذا ما زال شبه بعض إيش بيقول لي الآن؟
خلاص نتجاوز الفحص الـ look ahead إيش يساوي؟ اللي
وراها هات الـ token اللي وراها طبعا يا بنات المفروض
من وين بيجوني الـ four وفتحة القوس والأمور هذه
بيجوني من الـ lexical بالدور فالـ look ahead كان على
الـ four فهذا بقوله خلاص الـ four ما فيش فيها مشاكل
إذا على طول ماشي السهم لفتحة القوس طيب الآن إيش
هيسوي؟ هيسيب هذا المكان طبعا مش هينفذ اللي تحت
لأنه else فخلصت الـ match وين هيرجع؟ هيرجع من مطرح
ما أجاب في الـ four هنا، هيكمل هذا الآن إيش يعني أنا
لما أقول له match افتح قوس معناها إنه لازم يكون
كاتب المبرمج فتحة قوس إذا بدنا نكون شغالين صح طبعا
انتبهي ما بظبطش واحد يكتب في البرمجة four يكتب
نصها ويسكت أو يكتب على كيفه لازم خلاص طالما أنا
قلت four لازم تكتب بالكامل صح عشان يكون شغله صح
فأنا جاي على هذا بقول كيف يكون شكلها الصحيح لكن
لسه أنا مش عارف إيش هو كاتب عشان إيه؟ أنا بقوله
بقوله المفروض إنه بعد كلمة for المفروض يكون كاتب
فتحة قوس من هذا النوع طبعا من يبدو يتحقق ببعت
الكلام للتحقق لـ function match فالـ match هيسيب هذا
المكان بس ماخد إيش؟ ماخد اللي المفروض ينكتب ينتقل
وين؟ على ال match طبعا ال T تمثل أن المفروض ينكتب
ماشي الحال هل ال look ahead الحالي .. شو ال look
ahead الحالي؟ هو نفس القوس هو بيساوي ال T؟ أه هو
كاتب صح نفس القوس إذا إيش بقوله؟ خلاص امشي يا look
ahead خطوة و ارجع من المطرح المجيد طب على فرض أنه
كاتب القوس غلط يعني المبرمج كاتب four وكاتب وراها
bracket زي هي كان إيش بيصير؟ طبعا هذا هيلاقي إنه
مختلفين بيلاقي إنه المكتوب لا يطابق اللي المفروض
يجي إيش هيقوله؟ syntax error يطلع خلاص شوفتي؟
يعني إذا كان كاتب غلط إيش بيصير؟ بطلع من ال code
خلاص بطلع من البرنامج برسالة syntax error باختصار
إذا كاتب صح بيكمل الآن دفترن أنه كاتب إيش دفترن أنه
كاتب صح فتحت course الآن هنرجع لهذا إيش بيقول ال
look ahead امشي للي ورا لأن هذا ما فيه مشاكل فال
look ahead يقوم بيصير واقف على الفاصلة المنقوطة
بينما بيرجع وين ال code بيرجع هنا مش احنا دائما أي
function بتروح و بتتنفذ و بترجع من مكانها اتنفذت؟
طب إيش باقي الكلام بيقول؟ لأن في تكملة بقولك لل
four لسه ال four مش بس ال four وفتح يجوز ال four
فيها elements فيها components فلازم يتحقق كلها
موجودة عشان يقول صح الآن وصلنا لما راح تشوف
optional expression الآن بدو يستدعي function جديدة
أكيد هيروح عليها بعد ما يخلص لازم يرجع وين؟ ع
المكان نفسه طبعا برضه بيكون فيه أندك شوية فهم إيش
بقصد بال optional خلنا نسأل إيش بقصد بال optional
expression أكيد لازم .. طبعا إيش التعريف أخذنا؟ يا
expression يا epsilon صح ولا لأ؟ وبالتالي هل أنا
مسموح لي أكون كاتب فراد أو مسموح لي أكون كاتب
expression إذا هو بيكون صح؟ طبعا أنا من وين عرفت
هذا الكلام؟ من تعريفي جابني شوية لل optional
expression لكن افترض أنك مش عارفة لسه فالمهم أنه
احنا هيسيب التنفيذ هيروح وين ينفذ بعد ما يخلص وين
هيرجع .. هيرجع وين يكمل الآن تعالوا نشوف ال option
expression إيش بيقول هل ال look ahead الحالي يساوي
expression طلع في ال look ahead لأ طب ما قالش error
ولا هيقول error ليش لأنه في epsilon فما يقولش error
لكن خلص ما دخلش جوا ال if خلصت ال option expiration
و ما بدى يرجع هيرجع لهنا خلاص نفذها راح ما لاقاش
exception عرف أنه ما فيه error يعني أنها فراغ كان
ولا حاجة فكأنها فراغ ورجع ما عملش شايفة ما قال error
عارفة لو ال epsilon ما كانتش موجودة كان جال else
error يعني ساعتها إيش بيكون أنه لازم تيجي هي
optional expression و إلا غلط فلما بيكون مش كاتب
expression بيصير غلط شوفتي كيف؟ لكن احنا مسموح في
ال grammar ال epsilon يكون موجود عشان إيه كما قفته
و جال غلط جال خلاص أنا بالنسبة لي ما فيه مشاكل ارجع
من المطرح اللي ما جيه، خلصنا شوفتي أنتِ كيف؟ فالآن
هيرجع .. فالآن هيرجع وين يا بنات؟ هيرجع هنا يخلص و
الله هيكمل؟ هيكمل، إيش بيقوله؟ بقوله الآن لازم يكون
فيه فاصلة منقوطة إذا بدّه يكون شغلنا صح فبروح
ببعتله match فاصلة منقوطة، هيروح لل match إيش جايب
معاه اللي المفروض يكون مكتوب الآن هل ال look ahead
الحالي هو فاصلة منقوطة؟ إذا أه بمشي look ahead
خطوة و برجع هناك طب افترض هو بالغلط كاتب فاصلة
عادية ساعتها هيلاقي الفاصلة العادية مش هي الفاصلة
المنقوطة ساعتها هيلاقي ما فيش يتطابق بين اللي المفروض
يكون مكتوب و بين المكتوب الفعلي و إيش هيسوي؟ هيقول
error يطلع، هذا لو كاتب غلط لكن احنا بنفترض إنه مش
كاتب برضه، صح شفتي؟ بس الفكرة إن عند أي غلطة بيطلع
ب syntax error إذا كاتب صح بقول صح كمل الآن هنا
الفاصلة المنقوطة lookahead هي نفس الفاصلة المنقوطة
اللي لازم تكون مكتوبة إذا إيش هيقول ليه؟ امشي خطوة
lookahead ورجع فهيمشي ال lookahead وين هيصير؟ هنا
طبعا طالما خلصت ال function automatic برجع وين؟ من
المطرح اللي استدعاها مش هيك أنتو بتعرفوا البرمجة
فهيرجع وين؟ هنا الآن إيش بيقوله استدعي optional
expression هيروح يستدعي ال function optional
expression هل ال look ahead بتساوي expression؟ أه
بتساوي expression اعمل match لأن فهنروح نستدعي ال
match ال match إيش بتقوله هل ال look ahead هي نفسها
الحالية ال expression هي نفسها ال expression اللي
جاية هنا؟ أه هي نفسها إذا ال look ahead إيش بيصير
فيه؟ بيمشي خطوة بيصير وين؟ تمام؟ الآن وين بيرجع ال
match؟ برجع ل هنا لأن هنا بدأ هو يحط خريطة ال
option and expiration هي طلعت كلمة واحدة ما فيه
غيرها أنتِ تخيلي ال expiration في ورافط الجوز وكده
كان كمل match match none الآخر بس هنا واحدة فرجع
هنا الآن ما ضل إيش في إيش في ال option وين هيرجع؟
هنا مظبوطة ولا لأ؟ الآن إيش بيقوله أنا؟ match .. طب
أنا ماشيين صح .. أه؟ الآن .. لأ احنا هنا وصلنا ..
وين وصلنا؟ طيب، عملنا ال optional؟ هاي .. تمام؟
الآن إيش هنقوله؟ match فترة .. فاصلة منقوطة .. وين
بدّه يروح الفاصلة المنقوطة؟ هنا هل ال look ahead
الحالي فاصلة منقوطة؟ طبعا هذا المفروض أنه مش مارو
يا بنات المفروض أنه ماشي بعد هذه، مظبوط ولا لا؟
على طول when do you see her بعد ما أنا اخترت هنا
magic separation مش المفروض أنه يمشي عنها للفاصلة
منقوطة فهيروح يخلص الفاصلة منقوطة احنا المفروض
هنا يا بنات أه ما فيه .. ما فيه كملة أه في optional أه
بقول فيه كمان optional أه بقول وين هي؟ خلاص، بويس،
لأنه بقول وين هي دي فكرة رايحة، خلاص، مية لمية،
المهم بنفس الأنية يا بنات، ماشي الفاصلة المنقوطة،
هيمشي لوين أخر مرة؟ هيصير هنا، صح ولا لأ؟ ليش؟ لأن
الفاصلة المنقوطة هينزل تحت، هيلاقي بالفعل هو كاتب
صح، بخلص، برجع لهنا، طبعا أكيد كمان مرة، لو كاتب
غلط، إيش بيصير؟ بيصير error، مظبوط؟ لكن كاتب صح،
اللي أنا إيش بقوله بعد هيك؟ لازم يجيني كمان مرة
optional expression بنفس القليل هيروح على optional
expression تمام؟ حال ال look ahead الحالي
expression أه expression هقوله match هينزل على ال
match ال matches هيسويه هجيه متطابقين هيروح يمشي
هذاش خطوة يصير تسكيرة ال course و بعدين وين يرجع؟
هيرجع هنا، مظبوط؟ و بعد ما .. لأنه خلص من ال match
برجع لهنا و بخلص من ال optional برجع لوين؟ لهنا مش
هيك ولا لأ، الآن إيش بقوله بعد هيك؟ لازم يكتب
تسكير القوس، هيك معناها فالآن بروح كمان مرة لمين؟
للماتش، إيش بقوله؟ هل ال look ahead الحالي وينها؟
اللي هي هاي، هل ال look ahead الحالي هو تسكيرة
القوس؟ طلع فيه، مظبوط طب افترض هو مسكر غلط، اعمل
bracket، هيلاقيهم مش شبه بعض، يقولوا إيه رو يطلع،
إنزال مسكر غلط طب هو مسكر صح بالفعل هاي ال look
ahead المكتوب يطابق ال look ahead اللي المفروض
ينكتب اللي هو ال token المفروض ينكتب، الاتنين
يتطابقوا بعض، إذا إيش نقوله في الحالة هاي؟ امشي خطوة،
فبمشي هنا على ال other وين برجع ال code؟ برجع هنا،
خلصها من ال match هاي إيش بقوله الآن؟ استدعي
statement من جديد يعني تباريحها function مختلفة،
هيرجع من جديد وين؟ في ال statement الأساسية،
مظبوط؟ بس بعد ما يخلص منها يا بنات، هيرجع ويقول
break ويطلع مش احنا بنستدعي statement اعتبرها
مختلفة مش بدّه يروح ينفذها و لما يخلص بدّه يرجع هنا
إيش بقوله بعدها؟ يعني خلصنا خلاص break اطلع خلصنا
من ال code مش هيك؟ بس خلينا نستدعيها كمان مرة و
نشوف إيش بدّه يصير اللي لما استدعيتها كمان مرة ال
look ahead switch إيش ال look ahead الحالي؟ other
يعني أي case اللي هيدخل فيها other إيش بقوله match
other هيروح تحت يلاقي other و other في ال match صح
زي بعض هيمشي هذا إيش خلاص خطوة تمام و يرجع وين على
ال other وينها ال break إيش يعني break يعني خلصنا
ال statement هيرجع وين هنا ال break طلع من ال
switch خلص ال function طلع من ال function بسلام
بدون أي error بدون أي مشاكل، إيش هنفهم أنه الكلام
المكتوب كله هنا ماله يطابق ال syntax بقى النمج،
هاي باختصار يعني يا بنات القصة باختصار، باختصار
بمجرد ما أنا أستدعي ال non-terminal function ال
statement ويكون ال look ahead واقف automatic هتصير
عملية parsing ليش؟ لأن ال function قاعدة بتقولي إيش
يصير ال function قاعدة بتقولي خريطة ال four ابدأ ب
four ثم كده ثم كده فقاعدة بتقول إيش المفروض يصير
فالاتنين بيمشي مع بعض عملية الماشي مع بعض عملية ال
parsing بتتم ببساطة باستدعاء الـ statement function
بس أنا إيش عن استدعاء الـ statement function؟ يعني
بدأ يعمل عملية الـ parsing عشان هيك هذا إيش بنسميه
إحنا الـ code اللي احنا كتبناه سميناه
Pseudocode for predictive parser واضحة؟ لماذا اسمه
predictive parser؟ لأنه بعمل عملية parsing بعمل
عملية parsing بعمل عملية parsing بعمل عملية
parsing بعمل عملية parsing بعمل عملية parsing بعمل
عملية parsing بعمل عملية parsing بعمل عملية
parsing بعمل عملية parsing بعمل عملية parsing بعمل
عملية parsing بعمل عملية parsing بعمل عملية
parsing بعمل عملية parsing بعمل عملية parsing بعمل
عملية parsing بعمل عملية parsing بعمل عملية
parsing بعمل من الـ start symbol إلا واحدة من
تنتين يا هيكمل للآخر ويقول لي خلاص المكتوب يطابق
الـ language يا error أنه لا يطابق الـ language بس
طالما أنت استدعيت الـ start symbol انتهى يا إما
بطلع بـ error أنه لا يطابق المكتوب يا بطلع بشكل
سليم أنه مافيش مشاكل واضحة؟ في أي مشاكل الآن؟ الآن
بدي تسأل تتفضل تسأل احنا يا بنات كل اللي سويناه
لحد اللحظة predictive parser كل ما صنعناه
predictive بارثة يعني
كمصطلح predictive هي تنبأ يعني بيرجعش من الآخر
قولنا فيه خصائص أنه لأ بيرجعش without backtracking
يعني خلاص عرف الصح وظل ماشي تنبأ صح وظل ماشي هيك
المصطلح يعني في أي سؤال؟ طيب بنات الآن هنا في
ملاحظات مهمة لازم تنتبهي لها
عشان هتمول معانا قدام أنا لما كنت أستبدل الـ
statement بأحد الـ productions كنت أقارن كل
production ع السنة أستبدله ولا كنت أقارن بدايته
فقط بدايته يعني أنا كنت بأطلع الـ lookahead إذا الـ
lookahead F خلاص بأخذ كل الـ F إذا look ahead four
بأخذ كل الـ four إذا look ahead X position بأخذ كل
X position إذا look ahead other بأخذ كل الـ other
مش هيك يعني أنا مين كنت أطلع و أركز على بدايات الـ
non terminal على بدايات الـ production فهمتي في هذه
النقطة مهمة ليش أنا بقول هذا الكلام لأن في
المستقبل ممكن يكون الـ grammar أصعب من هيك و
البداية مش واضحة فانضطر نحسب البداية يعني كيف مثلا
يعني أجي أقول الـ X بتعطيني مثلا Y و الـ Y بتعطيني
مثلا Z و الـ Z مثلا بتعطيني زائد مثلا الآن الواضح
أن الـ X قد تبدأ بزائد لأن الـ Y ممكن تستبدل بـ Z و
الـ Z ممكن تستبدل بزائد فكأنه الزائد ممكن تبدأ فيها
الـ X صح ولا لأ؟ لكن هذا كان مخبأ البداية ما كانت
واضحة أنا هنا واضح أن كلهم يبدو بـ terminal فكان ظاهر
للعيان بدايات الـ statement فكان سهل عليا أعرف أي
production اللي بديه الآن البدايات واضحة لكن أحيانًا
في بعض الـ grammar زي ما هشوف مستقبل في شبات الجدام
أنه ممكن يكون البداية مش واضحة مخبّاة يعني عشانك
هنضطر في خطوة أولى نحسب الـ first شو البدايات عشان
أقدر أعمل الـ code لإن كيف نيجي نعمل EFL وكيف نيجي نقر أن
أنت مش عارف البدايات فهذا قدام هناخده مش لما نيجي
بكرا في المستقبل نقول نتكلم عن البدايات نقول شو
بدنا في البدايات هي من اليوم بفهمك شو بدنا في
البدايات اليوم البداية واضحة سهلة أقفلت وخلصتها لكن
ممكن البدايات اللي الـ productions يكونوا مخبيين
وهذا هيبين معنى إن شاء الله في شبط الأربعة قدام
كيف لو مش مبين البدايات كيف أعرفهم كيف أعمل الـ
code كيف أعمل predictive parser ففي تفاصيل بعدين
خلاص المهم هي الملاحظة اللي بدي تعرفيها أنه
البدايات بتلعب دور في عملية البرمجة بتاعة الـ
predictive parser ملاحظة ثانية قلناها المرة اللي
فاتت إذا كان فيه بداية مكررة ما بقدرش أعمل
predictive parser لأن البداية المكررة معناها
إجباري لازم ترجعي تكملي التاني تفحصيها يعني فترضي
في خريطتين للـ four فدت في الأولى يعني خلاص إذا غلط
تقولي غلط ولا الصح لازم تعودي و تشوفي التانية طالما
قلنا تعودي و تشوفي التانية طالما قلنا with
backtracking بطل هذا predictive parser إذا الـ
predictive parser شرطه واضح أنه بمشي مرة واحدة
برجعش طيب إيش أعمل لو كان الـ grammar فيه بدايتين
مكررات؟ ما فيش قدامك حل يا إما بتعيد صياغة الـ
grammar بطريقة لا تسمح بتكرار البداية حتى تقدر
تعمل predictive parser يا إما بتعمل حاجة with
backtracking زي ما في أسئلة في الـ exercises هذه
باختصار عشان نكون احنا واضحين تمام؟ طيب تعالوا
نشوف شغلة ثانية في أي أسئلة لحد هنا يا بنات؟ طيب
تعالوا نشوف شغلة ثانية إيش
رأيكم لو كنا كاتبين grammar
كالتالي except بس grammar بس جملة واحدة expression
زائد term خلاص و الـ term مثلا zero لواحد لتسعة
ماشي وجينا نقولك اعملي لي predictive parser للـ
grammar اللي على اللوح واضح السؤال؟ أنا كتبت
grammar الآن من هندي ثاني غير اللي قبل شوية و
قلت لك اعملي لي predictive parser كيف تكتبي برسل؟
الـ شاطرين هيقولوا ليه بدي function للـ expression و
بدي function للـ term باختصار طيب function
expression كيف بنكتبها؟ طبعًا يا بناة طبعًا يكون x
تعطيني y و z كيف بنكتب الـ function x؟ باختصار
بنقول استدعي y و استدعي z لا بتهاشيشي يعني لأن ما
تكون جملة واحدة لا F ولا L ولا غيره خلاص هي الـ X
عبارة عن non terminal Y و non terminal Z فبقول
أستاذ E Y أستاذ E Z خلصت عادي إذا فيها زائد و ناطق
سير F L يعني الأمور سهلة بالخالص الآن لو قلت لك
اعملي لي predictive
parser لهذا الـ grammar كيف تكتبي الـ function تاعة
الـ expression؟ إيش هتعملي؟ آه
كفي يعني هيك expression بعدين
بديك
تكتبي expression في الأول بعدين match زائد بعدين
إيش بعدين study function term و الـ function term if
look ahead 0 match 0 if look ahead 1 match 1 if
look ahead 9 match 9 و بعدين match .. بيظبطش ..
ليش بيظبطش؟ لأ ليه بيظبطش؟ هنا بيظبطش لأنه هنسير
هنا في infinite loop للأسف الشديد expressions said
expressions said expressions said expressions
وبالتالي هتلاقي حالك هنا للأسف قلقتي في infinite
loop و مش هتطلعي منها هذا الخطأ المميت هنا في الـ ..
في الـ .. في الـ project بارسا مشكلة قال في مشكلة
بنسميها left recursion و هذه المشكلة تحدث عندما
يكون الـ non terminal قبل السهم يبدأ بنفسه بعد
السهم يعني بالشكل هذا لما أقول الـ X بتعطيني X أي
حاجة بعد هيك خلاص صار في عندي مشكلة left recursion
لأنه الطبيعي جدا الـ X بتبدي فيها الـ function X
فبيصير إيش إلف بلا انتهاء اللي سبب المشكلة كمان مرة
يا بنات أن الـ non terminal قبل السهم بدأ بنفسه على
طول بعد السهم أول ما تشوفي الحركة هاي اعرفي أنه
بطلنا قادرين نعمل predictive parser ليش؟ لأنه
هندخل في infinite loop مش هنطلع منها طب السؤال لو
حطيت ghost زي هيك بيصير هذا الـ infinite loop؟
الإجابة لأ، ما فيش مشاكل الدليل أنه ما فيش مشاكل عشان
تستوعبيها صح احنا قبل شوية عملنا simulation صح؟ مش
عملنا simulation لهذه؟
خليني أورجيكي إياها كجرامر أحسن هاي شايفة؟
هاي الـ statement و هاي الـ statement موجودة مرتين
نفسها فاحنا مش مشكلة تكون موجودة أكثر من مرة في
الجهة الثانية مش مشكلة مهيها زبطت ما أعرفش مشاكل مش
هاي الـ statement قبل السهم هي موجودة بعد السهم
يعني موجودة جملة جوا للـ production لكن المشكلة وين
عندما نبدأ بها بعد السهم يعني لو كانت الـ statement
هذه في الأول والله هذه في الأول كان حيصير في مرحلة
ما infinite load يبقى ممنوع منعا باتا أن الـ non
terminal قبل السهم يبدأ بنفسه بعد السهم مباشرة مش
هقدر أعمل الـ predictive parser لأنه فيه أنا مشكلة
left recursion لأنه في أنا مشكلة infinite loop
بدها تصير باختصار لكن كمان مرة ما فيش مشكلة لو بدأ
بأي شيء غير نفسه يعني شايفة؟ هذه فترة الجوز اللي
أنا حاطيتها الآن خلّيته عادي ما في مشاكل خلاص بقى
اشتغل عادي if look ahead افتح الجوز ماتش افتح
الجوز if look ahead if look ahead if look ahead if
ahead if look ahead if look ahead if look ahead if
look ahead if look ahead if look ahead if look
ahead if look ahead if look ahead if look ahead if
ahead if look ahead فماعندي مشكلة أن نفس ال non
terminal يكون موجود في الجهة اليمين مش مشكلة لكن
مايكونش هو إيش أول شيء ليش لأنه لو كان أول شيء صار
عندي infinite loop واضحة المشكلة الآن تحت ال
predictive parser إذا اللي حتى الآن احنا في
predictive parser فيه مشكلتين مشكلة تكرار البداية
مابقدرش اعمل فيها predictive parser ومشكلة ال left
recursion وطبعا مشكلة ال left recursion ليس فقط لـ
predictive process لأي حاجة recursion يعني ما يمكننا
أن نقول إن هناك backtracking ولا يوجد
backtracking قبل قليل في ال recursion الاتنين
هؤلاء لن يعرفوا أن يشتغلوا عندما يكون ال non
terminal قبل السهم يبدأ بنفسه بعد السهم لأنك خلاص
دخلت على طول في infinite loop وبالتالي لن تستطيع
أن تشتغل إذا هذا ممنوع إذا أردت أن أعمل ال
recursion صح واضحة ال problem؟ طيب، الآن شو الحل؟
أنا بدأ أعمل predictive parser وال grammar اللي
قاعد قدامي فيه بداية مكررة وفيه left recursion شو
الحل؟ واحدة من اثنتين، الحل واحدة من اثنتين يا إما
أنا مستحيل أعمل ال predictive parser لهذا ال
grammar يا إما أنا بدي أعيد صياغة ال grammar أغير
في شكله مش في مضمونه بحيث أني أبطل أشوف بداية
مكررة وأبطل أشوف left recursion باختصار إذا أنا
نجحت أني أغير في ال grammar كشكل وليس كمضمون و
مايكونش فيه بداية مكررة ومايكونش فيه left
recursion معناه أنا قادر الآن إيش أعمل predictive
parser طب شو الأصح والأسرع أنا عندي grammar فيه
بداية مكررة وفيه left recursion وجادر جادر خلاص
أشغل مباشرة عليه تمام وماأعملش predictive parser
أعمل حاجة ثانية وبرنامج ثاني تمام وجادر أني لأ
أظبطه شكلاً وأشيل ال left recursion وأشيل الفيديو
المكرر وأعمل predictive parser مين تتوقع الأفضل و
الأسرع؟ أظبطه وأعمل ال predictive parser لأن ال
predictive parser performance عالي خلاص ال grammar
إذا أنا بقدر أظبطه أسهل أعمل predictive parser
عشان يكون efficient effective performance عالي ولا
أني كل شوية رايح راجع جرب مش عارف صح ولا لأ يبقى
أهنا السياسة تبعتنا بعد اليوم لما حد يقول لي اعملي
predictive parser لهذا ال grammar بدأ أطلع فيه في
الأول أن هو جاهز فهو جاهز واشتغلنا إن مش جاهز
بدنا نجهزه كيف يعني مش جاهز؟ يعني في بداية مكررة،
معناه بتدلغي البداية المكررة طب كيف؟ القوانين
هناخدها لاحقًا في شفتر أربعة واحد زائد واحد يساوي
اثنين، في قانون كيف البداية المكررة تنشال مش اليوم
هناخده، هناخده مستقبلًا، عشان هيك الأمثل اللي بتمر
معانا اليوم مافيش فيها بداية مكررة طب المشكلة
الثانية الـ left recursion قال اليوم بدي يعلمنا
الآن كمان شوية كيف هذا الـ left recursion أشيله
يعني كيف أعيد كتابة ال grammar بشكل ثاني تمام بدون
ما يكون فيه left recursion وبرضه الحلو في الموضوع
واحد زي واحد سوى اثنين يعني ما بيدّيش لا تفكير ولا
ما يحزنون اعمل كده سوي كده بيطلع معاكي grammar
جديد شكله متغير مافيش فيه left recursion لكن
مضمونه زي اللي قبل شوية بدنا نشوف هذه القصة واضح
عشان أعمل الآن؟ بدنا نحل مشكلة مين؟ left recursion
تعالوا نشوف القانون اللي بتكلم فيه
هذا هو الـ left recursion وهذا شكله أن الـ non
terminal قبل السهم بدأ بنفسه بعد السهم تعالوا نشوف
كاملة الحلقة
وركزوا معاها يعني اللي أنا إيش بقول بقول على فرض
أن ال A بتعطيني A Alpha أو Beta طبعًا أنا إيش بقصد؟
أنا بتكلم in general يا بنات إيش بتكلم بقول in
general؟ إيش بقول؟ بقول على فرض إنه هذا non
terminal إله اثنين productions ال production
الأولاني ببدأ بنفسه طب إيش برمز بالألفا؟ الباقي،
يعني ممكن يكون terminal، non-terminal، زائد، ناقص،
term، مش عارف إيش المهم إنه بيبدأ بإيش؟ بنفسه
وبعدين في حاجات ثانية ورا أو في production موجود
ماله، في الأساس ما ببدأش بنفسه، مش فيه مشاكل قال
هذا في مشكلة واضحة، شو هي المشكلة؟ left recursion،
صح؟ كيف نحلها؟ قال هي هيك بنعيد كتابة شكله مش
مضمونه، شكله، كيف؟ وركز معاه عشان تحفظ القانون قال
أول شيء بتقولي الـ A اللي فيها المشكلة هاي اتطلعي
على ال production اللي مافي مشاكل اللي هو beta
بتاخد ال beta بتضربيها في مين؟ في non-terminal
جديد سميه R هذا non-terminal جديد هيك بيقول
القانون لأن الكلام مش عارف بتوقف بيقول اللي فيها
المشكلة انسيها خذ الاشي اللي مافيش فيه مشكلة الـ
beta هذه طبعًا بترمز لإيش؟ زائد، ضرب، قسمة، term،
إيش ما تكون تكون خديها زي ما هي وضربيها في non
terminal الجديد اسمه إيش؟ اسمه R طب ال R كيف
بنحسبه؟ قال تعال أوريكي كيف بنحسب ال R الآن قال
الآن ارجع إلى اللي سبتيه خبي اللي فيه مشكلة، إيش
ضال؟ القصص اللي وراها اللي هي Alpha اضربيها كمان
مرة في إيش؟ في R و أضع إضافة إبسيلون قال لك شايفة
هذا اللي أنت عملتيه؟ هذا Grammar ثاني شكلاً يختلف
لكن مضمونه نفس اللي قبل الآن هثبتها ما تستعجليش بس
بدي أفهمك كيف نشتغل على القانون القانون simple ها
و أديكي مثال كيف نطبق القانون يعني اتبروا يا بنات
ال X بتعطيني X زائد ضرب افتحي قوس أو ال X بتعطيني
X ناقص ضرب سكري قوس وال X بتعطيني مثلًا افتحي سكري
قوس وال X بتعطيني مثلًا درب زائد ناقص شايفة أنا
فرضت أربعة productions من عندي X ممكن تكون كده أو
تكون كده أو تكون كده أو تكون كده خلاص اللي أنا
وجدته تطلعي على اللي أنا كاتبه هتقولي لي في left
recursion صح هتقوليلي هذه وهذه بيبدو بنفس ال X
ففي مشكلة تعالي أوريكي كيف هنشيل ال left recursion
على القانون اللي قبل شوية أنا اتكلمت عنه وركزي
معاه هنمسك أول شيء ال X طيب تسهل هنطلع على مين؟ على
ال productionات اللي مافيهم مشاكل اللي هي ال beta
في حالتنا هنمسك الأولاني عبارة عن إيش؟ افتح هيك و
ساكر هيك صح؟ واضربها في مين؟ في R خلصت من ال إيش
الأولانية أو لأن في production ثاني مافيه مشاكل إيش
ال beta تبعته؟ درب زائد نقص واضربها في مين؟ في R ولو
كان في ثالثة ورابعة وخامسة كنت كملت خلاص هذا أول شيء
أني أجيبكي في ال X الآن بنا نحسب ال R كيف أحسب ال
R؟ برجع لل أولى اللي فيها المشكلة بخبي مين؟ إيش
ضال؟ زائد ضرب افتح قوس فضربها في مين؟ في R مش هيك
القانون بيقولي اضرب اللي باقي في R في كمان واحدة
بعمل or خب ال X إيش ضال؟ ناقص ضرب ساكر القوس في
مين؟ في R والقانون مش بيقولي في الآخر ضيف، خلصه،
ضيف إبسيلون هيك القانون، شايف هذا اللي أنا عملته هنا،
إيش هذا؟ هذا إعادة صياغة، إعادة شكل ال grammar
بشكل ثاني، لكن هنا مافيش إيش؟ مافيش left recursion
شوفت كيف نشيل left recursion؟ باختصار، فقانون
simple أمسك اللي مافيه مشكلة ال beta واضربها في R
كل beta اضربها في R كل beta اضربها في R بعدين ارجع
ارجع عشان تحسب ال R لأن كان فيها مشكلة خب ال X و
خذ الباقي واضربيه في R خب ال X وخذ الباقي واضربيه
في R وضيفي في الآخر من القانون إيش بقولك؟ Epsilon
إبسيلون، هاي القانون باختصار الآن بس بضل أتأكد من
حاجة واحدة عشان يصير الكلام سليم بتأكد من حاجة
واحدة هل هذه هي equivalent لهذه؟ ماشي فهمنا منك أن
شكلها تغير وفهمنا منك أنه بطل في left recursion
وفهمنا منك أنها جاهزة للـ predictive parser لكن
السؤال الآن مضمون هذه ومضمون هذه واحد هذه بدأ
نثبتها الآن بدأ نثبت الكويهنوم واحد تمام تعالوا
نثبتها عشان نثبتها لو سألتك شو ال language اللي
بتطلع من هنا هتقوليلي هذه ال a ك start symbol ممكن
تستبدليها بإيش؟ ب beta مش هذا حل أو تستبدليها a
alpha مش هيك؟ أو تستبدليها a alpha لغاية ما تزهجيش
هتحط ال a في الآخر beta فلو سألتك شو ال language
اللي بتطلع منها هتقوليلي
بيتا بتباعها zero or more ألفاس يعني ممكن بيتا
لحال بيتا و ألفة واحدة بيتا و ألفة ألفة بيتا و
ألفة ألفة ألفة جد ما بدك ليش؟ لأنه باختصار أنت ال
a ممكن تعمليها بيتا أو ممكن ال a تعمليها ألفة
فهي عندك ألفة لكن البطل بتواقف فيها بيتا بدك كمان
ألفة ألفة ألفة ألفة جد ما بدك فإذا ال language
اللي بتطلع من ال grammar اللي فوق شو هو؟ شو هي؟
بيتا وراها ولا واحدة أو ألف أو اتنين أو whatever
مش هيك؟ طب تعالى نشوف ال language بتاعتها هى هى هى
هى هى هى هى هى هى هى هى
هى هى هى هى هى هى هى هى هى هى هى هى هى هى هى هى هى
هى هى هى هى هى هى هى هى هى هى هى هى هى هى مش على
كام أنت تستبدلي ال R هذه ممكن تعمليها إذا بدك
إيبسلون إيش ضال؟ بيتا بس أنا بديش أنهيها بدي إيش
أسوي Alpha R قانون مش عارف كيفي و ال R Alpha R
نهما تزهجيش في آخر ال R إيبسلون إيش صارت معاكي؟
بيتا ورقة و أبسلون قد ما بدك عاد بيتالحالة او beta
alpha او beta alpha alpha او alpha alpha او جد
ما بدك إذا الواضح شو ان ال language اللي بتطلع من
هاي و ال language اللي بتطلع من هاي هم واحد لكن صح
الشكل اختلف لكن المضمون واحد طب أنا ليش استفدت من
القصة هاي أنا استفدت اني هيأت ال grammar ل
predictive parser هنا أنا ما كنتش قادر اعمل
predictive parser ليه؟ ولا بعمل ال descent parser
حتى بال backtrack English لأنه في infinite loop
انها تسيرلكن لما أغيرت شكله هتقوللي simple خالص
صارت لو بدي أعمل predictable parser هتقوللي بعمل
function اسمها A و function اسمها R و function
اسمها match و جوا ال A ببدأ أشتغل على ال beta إذا
ال beta terminal خلاص match و بستدعي ال R إذا non
terminal بستدعي ال non terminal و بمشي يعني صار
سهل أن تعملي predictable parser بدون مشاكل هناخد
مثال الآن، تقلقوش، بس الأول الفكرة وضحكت كيف أن
ال left recursion كان يمثل مشكلة وكيف أنه أنا حليت
المشكلة بالقانون والحلو هنا في الموضوع أن أنت مش
محتاج تفكري كيف أعيد صياغة ال grammar ولا تفكري
ولا غيره، بس القانون كيف بيشتغل خدي كده أضربيها في
R، اللي فيه مشكلة أخبيه خد الباقي أضربيها في R
واضيفي إبسلون ويعطيك العافية كأنت كتبت grammar تاني،
مش فيه مشكلة، شايفة؟ إشي أنت systematic، مباشر
واضحت لحدها في أي مشاكل؟ في أي أسئلة؟ طيب خلونا
الآن يا بنات نكمل .. خلونا نكمل لو سمحتم .. هدو يا
بنات .. هدو .. خلونا نكمل طبعا section .. section
اتنين خمسة section مهم كتير خصوصا انه بيتكلم على
ال homework اللي كنتوا تسويه في نهاية ال chapter مش
طلبنا فيه homework المفروض في نهاية ال chapter
تعملوه مشروع صغير بنسميه أساسه في section 2.5
وبعدين كتير بنسأل احنا في امتحانات في مواضيع
section 2.5 ويعتبر 2.5 أيضا مراجعة لكل اللي قلناه
قبل شوية عشان إيه ضروري تنتبهي و تركزي معايا فيه
عشان تفهميه كويس إيش بقول في 2.5؟ a translator for
simple expressions معناها ان أنت بتعمليه لان
translator إيش بيعمل هذا ال translator اللي أنت
بتسويه بتبرمجيه بيحول من infix ل postfix واضح؟
المطلوب اعملي برنامجبحول من infix ل postfix طبعا
أتوقع لو أنت مش ماخد مساقة ال compiler هتتعب و أنت
تعمل في برنامج زي هيك مش أنه مش فاهم هتعمليه
هتعمليه لكن ممكن ما يكونش official يعني أنت مضطر
تفكر كتير و تفقل ساعة كتير و مش عارف إيش و كيف
تحاوليه يعني مش أنه ما تعرفيش هتعمليه بس هياخد منك
مجهود و جد و تعب لكن اليوم لأني بعرف شوية في ال
compiler و بعرف شوية في ال grammar هلاجي أن هذا
code بتطلع تحصيل حاصل، بدون تفكير كتير، ليش؟ الآن
مش احنا المرة اللي فاتت عملنا translator بيحول من
infix ل postfix باستخدام ال grammar، صح؟ ال
grammar، قبل اللي شفناه وضفتي عليه action print
اللي كان جوا ال grammar مش عملتي print زائد و
print لاقص و عملتي grammar زي هيك اتعلمنا المحاضرة
اللي فاتت أي grammar كيف تعمليله بارسينج صح ولا بس
implementation فأكيد لو أنت هذا ال translator
عملتيه على شكل grammar وحطيتي فيه ال actions جواته
واتبعتي نفس الإرشادات وعملتي بارسار automatic اللي
أنت عاملاه هذا ال translator شايفة بدون تفكير كتير
فهنا بتلاحظي كده شالعلم اللي أنت بتاخديه الآن صار ي
feedك في برمجيات أخرى ممكن تعملها مستقبلا يعني أنا
بعد اليوم لو حد قال لي عمللي translator زي هيك
تمام؟ ما بديش أفكر بالطرق البرمجية التقليدية كيف
أفعل و F و مش F و أتعب بحالي و زجاج كذا و مجاز كذا
و two لأ ما خلاص إيش systematic طب ما أعمل ال
grammar ال grammar يوصف ال language اللي بدأ تتحول
و يعمل التحويل جوا ل grammar إذا نجحت في وضع هذا
ال grammar خلصت لأن طريقة برمجته الآن Automatic and
straightforward مش فيها مشاكل مش بس هيك أنت كمان
ممكن ما تعملش البرنامج و تستخدم ال tool جاهز لل
parsing بس اديله التعريف ل grammar بال action
واستخدم ال tool لحاله هيحوله يشتغل اللي بدك إياه شوفت
كيف هذا ممكن إيش يفيدك و رايحك الآن نرجع لسؤالنا
هنا لما أقول لك اعمللي translator إيش الخطوة الأولى
اللي بدك تفكر فيها اني بدي أعمل ل grammar و أحط
جواه ال actions اللي بتعمل عملتي التحويل هذه
الخطوة الأولى جاهزة للبرنامج زي ما عملنا المرة
اللي فاتت طبعا إيش بيصير لو أنت عملت ل grammar
بدون ال actions اللي بيصير بس ان هذا بيكون بتحقق
من ال syntax ولا لأ بس لكن لما بتطعميه أنت بال
actions و تضيف عليه جوا ال actions بيصير ممكن يحول
لشغل تاني زي ما احنا مشهور المرة اللي فاتت شوفنا لو
حطينا print زاد و print الرقم مش عارفاش صار يحول
من وين من infix ل postfix فعشان هيك احنا الخطوة
الآن simple خالص أنا بس اجيب ال grammar و احط
جواته ال action بتحول من infix ل postfix وبعدين
ابرمجه في الطريقة اللي اتعلمت من شوية لكل non
terminal functionو ال match و كل انتشر برمجته سهلة
if else فمخلص الموضوع إذا الخطوة الأولى أيش بناها
grammar بيحول في ال actions هل أخدتو ال grammar
هذا أخدناه المرة اللي فاتت هي exception
عبارة عن exception زائد term print زائد أخدناه
المرة اللي فاتت أو exception minus term print
minus أو term و ال term 012 وكل مرة أطبعه طبعا
لاحظوا انه كل مرة بيجيبلي المثال هذا يعلمني فكرة
جديدة لكن بيجيبه مش كامل زاد وناقص لأنه هذا مش
معنى بال operators جد ما هو معنى بالفكرة لكن أكيد
اللي بتفهم على الزائد والناقص سهل عليها تعميم
للضرب القسمة لأن كل قصتنا في الضرب القسمة ان ال
term بتصير term في factor أو term على factor أو
factor و ال factor expression بين جثين أو number و
ال number و بنخلص فعشانك مابتلاقيهوش بعيد كل مرة
الضرب القسمة خلاص اشرحها زمان و خلاص و صار بس الآن
يجيب الزائد والناقص عشان يشرحلك الفكرة تبعتك طيب
إذا الآن شو هذا اللوح اللي موجود على اللوح هذا
grammar جاهز بيحول من infix ل postfix في اختصار
طيب
الآن إيش بدنا نعمل؟ هتقولي لي خلاص بدنا نعمل
predictive parser لهذا لأنه إذا عملنا predictive
parser النتيجة ال output اللي هتطلع لل actions
الطباعة شهما ال postfix اللي هو طالب مش هيك جربناه
المرة اللي فاتت و لقينا باطبع ال postfix طبعا
السؤال وين يطبع؟ هذه راجعالك في البرمجة بدك تطبع
على ملف، بدك تطبع على ال console، بدك تطبع على
الشاشة، أنت حر من هنا تتحكمي وين تطبعي المهم الفكرة
انه اللي هينطبع بهذا الشكل هو ال postfix لمين
لل infix طيب الآن قلنا لك اشتغلي يلا ابدأ اعمل
predictive parser هنا هتلاقي فيه مشكلة عندك ال left
recursion موجود، ليش؟ لأن هاي ال expression ..
expression .. هاي ال expression .. expression ..
وبرضه لو كملت term .. term .. term في factor ..
term على factor .. إذا واضح إنه لسه ال grammar
اللي أنا عملته مش جاهز لعملية predictive parser
إذا في خطوة أولى لازم نعملها، شو هي؟ إني أتخلص من
ال left recursion كيف هتخلص؟ على القانون، بدي
أستخدم القانون اللي قبل شوية و أغير الشكل هذا ال
grammar إلى إيش؟ إلى شكل آخر، نفس المضمون، لكن
الشكل الجديد ما يكونش فيه إيش؟ ما يكونش فيه electric
charge، نظوط ولا ده؟ طب كيف بنا نشتغل و نعملها؟
هيقول لي ببساطة ال expression هاي هسيب اللي فيهم
مشاكل صح؟ و هقول حبدا في مين؟ في term و هضربها في
R صح ولا لأ؟ الآن عشان أعرف ال R كيف بدي أعرف ال
R؟ حاجة أقول ال R عبارة عن بخبي هذه زائد term و ال
print زي ما هي هذا action هذا جزء من ال grammar
كله بضربه في مين؟ في R أو minus term ال print في
مين؟ في R خلصنا أو إيش بضيف؟
السؤال الثاني، لو كانت هذه term في factor، نفس
الفكرة، بس انتبهوا أن الـR اللي بدأ تطلع للterm مش
نفس الـR اللي فوق، فممنوع تعملي نفس الـR هذا
production حلتيه، عملتيله non-term للجديد، سميتيه
R هذا كمان فيه مشكلة بدي أحله يبقى لازم أعمل non
-terminal جديد سميه Y سميه R1 سميه R2 المهم الفكرة
بتكون فاهمة أنه كل non-terminal جديد ما يكون نفسه
اللي فوق هذا خلاص خاص بال production وهذا هو حل
المشكلة فصار جزء منه وبالتالي لو لاجئت مشكلة ال
lifter kergin كمان مرة وبدحلة كمان مرة بتستخدمي
اسم مختلف مش نفس الاسم اللي فوق عشان ما يبينوش أنهم
نفس ال non terminal هذا إشي وهذا إشي فأنت حرة في
المسميات اللي بتختاريها okay طيب الآن تعالي نشيل
ال lifter kergin من هاي جالي بعد ما شيلنا ال
lifter kergin هذي برجعلها كمان عشان ما فيش فيه إشي
دكتور شوية و أنا في الفارق أنا مش شايف أن أنا في
الفارق أهلا و سهلا إذا مش شايفة هذه مشكلة عويصة إذا
مش شايفة طب أنتو جاوبوها في الأول بعدين أنا بجاوب
.. بجاوبك جاوبوها طب قولوا أنتو واجهولها الاشي
فاهموها هي و أنا بجاوبها بعدين اه اتخافيش اسمع
منهم ما فيش فيش خلاص
والله .. والله أقول اختناعتي ولا لسه؟ ما تخافيش؟ لأ،
لأ، ففي
الآخر لازم أنا كده كده، ماشي اختار ال term، بعد ال
term، every other else if، بتفوت عليه هاي، بتصير
نفس الفكرة
احنا قلنا قبل هيك أي اسم قبل السهم بيبدأ بنفسه
بعد السهم صار فيه left recursion هذه معلومة خديها
من الآن و طالع، تمام؟ الآن أنا لو بدي أعمل زمان تي
بتقولي if .. if .. if .. مثلا if digit خد term مش
فيه else بيعدي hand مش بتصير expression بتعدى على
ال expression هاي فبتصير في ال .. يرجع ل left
recursion تاني يعني في الآخر هيوصل لمرحلة اسمها
left recursion طالما نفس الفداية بيصير في left
recursion okay؟ طيب الآن إيش هنسوي؟ قلنا حلنا ال
left recursion وكيف حلنا ال left recursion؟ هاي
يرجع يذكرك بالقانون القانون in general الآن إيش
بيقول لك؟ بيقول لك كيف هنشيل؟ هتقولي تاخدي ال gamma
هاي و ضربيها في إيش؟ في R و بعدين عشان تجيبي تعريف ال
R بتخبي ال A Alpha في R فيه كمان إيه أو beta في R
خلصناهم بنضيف epsilon فهذا القانون العام طبعا عارف
لو كان فيه كمان حاجة غير ال Gamma Gamma one مثلا
كان هيعمل or Gamma one في R نفس الفكرة يعني دائما
بياخد الأشياء اللي ما فيهاش مشكلة في R في R في R
بعدين بياخد الأشياء اللي فيها مشكلة بيخبى ال non
term و بياخد الباقي في R بس بضيف تحت إيش؟ epsilon،
فما تسهلش القانون، قانون simple وتوا أثبتناها قبل
شوية طيب، الآن تعالى نشوف الحل إذا هنا إيش
عمل هنا؟ شايفة؟ expression؟ أخد اللي ما فيش فيها
مشكلة؟ طبعا ما سماش R هنا، سمها rest أنت حرة في
التسميال rest عبارة عن إيش؟ الرجل اللي فيها
المشكلة خبأ ال expression إيش ضال؟ زائد tail ل
brain و ضربها في rest اللي تحتها كانت minus tail
brain و ضربها في rest و أخيرا ضاف ال epsilon و هذه
ما فيش فيها مشاكل و قلنا لو كان هذه فيها مشاكل كان
هيعمل نفس الفكرة و يضيف اسم غير ال rest باختصار
الآن ال grammar هذا ماله يا بنات الموجود هنا هذا
grammar شكلا جديد لكن مضمونا هو نفسه اللي قبل
شوية طب الدليل تعالى نجرب نعمل زي ما هو عامل تسعة
ناقص خمسة زائد أو ناقص خمسة زائد مية كيف نعملها
بارسينج هيك؟ طبعا المفروض إنه إيش يطبع لما نعمل ال
tree؟ إيش يطبع المفروض؟ ال boss fixed نظره ل .. بس
اعمل إيه اللي هتعالي ال tree؟ كيف هتعمل ال tree؟
إيش هتقول لي؟ هتقول لي أول إيش يبدأ نبدأ غصب عني
من وين؟ exception إيش هتستبدليها؟ ما فيش غير term
أو rest صح؟ ال term هذا عبارة عن إيش؟ تسعة وفي
action أطبع تسعة طب ال rest هاي إيش يتسبب فيها عشان
طريقة ناقص خمس زائد اتنين ناقص تاني هتقولي ناقص
تاني لأنه اتغير الشكل الآن مش زي قبل شوية ناقص
تاني ناقص تاني ناقص تاني ناقص تاني ناقص تاني ناقص
تاني
ناالتر ال print minus rest ماشي
rest بعدين ال rest هذي إيش؟ اللي حصل هي ال epsilon
إبسلو مش عشان تنتيج الآن ال term هذي إيش؟ اتنين
اتنين و طبع اتنين إذا إيش طبع؟ تسعة خمسة ناقص ..
هذه طبعا زائد .. ناقص اتنين زائد إذا إيش طبع؟ طبع
ال voice fixed .. باختصار يعني هو هذا نفس المضمون
بتاع السابق لكن شكلا تغير طيب .. بدي أسأل سؤال هيك
بسيط لو أنا عملت الطباعة قبل الرقم هل هيتغير إشي؟
والله ما فيش مشاكل، يعني لو أنا طبعت هنا، هنا، هنا،
هيتغير ال postfix؟ سؤالي واضح، هل هيصير تغير لو
أنا عملت الطباعة قبل؟ أنا ما غيرتش الإشارة، أنا
غيرت الرقم، طبعت الرقم قبل، مش هتفرق، هيتبع هي
التسعة؟ خمسة ناقص اتنين زادت لو طبعنا .. طبعا لو
غيرت هذه مكانها بتفرق لكن إن الرقم أطبعه قبل ولا
بعد مش هتفرق طبعا ليش أنا بقول هذا الكلام؟ هذه
المعلومة كمان شوية هتلزم لي ليش؟ الآن ركزي معايا
شوية أنت ال term هاي كيف بتعمليها كودها؟ مش أنت
هتقول if look ahead 0 match 0 print 0 if look
ahead 1 match 1 print 1 else if else if else if مش
هيك هنشتغل و كنا؟ هو إيش بيقول لي؟ بيقول طب ما ده
اللعب على عشر مرات؟ مش فيه function لو أنا قلت له
if look ahead is digit match digit print digit صح؟
بس إيش المشكلة في اللحظة هذه لو قلت له match digit
و print digit المشكلة لما عملت ال match digit راحت
عشان ال match بيخليها look ahead تمشي عشان هيك
قدامي حالين يا قبل ما أعمل ال match بعمل temp و
بخزن فيه look ahead و بعدين بقوله ال match بعدين
أطبع ال temp يا أطبع قبل ما أعمل ال match وقلنا
هنا في الحالة هذه الطباعة قبل مش هتفرق بس عشان
تكوني فاهمة القصة هذه واضحة الفكرة كمان شوية في
البرنامج هلاقي أنه بدل يعمل عشر مرات إيش بيقول if
look ahead is digit, print it digit match digit,
print it digit فال match إيش مشكلتها؟ بتطير ال
look ahead فكيب أيوة فبتروح الرقم فقال لك يا تحفظيه
بعدين match بعدين تطبعي اللي حفظتيه طب ما ديج احفظ
قال أطبعيها قبل ما تعملي ال match و مش هتفرق فتوا
أثبتنا إن لو احنا طبعنا طبعنا قبل بعدين عملنا
الماشي مش هتفرق هذه هنشوفها كمان شوية من ناحية
البرمجية طيب .. طيب تعالوا الآن نشوف ال code طبعا
يا بنات كيف نعمل ال code؟ هايل كيف نعمل ال code؟
الآن هذا ال grammar ماله اللي على اللوح؟ ماله؟ مش
هذا جاهز لل predictive parse صار؟ كيف نعمل ال
predictive parser لإن؟ هتقول لي بدي function اسمها
expression و بدي function اسمها rest و بدي
function اسمها term هيك باختصار و هتقول لي ال
function expression جواتها أستدعي term أستدعي rest
و هتقول لي ال function rest if look ahead plus
match plus أستدعي term print somewhere plus أستدعي
rest else if match minus match minus study a term
print minus study a rest else ما فيش إشي الآن كيف
نعمل function term if lookahead is digit خلاص
بقول له print match يا بحفظها في ال temp بعدين match
بعدين print أنت حرة أحسن من ما تعملي عشر مرات لو
عملتي عشر مرات مش غلط يعني لو جيت تقولي if
lookahead is zero match 0 print 0 else if match 1
print 1 else if .. else if .. else if .. else if
.. else if .. else if .. else if .. else if ..
else if .. else if .. else if .. else if .. else
if .. else if .. else if .. else if .. else if ..
else if .. else if .. else if .. else if .. else
if .. else if .. else if .. else if .. else if ..
if .. else if .. else if .. else if ..
else if ..
بعدين ال rest if lookahead زائد match زائد term
print rest else if match minus term print rest
else ماعملش إشي لأنه فيه إبسلون تاعة ال term
سهلة جدا إيش قال لي if lookahead is a digit طلعش
سوى حفظ ال lookahead في temp بعدين عمل match راح
بعدين طبع ال temp بس أنا بقول لو هو طبع ال look
ahead قبل وعمل ال match برضه صح لإنه مش هيفرق
الطباعة قبل الرقم و بعد الرقم بس لو عمل هذا الكلام
لأنه هيعملها قدام في برنامج الجابع طيب else ليش
جاء ال error لإن مافيش فيها epsilon لو كان فيها
epsilon ال term كانش هيسوي ايوا طيب ومين بقى علينا
ال function الأخيرة؟ ماتش و بطل يكتبها لأنه خلاص
ماتش معروفة نبقى نقارن الاتنين مع بعض إذا سوا بعض
بيمشي إذا لأ بيمشيش طيب أنا لسه ما خلصت الضغط
لدقيقتين الآن ال code انكتب و خلص خلاص هي البرنامج
الآن إيش بدنا نسوي في هذا البرنامج في الدقائق
المتبقية معلش بدنا نحاول نحسنه من ناحية برمجية فيه
شوية skills للبرمجة بدنا نحاول نطبقها هان طبعا أنا
مش طالبها للامتحان يعني لو انت وعملتي زي هيك
ووقفتي وماكملتيش زي ما هو بيعمل that's fine for me
okay لكن مش غلط انه نفهم ايش التحسينات على ال
performance اللي عملها هان وراجزي الآن اول ملاحظة
انه ال recursion اللي هان مش هي بالصدق نفسه بس في
الآخر صح؟ لما بيستدعي نفسه في الآخر هذا بيسميها
إيش يا بنات؟ بيسميها tail recursion إيش بيسميها؟
tail recursion يعني زي في الذيل اللي قعدت
الاستدعاء tail شايفة؟ في الآخر يعني بعد ما يخلص
لازم يرجع من وين؟ من جديد شايفة؟ إذا كان زائد ولا
ناقص افهمي إنه هيرجع تاني بس في الآخر قال طب هذا
..كيف ممكن نزيد ال performance ل code زي هيك؟ ايش
رأيكم لو بدل ما استدعي هاي و بدل ما استدعي هاي
عملت loop ارجعت تاني؟ يعني مابديش استدعي function
مش هي ..مش ..مش ..مش ..مش ..مش ..مش ..مش ..مش ..مش
..مش ..مش ..مش ..مش ..مش ..مش ..مش ..مش ..مش ..مش
..مش ..مش
..مش
ليش؟ ليش؟ الآن لما أنا أستدعي rest أستدعي function
ال control بدي ينتقل من مكانه لمكان آخر حتى لو بدي
يكون نفس ال function و ال program counter بدي
يتسجل إيش هو و بدي يروح ينفذ و بعد ما يخلص بدي
يرجع jump تاني للمكان اللي كان فيه فهذا بياخد وقت
استدعى ال function شوفتي كيف؟ لكن ال loop بتكون
أسرع ليش؟ لأنه لا بطلع ولا بنزل ولا بخزن بي see
ولا برجع على جنب ولا بستهلك resources، بيضل إيش
ماله؟ بيلف في مكانه، فواضح دائما و أبدا أن ال loop
مالها أسرع بكثير من مين؟ من ال function، فإذا أنا
بقدر أستغل عن ال function و أعملها في ال loop،
هعملها، وهذه ال case موجودة دائما في ال tail
recursion جالك لما يكون الاستدعاء في الآخر لنفس
الأشي قال لما تعمل loop و تخلص و تريح راسك تعالي
نشوفها كيف صارت بعد ال loop شوفي كيف صارت بعد ال
loop ال rest طلعي معايا ايش بيقول هنا الان ايش
بيقول بيقول انا بده left hand اذا ال loop هتزاد
طلعي match زاد study term print زمان كان study
rest الان خلاص ارجع تاني على ال loop بدل استدعيها
طب else minusماتش، ماينوس، تيرمي، print، ارجع تاني
وين؟ على ال loop زمان كانش يقول استدعيها ك rest
أما الآن صارش يقول يستدعيها ك loop طيب لا هي زائد
ولا هي ناقص ماكناش نستدعي ال rest، إيش سوى؟ أطلع
من ال loop فهي نفس ال effect بتاع هديك لكن هان
مستدعيش functional يستدعيش function إذا هذا ال
code ماله أسرع بكثير من هداك شوفتي كيف حولوه؟ وقال
لك كل Terrier carriage بتقدر تحوليه وانا قلتك مش
مطلوب منك للامتحان لكن كويس إليك skills في البرمجة
تعرفيها أنا هداك ال code بيكثني ك compiler طيب
ملاحظة تانية أخيرة عملها .. معلش أخيرة بعملها إيش
بيقول؟ وقولولي صح ولا غلط كلامه؟ أكيد صح؟ طيب
تعالوا نشوف إيش بيقول؟ بيقول مش هذه خلاص اتغيرت و
هذه اتغيرت؟ بيقول بدنا ناخد هذا ال rest كله و نشطب
هاي و ننسخه هنا يعني خلاص تصير ال expression تير و
وراها السطور هذول مباشرة فهل الحركة اللي عملها هاي
مظبوطة؟ يعني قال ليش أستدعي rest؟ أنا خلاص على طول
أحطها هنا طب هل بيظبط أن ال term ليش أستدعي ال
term؟ أشيل ال term و أحطه فوق؟ ليش هذه بتصبط و هذه
ما تصبط؟ عشان نختم .. اه .. ليش؟ انا بدأ رايحك
عشان نختصر الوقت إذا ال function أو ال code أو
السطور بدي أستخدمهم أكثر من مرة الأصل اللي عملهم
function أوفر على حالي إذا بدى أستخدمهم مرة واحدة
غلط أعملهم في الـ function ليش أروحيهم و أجيبهم و
أنا بدي أعملهم مرة واحدة لو جيت تركزي على rest ولا
حد بستدعي ال rest هو صح كانوا يستدعوهم لكن بطلنا
عملنا code loop فلما هذي اختفت و هذي اختفت اتطلعي
في الكودك ولا حد بستدعي ال rest عشان هي كمرة واحدة
موجودة فأنا قلت ليش أعملها function ماشيلها و
أحطها نفسها لكن تعالي تطلعي على term تير .. تير ..
تير .. تير .. تير .. تير .. تير .. تير .. تير ..
تير
.. تير .. تير متى أنا هاروح له إذا هو بعيد إذا كان
فيه أكتر من مرة تستخدمه فبيصير أحطه و بيصير الكل
يروح له لكن الآن بعد التحويل و التعديل بطل حد
يستخدم rest عشان هي إيه كانش سويت أخدته واستبدلته
هنا و خليه term لأن ال term يستخدم أكتر من مرة هي
باختصار فعمل optimization لل code السابق الآن أنا
هوقف هنا لكن انتبهوا المرة الجاية ابـتجونى دارسينى
الكلام اللى قلته اليوم كويس جدا جدا ليش؟ لأن المرة
الجاية بدنا نعمله نفس ال code على Java فبداش
تتعبونى خلاص تعالوا فاهمين اللى قلناه عشان نشوف
كيف هيتحول ل Java و ندخل على الدرس الجديد ماشي
الحالة يا بنات يعطيكم العافية