أنا الرحيم اليوم إن شاء الله بدنا نكمل اللي أخدناه
المحاضرة السابقة المرة اللي فاتت أخدنا حاجة رئيسية
اسمها 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 expressionelse لاعملش error لأن هنا فيه
إيبسلوت و الماتش سهل جدا الماتش مجرد مقارنة بين
الاشي اللي أنا ببعته اللي المفروض يكون مكتوب مع
اللي كاتبه ال user ال lookahead أو المبرمج إذا شبه
بعض مافيش مشاكل من الماتش بمشي ال lookahead خطوة و
برجع ال code من مطرح ما أجا استدعاء الماتش باختصار
يعني الموضوع ماكانش فيه أي مشاكل الآن بس قبل ما
أعمل 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 optionalmatch وجوه
ال 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 صح ولا لأ لكن هذا كان مخبأ البداية ماكنتش
واضحاني هنا واضح ان كلهم يبدو بتerminal فكان ظاهر
للعيان بداياتال 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ومشكلة ال lift
recursion وطبعا مشكلة ال lift recursion ليس فقط لـ
predictive process لأي حاجة ريكيرجن يعني ما يمكننا
أن نقول إن هناك 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 parcel
أعمل حاجة تانية وبرنامج تاني تمام و جادر أني لأ
أظبطه شكلا و أشيل ال left recursion و أشيل الفيديو
المكرر و أعمل predictive parcel مين تتوقع الأفضل و
الأسرع؟أزبطه وأعمل ال 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 تعمليها 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، بدك تطبع على
الشاشة، انت حر من هنا تتحكمي وين تطبعيالمهم الفكرة
أنه اللي هينطبع بهذا الشكل هو ال boss fixed لمين
لل 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 بس بضيف تحت ايشأبسلون،
فما تسهلش القانون، قانون 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 digitmatch 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 bar صار؟كيف نعمل ال
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 ifmatch 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 zeromatch 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 ولا
حد بستد a rest هو صح كانوا يستدعوهم لكن بطلنا
أعملنا code loop فلما هذي اختفت و هذي اختفت اتطلعي
في الكودك ولا حد بستد a rest عشان هي كمرة واحدة
موجودة فأنا قلت ليش أعملها function ماشيلها و
أحطها نفسها لكن تعالي تطلعي على termتير .. تير ..
تير .. تير .. تير .. تير .. تير .. تير .. تير ..
تير
.. تير .. تيرمتى انا هاروحله اذا هو بعيد اذا كان
فيه اكتر من مرة تستخدمه فبصير احطه و بصير الكل
يروحله لكن الان بعد التحويل و التعديل بطل حد
يستخدم rest عشان هي ايه كانش سويت اخدته واستبدلته
هنا و خليه term لان ال term يستخدم اكتر من مرة هي
باختصار فعمل optimization لل code السابق الان انا
هوقف هنا لكن انتبهوا المرة الجايةابتجونى دارسينى
الكلام اللى قلته اليوم كويس جدا جدا ليش؟ لأن المرة
الجابة بدنا نعمله نفس ال code على Java فبداش
تتعبونى خلاص تعالوا فاهمين اللى قلناه عشان نشوف
كيف هيتحول ل Java و ندخل على الدرس الجديد ماشي
الحالة يا بنات يعطيكم العافية