بسم الله الرحمن الرحيم اليوم إن شاء الله بدنا
نستكمل ونخلص آخر section مطلوب منها في أربعة اللي
هو أربعة أربعة إن شاء الله يمكن احنا ختمنا
المحاضرة السابقة بجزء اسمها LL one grammar ولا مش
LL one grammar وقولنا هذا كثير درس مهم وكثير في
أسئلة بتيجي عليه ضروري تقدر أي grammar تأخذيه تقدر
تحكمي عليه الـ LL one ولا لأ قولنا ممكن تحكمي عليه
بسرعة قبل القوانين اللي اخذناها على أساس لو شفتي
left recursion لو شفتي بداية متكررة واضحة لو شفتي
أنه ambiguous شجرتين لنفس الـ tree على طول تقدر
تقولي مش الـ LL one لكن أنت بتخافي تطلعي على الـ
grammar تلاقي لا هو مبين فيه left recursion ولا هو
مبين فيه بداية مكررة ولا هو مبين ambiguous ساعتها
أنت مضطرة تلجأي إلى القوانين الثلاث اللي تعلمناهم
المرة اللي فاتت أن الـ epsilon ما يطلعش مرتين أو
أكثر من مرة من الـ productions بتاعة الـ non
terminal نفسه أنه ما يطلعش نفس البداية مرتين أو
أكثر وإن في حال الـ non-terminal جواته إبسلون
ما يتقاطعش الـ first و الـ follow وليش قلنا ما يتقاطعش
الـ first و الـ follow في حال هذا الـ non-terminal
يكون إبسلون لأنه لما يكون الـ look-ahead واقف على
جوس مثلا والـ الجوس هذا ممكن يكون في البدايات تاعت
هذا الـ non-terminal وممكن يكون في الـ follow فبيصير
محتار مش عارف هذا الـ الجوس هو بداية ولازم أستبدل هذا
الـ non-terminal بالإيش اللي بطال البداية والله هو
هذا الـ ghost من اللي بيجي ورايا ولازم أستبدل هذا
الـ non terminal بالـ epsilon فبيصير هنا تحيير فهذا
الشرط الثالث اللي بيخليك تقولي إنها مش الـ LL one بس
هاي الثلاث شروط اللي موجودين ومش صعبين كانوا
تمام؟ وزي ما شفتي بيعتمدوا كانوا شكل كبير على الـ
first و الـ follow أنه لازم في كل أحوال أحسب الـ
first للـ non terminal عشان أقدر أعرف والله طلع نفس
الـ non terminal .. نفس الـ terminal مرتين ولا لأ
كيف بيجيك تعرفي؟ بيجيك تحسبي first و first و first
وتشوفي؟ إذا طلع الـ ghost مرتين من نفس الـ
production أو productionين لنفس الـ non-terminal
معناها LL one مش الـ LL one فابدك تنتبهي وزي ما قلنا
بتحسب الـ first تاعت ممكن تضطر تحسب الـ follow كمان
زي لما كانت بطلع الـ epsilon ممنوع يتقطع الـ first
مع الـ follow وكيف نحسب الـ first وكيف نحسب الـ
follow برضه خلصنا المحاضرة السابقة ولا جيناها مش
صعبة كثير لكن أكيد بده شوية تركيز خصوصا لما بكون
الـ first مخبى يعني عندك non-terminal .. non
-terminal .. non-terminal وبعضهم إبسلون وبعضهم
بدون إبسلون طب خلص من الأول وممكن يستبدل بفراغة
بدي أكمل في التاني يعني بدها شوية معلومات ضروري ما
تنسيها نهائيا عشان تقدر تحلي صح وهذا كله احنا
تكلمنا عنه باستفادة المحاضرة السابقة اليوم قعدنا
نستكمل ونشوف كيف نعمل الـ parsing وقلنا قبل هيك أن
عشان أعمل الـ parsing في عندي طريقتين recursive و
non recursive الـ recursive سهل خلصناه اليوم بدأ
ناخد الـ non recursive وعشان أنا أقدر أخد الـ non
recursive ضروري أفهم الرسمة هذه في الأول هي الـ non
recursive هان زي ما تشايفين بتمدش على function
تستدعي نفسها كل المطلوب عشان أقدر أعمل عملية
parsing بدي يكون في عندي stack هذا الـ stack بنحط
جواته تفاصيل لـ grammar للـ productions تبعت الـ
grammar اللي بتوصف الـ language كيف بالظبط كمان
شوية بنشوف المهم أنه لازم يكون فيه ending stack
هذا أحد الطرفين الموجودين الطرف الثاني الموجود
اللي هي الـ sentence اللي أنا بدي أشوفها في الـ
language ولا مش في الـ language بطلع لها tree ولا
بطلع لهاش tree إذا هذه الـ sentence طلعت لها tree من
الـ grammar اللي موجود هنا معناها خلاص هي في الـ
language إذا ما طلعت لها tree معناها هي مش في الـ
language باختصار طيب كيف بدي اشتغل الاثنين هدول مع
بعض بدون recursion قال لازم حاجة تكون عارفاها في
الأول اسمها parsing table يعني لازم نعمل حاجة
اسمها parsing table ومن هذا الـ parsing table بقدر
أمشي بين هذا وبين هذا وبين هذا كيف بالظبط هنشوف
التفاصيل بتاعة هذا الـ algorithm بس في الأول بدنا
نشوف كيف نطلع الـ parsing table عبارة عن إيش الـ
parsing table قال الـ parsing table symbol خالص
عبارة عن جدول صندوق زي هيك تمام؟ بنحط فيه كروز كل
الـ non terminals اللي موجودة في الـ grammar اللي
أنا بتشتغل عليه يعني على سبيل المثال لو بدنا نشتغل
على الـ grammar بتاع الزائد والنقص وبضرب والقسمة
اللي اخذناه المرة اللي فاتت في بداية الـ section
اللي هو هنا
هذا الـ grammar يا بناتي لو بدنا نشتغل عليه تمام
كيف بدنا نعمله الـ parsing table عشان أقدر أشتغل
عشان أعمله الـ parsing table حكالي كل non-terminal
بدي يكون في raw الآن كم non-terminal عندي؟ حد
قولي لي ببساطة E ومش عندي كمان؟ non-terminals مين
فيه كمان في الـ non-terminals؟ E bar ومين فيه كمان؟
و T و ومين فيه كمان؟ و T bar ومين فيه؟ F هدول كل
إيش الـ non terminals اللي إيش اللي عندي هدول
هتعملهم كصفوف الآن بدنا نعمل كأعمدة كل الـ
terminals اللي موجودين عندي مين الـ terminals اللي
موجودين في الـ grammar؟ هتقولي لي في عندك الـ ID،
مظبوط؟ وإيش فيه كمان؟ هو عندك الزائد وعندك الضرب
وعندك الأقواس وإيش فيه كمان؟ في شيء ثاني؟ وعندك الـ
dollar sign المهم بالعربية بدك تحطي كأعمدة كل الـ
terminals الموجودين عندك وكصفوف كل الـ terminals
الموجودين عندك طيب عملنا هذا الكلام إلى أن كي
بنشتغل قال مش أنت حسبت الـ first المرة اللي فاتت لأن
هذا الجدول بيتشكل من الـ first و الـ follow اللي
حسبتهم يعني أنت ما بتقدر تعملي هذا الجدول إلا تكون
حسبتي زي ما عملنا المرة اللي فاتت الـ first للجميع
و الـ follow للجميع بعدين بتعملي إيش الـ table بعدين
بتعملي إيش الـ parsing سواء recursion أو non
recursion خلاص؟ طيب من باب التذكير لما حلينا المرة
اللي فاتت فهمنا المعادلة إيش الـ first E كانت يا
بنات؟ إيش الـ first E؟ ما بديش نعيد الحل، بدي على السريع
فتحة القوس والـ ID، مش هيك كانت؟ على السريع و
بدي first الـ E bar، مين هي؟ زائد وإبسلون، بكمل
بعدين، الآن رجعي لي لـ first الـ E فتحة القوس من أين
أتيت؟ من أي production؟ غلط أنت الـ E .. أنا بحكي
عن الـ E، ما حكيتش عن الـ F هتقولين الـ E تي إي بار
هي طلعت فتحة القوس ماليش ده قعد في الـ package صار
أنت في النهاية الـ E بتستبدليهاش بهذه ولا بهذه أنت
الـ E كل استبدالاتك إلها إيش؟ إيش عندها
productions هذه الـ production هي اللي طلعت لي فتحة
القوس وبالتالي أنا بكتب قبال الـ E وفتحة القوس إيش
بأشي بكتب هنا أن الـ E لما بتعطيني T E bar تحت فتحة
القوس يعني هدول معناه الجملة أن فتحة القوس بيكون
بداية لـ E أو بطلع من E كبداية إذا استخدمنا هذا الـ
production بتاع E أما ماليش علاقة بحاجة ثانية
شوفتي كيف؟ طيب الآن نفس الكلمة بنفس الطريقة الآن
عندك الـ E مع الـ ID من أي production بيطلع؟ ما فيش غيره
TE bar نفسه عشان هيك مش هتيجي تسوي هنا E سهم TE
bar فهي باختصار إذا أنا انخلصت إيش؟ أول row كامل
طبعا لو كان في production يعني في بدايات ثانية ضرب
زائد كله هروح أكمل تحته لو كان في productions أخرى
طلعت حاجات ثانية كنت هستخدم الـ production الأخرى
اللي بتطلع الحاجات الثانية فأنت بدك تكون مقيدة هذا
فتحة القوس من الـ E من أي production تحديدا طلع بدك
تكتبي تحتها الـ ID مع الـ E من أي production بدك
تكتبي تحتها طيب بدي أفرض مثال جدلا من عندي من عندي
فرضية هيك بس عشان نستوعب الدرس أكثر لو كانت هذه
هيك وفتحة قوس مثلا T إيش هتسوي حضرتك بين فتحة القوس
و E للأسف هتحطي اثنتين وهذا صار الـ LL one ليش؟ لأنك
هتقولي القوس بيطلع من الـ E إذا استخدمت هاي أو
الثانية إذا اثنين productions في نفس المربع هذا
ambiguous هذا صار الـ LL one لأن هذا معناه أن فتحة
القوس ظهرت من مكانين مختلفتين first الـte bar فتحت
قوس و first الـ production الثاني فتحت قوس وقلنا
ممنوع مش قلنا المرة اللي فاتت ممنوع أنه يتكرر نفس
الـ term أكثر من مرة فعلى طول بتبين معايا في
المربعات إذا كان LL one مش LL one بتلاقي فيه مربع ماله
من المربعات إيش أخذ جواته تنتين production فإذا
أنت خلصت مربعاتك و لجيتي فيه تنتين في أي مربع على
طول بتحكم أيه على هذا أنه مش الألوان طبعا هذا مش
موجود بس أنا حطيته لو كان موجود الآن أنا همسح فترة
القواصل لأنه ممنوع المرة اللي فاتت قولنا يظهر نفس
الـ terminal مرتين into productions مش هيك تنسيش
القوانين المرة اللي فاتت تمام؟ طيب الآن بنفس القليل
يا بنات بدنا نشتغل على الـ E bar الـ E bar أو ليش
إيش بيقول لي الزائد الزائد من وين طلعت؟ من هذا ال
production صح؟ إذا حضرتك هتيجي تقولي الـ E bar عند
الزائد إيش هتستبدليه؟ E bar زائد T E bar في المربع
عادي بتحطيه مظبوط ولا لأ؟ طيب كملي إيش لاجينا؟ أيوة
ركزي معايا شوية هاد الـ epsilon إيش معناها؟ معناها
أن ممكن الـ E bar تكون فراغ صح؟ في الحالة هاد ال
look ahead علاش يكون واقف؟ إذا كان صح الحاجات اللي
بتيجي بعد مين؟ بعد الـ E bar صح ولا لأ؟ عشان هيك
أنا هقول الـ E bar بتطلع epsilon عند الحاجات اللي
بتظهر ورا مين؟ الـ E bar في الحالة هذه أنا بالزمن
أحسب الـ follow E bar إيش الـ follow E bar يا بنات
مرة فاتت خدناها؟ follow E bar أظن أن كانت مش عارف
تسكيلة جوس دولار تأكدوا أننا في دفتر Q عشان نقدر
نشتغل تسكيلة جوس ولا فتحة جوس كانت تسكيلة جوس إذا
إيش هسوي عن تسكيلة الجوس يا بنات حاجة أقول عن
تسكيلة الجوس الـ E bar بتعطيني epsilon ليش؟ طب ..
ليش أنا أخدت E bar تبتدي؟ لأن الـ epsilon بتطلع
من E bar لإبسلون، صح ولا؟ طيب، على فرض أنه ما كانش
في epsilon هنا، على فرض كانت مثلا بي سي و الـ بي
بتعطي إبسلون و الـ سي بتعطي إبسلون، هي هي، هتسيري تحط
E bar بتعطي مين؟ بي سي، يعني أنت لازم تحط مين
اللي طلعت الـ epsilon للفلوات الآن هي الـ Epsilon
بتطلع بشكل صريح قاعد مش حاطب الـ PC بتطلع بشكل صريح
من وين؟ من هذا الـ production يعني في production
جاهز E bar بطينا Epsilon إذا هذا وين أنا هحطه الـ E
bar بطينا Epsilon عند الـ follow بتاع الـ E bar إذا
هحطه هنا أنا هحطه وين؟ بس بديك برضه تفهم أيه
المعنى؟ إيش المعنى؟ المعنى يا بنات أنه لو الـ look
ahead واقف على تسكيرة ghost مسموح لك الـ E bar تكون
epsilon ليش؟ لأنه أنا عارف أن تسكير الـ ghost بيجي
بعد الـ E bar إذا أنت E bar ممكن تكون epsilon نفس
الفكرة الـ dollar sign بيجي بعد الـ E bar إذا مسموح
لك يا E bar تكون epsilon بس في الحالتين هدول اللي
عند الرموز بتظهر بعدي لكن الأشياء اللي بتظهرش بعدي
غلط أحطها ده الكلام بعدين في ملاحظة صغيرة لاحظ أنه
أنا هنا ليش ما تعاملتش يا بنات مع الـ epsilon مع
الـ follow في الـ E ليش ما تعاملتش مع الـ .. لأنه
مافيشش جوا الـ E epsilon وطالما مافيشش جوا الـ E
epsilon معناه أنا بيعنيش من بيجي ورايا لأنه غلط أنا
بستبدلش الـ E بـ Epsilon عشان أطلع اللي بيجي ورايا
فبتطلعش على الـ follow طب ليش أنا في الـ E bar
اتطلعت على الـ follow لأن الـ E bar ممكن تكون
Epsilon وبالتالي طالما ممكن تكون Epsilon معناها
لازم أشوف مين الرموز اللي بتظهر ورايا عشان أختار
الـ Epsilon باختصار طب ليش الزائد ما حطتش عندها الـ E
بتحت الـ Epsilon لأن الزائد هي بتطلع كبدايات
فاستبدلتها على طول بيش باللي بتطلعها أنا بس الـ
Epsilon بحطها عند اللي بتطلعولي الـ follow، هاي
باختصار وبهيك أنا خلصت الإبارت خلوني بس أكمل بقية
الجدول و بعدين أسمع أسئلتكم الآن بنفس الفكرة أنا
بده أشتغل T بدك تحسي بفيرس T إيش الفيرس T المرة
اللي فاتت كانت؟ إيش كانت الفيرس T عندكم؟ فتحة
course و ID من وين طلع من أي production؟ فتحة القوس
طالما ما فيش شغل أي نفسها عشانك حضرتك إيش هتسوي الـ
T مع فتحة القوس إيش هتيجي تحطي تحتها؟ T بتعطيني F
T bar وعند مين كمان؟ وعند الـ ID هتيجي نفس الفكرة
الـ T بتعطيني F T bar طيب هل هتطلع الـ follow؟ لأ
ما فيش epsilon عشان أقول من الرموز اللي بتيجي ورايا
فخلص خلصنا طبعا؟ طيب بس خليني أكمل طيب بعدين بجي
لنقطة اللي بدأ أقولها الـ T bar إيش الـ first تبعها
الـ first من المرة اللي فاتت تاع الـ T bar إيش
بيساوي ضرب و Epsilon إيش حضرتك هتساوي مع الضرب
هتشوف الضرب من وان طلع الضرب طلع من هاي إذا هتحط
الـ production هذا وين؟ بين الـ F بين الـ T bar و
الضرب، مظبوط؟ هتيش تقول الـ T هنا مظبوط
سهم ضرب F تي بار تي بار طيب الـ epsilon إيش هساوي
فيها؟ أيوة بدي أشوف الـ follow تاع الـ T bar تمام و
أحط عنده الـ T bar تحطين الـ epsilon طبعا مش هكمل
هشوف الحل كامل الآن موجود بس هاي الفكرة و بعدين
أخر إيش إيش عندك الـ F الـ F إيش بتطلق كبدايات هاي
فرس الـ F انتبه هنا حتتميز القوس طلع من أول
production و الـ ID طلع من ثاني production إذا
بالنسبة للـ F مع الـ ID مين هتختاري؟ FID لأن الـ ID
طلعت من هذا الـ production فهتنسخي FID هنا و فتحة
القوس من أين طلع؟ من F فتحة قوس E تسكيرة القوس و مش
هطلع على الـ follow لأنه ما فيش في الـ F أبسلون و
بهيك أنا عملت الـ parsing table تمام؟
طيب الـ parsing table هذا اللي أنتو شايفينه ممكن
نعمل فيه تعديل طفيف كمان شوية هشوف التعديل بس ده
أقوله من الآن أنا الـ E يا بنات مين الـ follow بتاع
الـ E؟ مين الـ follow بتاع الـ E؟ الـ follow تعالى
إيه؟
تعالى إيه؟ مين هم؟ تسكير الـ course؟ و دولار؟ آه
الآن يعني المكان هذا و المكان هذا إيش تفهمي؟ يعني
افترض الـ look ahead واقف هنا يا بنات الـ look ahead
وعندي أنا شغال في الـ E إيش هتفهمي أنه مستحيل تسكيرة
القص يطلع من وين؟ من الـ E فالمفروض تقولي error صح
ولا لأ؟ لكن عشان تقدر تكملي مش الفتحة القص أو
تسكيرة القص مش E بتجي بعد الـ E فأنت ممكن تقولي
خلاص برمي الـ E و بسجر سلة error عشان أقدر أكمل
يعني هدول النقطتين ممكن يكونوا نقطة بداية جديدة صح
لما يقول لي E مع تسكير القوس هقول له error لأنه عمره
ما بيجي تسكير القوس من الـ E لكن أنا عارف إن هو في
الـ follow تعليه وبالتالي كيف بقدر أكمل أني خلاص
أنسى الـ E و أشوف إيش وراه؟ هذا على ما أحجيها كمان
شوية أجلها النقطة مش مشكلة أحجيها بالتفاصيل أجلها
النقطة هذه خلاص المهم هذا الـ parsing table اللي
أنا عملته بريحني في عملية الـ recursive decent
parsing و بريحني في الـ non recursive طب كيف بريحني
في الـ recursive؟ لو بدي أعمل الـ function E يا بنات
لو بدي أعمل الـ function E إيش حضرتك هتقولي؟ شوف
السهولة if lookahead id هتستدعي هذه صح؟ هتسيرش
تقولي استدعي T استدعي E bar else if الـ look ahead
فتحت course استدعي T استدعي E bar else error صح
ولا لا؟ على طول طيب تعالى اعمل الـ E bar كيف حدث
برمجيها بالـ recursive زي زمان if lookahead ID يعني
استدعى F T bar else if فتحة في الـ E bar احنا
شغالين if lookahead plus match plus استدعى T
استدعى E bar else خلاص nothing مش كنا نقول else
nothing ما فيش مشاكل شوفتي كيف يعني المقصد أنه هذا
الجدول بريحني كثير في الـ recursive decent parsing
ليش؟ لأنه خلاص الداني من الآخر هذه الـ E مين
بداياتها في الجدول فأنت كل اللي هتعمل الـ F قلص
للبدايات و خلاص قلص الرم طبعا لحظة هذا متى يظهر
أهميته إذا لم يكن البدايات واضحة يعني افترضي هذا
TE bar أو T مثلا E E bar T مثلا أو مش عارف مين
و مين و مين طب أنت كيف تشتغلي اختار هاي ولا اختار
هاي ولا اختار هاي صعب عليكي في الأول صح ولا لا لكن
تخيل أنت عارفة in advance بدايات الـ E و كل واحد إيش
الـ production تبعه على طول تدخل في كودك if look
ahead كذا هاي الـ production if look ahead كذا هاي
الـ production else error شفت على السريع طبعا ليش
أنا ما كنتش أحس بالمشاكل زمان لأن زمان كان يعطيني
بدايات على طول جاهزة for خد كل هذه if خد كل هذه
لكن شغل اليوم البدايات مخبية فأنت لما بتعملي
بارسينج تابل زي هيك أنت شو سويتي طلعت البدايات
بشكل واضح لكل production مين بدايته عشان تقدر
تبرمجي الـ research أنتبعك بسهولة فواضح إنه انعكس شغل
اليوم على تسهيل برمجة الـ Recursion و عشان تستمعوا
بيها أكتر، بدي أقول للبنات اللي قاعدين، يلا
اعملي لي Recursion لهذا اللي قاعدين هيقولوا ماشي،
إيه؟ و يعملوا يسكتوا و يقفوا، ليش؟ لأنهم مش عارفين،
يختاروا هاي ولا يختاروا هاي، صح؟ صح ولا لا؟ تقدر
تكملي؟ مش هتقدر تكملي لكن الآن بوجود هذا افترض عند
الزائد مثلًا بدي اختار E بتعطيني الثانية E bar T
افترض خير بوجود هذا هتحللي على طول إيش هتصير تقولي
function a if id match كذا match كذا أو sorry if
lookahead plus if lookahead plus if lookahead plus
if lookahead plus if lookahead plus if lookahead
lookahead plus if lookahead plus if lookahead plus
if lookahead plus if lookahead plus if lookahead
plus if lookahead plus if lookahead plus if
lookahead plus if lookahead plus if lookahead plus
if lookahead plus if lookahead plus if lookahead
طيب ماشي هذا أحد الفوائد لل first و ال follow أو
لهذا الجدول أنه سهل عليّ في موضوع ال recursion
لكن في فائدة ثانية ما أخذناهاش ده ناخدها الآن أنه
كمان بيعمل لي طريقة جديدة لل parsing لا تعتمد على
ال recursion بتعتمد على ال stack اسمها non
recursive parser اللي بدنا نتعلمه الآن يعني هذا
كمان هستخدمه في ال non recursive ده نشوف الأن كيف
نستخدمه الآن في أي أسئلة؟ اتفضلوا اللي بيسأل على كل
اللي شرحت فيه السابق اتفضل اه
لأن فرضة فرضية زيادة هو مش موجودة في السؤال في ال
E bar عفوا اه
أيوة أنت هنا قادر إذا بدك تسهل على حالك في ال code
إيش تقولي سطّق للزيادة ما كناش نعمله زمان else إذا
look ahead مش تسكيلات جوس ولا دولار error قادر
تعمل error من المكان هذا على طول مش هيك؟ لأن لازم
إيش اللي ورايا يكون يا تسكيلات جوس يا دولار فممكن
تعمل الفحص في المكان هذا وممكن ما تعملهوش لأن اللي
ورايا هيعمل ماشي زي ما كنا نعمل زمان فبالعكس
هتديكِ option زيادة كمان إنك تريدِ تكشف الخطأ من
المكان على طول بطحت؟ تمام في أي سؤال ثاني؟ أخر
سطرين في ال F؟ في الـ E bar أه ليش هنا هنا بنسوي؟
الآن إذا ال first E bar فيها إبسلون إيش يعني first
E bar فيها إبسلون؟ يعني ال E bar ممكن تستبدل
بإبسلون هذا المعنى في الأول كيف تستبدل بإبسلون؟
يعني ممكن ال E bar نختاريها مين؟ إبسلون طب السؤال
متى أنا بستبدل ال E bar بإبسلون؟ إذا كان ال look
ahead واقف على حاجة بتيجي ورايا مش هيك؟ أنت متى
بتستبدل الـ E bar بالإبسلون؟ إذا كان لك أهد مش
واقف على البدايات و واقف على الأشياء اللي بتيجي
بعدي عشان هيك أنا إيش بقوله؟ بقوله بحط ال E bar
إبسلون للناس اللي في ال follow اللي بيجوا بعدي مين
اللي بيجوا بعدي ال E bar؟ تسكبتوا الجوز والدولار
فجيت تحتهم إيش؟ حطيت بس في الحالتين هدول إحنا
بنستبدل ال E bar بالإبسلون okay؟ أي أسئلة؟ تمام؟
كمل؟ ديروا بالكوا هذا كله اللي بيبقى أشرحه مهم جدا
و كله جاي في الامتحانات تدرسوه و عشان تكونوا في
الصورة الامتحان جاهز و خلص و رجعت و حلته كما شاء
الله أطبعه بالكامل يعني انتبهوا أنه خلص و جاهز
فانتبهوا رقّزوا فكل كلمة بحكيها الآن مهمة مضايقوش
ولا كلمة ممكن كلمة صغيرة على درجات و أنتم مش
حاسين فكل كلمة بتتنحكي رقّزوا فيها و تفهموها و
تسألوا واضح؟ طيب طيب تعالوا الآن نشوف كيف هذا الـ
parsing table هيستخدم بس قبل ما أروح أشوف استخدامه
بدا أعطيكم مثال ثاني على الـ parsing table للمثال
هذا متذكرين
المثال أخذناه المرة اللي فاتت اللي قلنا ألوان
ومش ألوان وختمنا فيه؟ بدنا نعمله parsing
table هذا
هذا طيب هذا المثال يا بنات بدنا
نعمله بارسينج
تابل عشان
نعمله بارسينج تابل لازم في الأولش تحليل ال first و
ال follow لازم تجهزيهم و إحنا حلناهم المرة اللي
فاتت لكن بتكتبيهم من باب التذكير إيش ال first بتاع
ال S أول شيء ها ال first بتاع ال S I و I ثانوية
بس هنرتب عشان اللي بيدرس و بيراجع first ال S إيش
أخذنا المرة اللي فاتت كان I و I I و I طيب و
first ال E bar و Epsilon طيب و first ال E B طيب و
بدنا follow ال S إيش كانت دولار و ال E طيب و ال
follow لل E bar إيش كانت دولار و ال E طيب و follow
ال E أخر واحدة
كانت الـ T بس كانت حسب ما كانت .. شوفوا إحنا
حليناها المرة اللي فاتت الآن عشان أعمل ال parsing
table كام رو بديكون يا بنات؟ كام رو؟ على كل non
terminal رو صح ولا لأ؟ طبعًا أيه .. هاي الأولاني
اللي هو مين؟ S ومين؟ ومين و E هذا الروز طيب كام
عمود حسب اللي عندك جِداش في عندك I و في عندك T و في
عندك E و في عندك A و في عندك B و في عندك Dollar
هاي كل إيش ال terminals الآن كيف بنشتغل هتقوليلي
عادي أنت هتقوليلي أول شيء مين فرستات ال S مين first
ال S؟ ال I من وين طلعت؟ من هاي، إذا هذه بتحطيها بين
مين ومين؟ بين ال S و ال I عشان هيك حاجة بين ال S
و ال I بقول ال S بتعطيني I E T S E bar، هذه أول
واحدة، الآن في كمان first اللي هو ال A small من
وين بتطلع؟ من ال S بتعطي إيه؟ وين بتحطيها؟ هنا ما
طلعتش ع ال follow لأنه مافيش epsilon طيب ال E bar
إيش ال first تبعها ال E وين نحط هنا ال E bar S
ولأنه في epsilon بده أروح أحط ال E bar بتعطيني ال
epsilon عند ال follow تاع ال E bar وين ال follow
تاع ال E bar الدولار
و ال E كمان مرة الآن بتلاحظي إنه صار ال box فيه
اثنتين إذا هذا ليس الألوان وأثبتناها المرة اللي
فاتت مش الألوان عشان هيك لاحظي إيش المعنى يعني
الفكرة وين أنه لما I look ahead يكون واقف على E و
أنا قادر في انتظار ال E bar أنا بكون محتار هل ال E
هاي هي البداية يعني أستبدل هاي بهاي ولا هل ال E
هاي هي اللي ورايا وأستبدل هاي بهاي فهنا بيصير
ambiguous هنا بيصير تحيير عشان هيك هنا بيصير
المشكلة عشان هيك هنقول لما في إبسلون ممنوع يتقاطع
ال first و ال follow تقاطعوا معناه حيظهر الحالة
هذه جوا حيظهر أكثر من ال production في نفس المربع
طبعًا خلينا نكمل آخر واحدة ال follow ال first A
بس هتيجي عند ال B بس إيش تعمليه ال E
بتاعة ال B الآن لو سألتك هذا ألوان ولا لا، إيش
هتجاوبي؟ لا مش ألوان، ليش؟ لأنه two productions
in the same square أو في نفس المربع، خلاص على طول
يعني هنا بتوصلي لمعلومة إنه لو واحد قال لك هذا ال
diagram الألوان ومش الألوان ورحت حبيتي تجيب
ال firstات و تجيب ال followات و تعمل ال parsing table و
تتطلعي عليه في الآخر لقيتي مربع فيه اثنتين وقلتِ مش
الألوان خلاص كلامك صح بس مشكلة الطريقة هاي أنها
طويلة بتجيب كل ال firstات و بتجيب كل ال followات وبعدين
بتروحي تجيبي ال parsing table بس بتظبط عشان اللي قال لك
بقول تلجئي إيش للطريقة هاي؟ تلجئي أفضل للثلاث rules
بس الثلاث rules هتعمل ال first و ال follow بس
بشكل جزئي إنه لهاي اشتقاق و مشتقاق والاخيرية وهذه
أسرع لكن إن مش قادرة ومش عارفة خلاص روحي لهذه و
اتخذي بس طبعًا لما أكون مجبرك في السؤال اعملي لي
بارسينج تابل مش ما تروحي تعمليهوش لا بدك تعمليه
ساعتها ال parsing تابل بس بقول لو كان السؤال
الألوان ومش الألوان أنت مخيرة تعمليه أو تحليه على
القوانين زي ما بدك واضحة ال parsing تابل كيف
بنطلعه؟ ما فيش فيش ال parsing تابل سهل الآن تعالوا
طب نشوف كيف عملية ال non-recursion بدها تسير
تعالوا نشوف ال non-recursion كيف بده يسير
وهنا الرسمة اللي إحنا بدينا فيها، بدي أمسح الآن
هذه يا بنات، تمام؟ الآن إيش قال لك؟ قال لك عشان نقدر
نشتغل recursion، non recursion عفوا هذا ال parsing
تبدأ تجهزيه اللي تو جهزناه قبل شوية وال stack أول
ما ببدأ بيكون بس فيه حاجة واحدة بيكون بس دولار و
ال start symbol وفاضي بعد هيك ال stack أول ما
ببدأ بيكون فيه الدولار وإيش في ال top؟ ال start
symbol خلاص هذا ال stack بيكون زي هيك لحظة
البداية وبيكون هذا الطرف جاهز اللي هو بدي أفحصه
اللي هو ال look ahead وين واقف عشان أفحص هذي في ال
grammar ولا مش في ال grammar طيب كيف بدنا نشتغل؟
جالي الآن بدك تطلعي هنا مع ال top بتاع ال stack
الآن هنا عبارة عن إيش؟ non-terminal صح؟ وهنا عبارة
عن إيش؟ دائماً terminal فجأة بدك تروحي على الجدول
وتشوف التقاطع تاع الـ A مع الـ E جالك فيه عندك
احتمالين يا يكون فراغ ما فيش شيء وهذا اللي معناه و
هنعمل action معين يا بيكون فيه production جوه الآن
لو كان فراغ إيش المعنى اللي أنت هتفهميه المعنى أن
الـ A لا يمكن أن تظهر مع الـ E عشانك في الحالة دي
إيش بنسوي؟ بنقول الـ A هذي غلط وامشي شوف اللي وراها
خلاص مش بنعمل skip للغلط كنا بنقول في أحد ال
strategies في الـ recovery أن هو أول يقول كيف يكمل
خلاص يعمل skip للمشكلة ويكمل لما يلاقي إش يقدر
يبدأ من عنده صح ولا لأ؟ طيب طيب سؤال تاني لو كنتي
عارفة أن الـ A بيجي ورا الـ E اللي في الـ stack هذا
إيش الصح؟ أنه بنرمي الـ E وبنكمل من الـ stack طبعاً
أفترض الـ stack كان ماشي مليان فيه شغلات كتير لأنه
لما بيكون الـ A بيجي ورا الـ E خلاص بشيل الـ E لأنه
هذه نقطة بداية جديدة الآن أن هذا بيجي ورايا وهي
اللي ورايا هي ورايا وهي ورايا مش هيك بقدر أكمل
عشان هيك أنا بيهمني أكون عارف الـ A من اللي بيجي
ورا الـ E ولا لأ وبنميزها برمز اسمه sink كمان شوية
هنشوفه يعني لو أنا كتبت sink هنا يا بنات إيش هتفهمي
الـ sink يعني الـ A ممكن ييجي ورا الـ E يعني في حالة
الخطأ ارمي من الـ stack ليش؟ إيش يعني شيلت من ال
stack حاجة ورميتها؟ يعني روحت للي بعدها، صح ولا
لأ؟ مظبوط ولا لأ؟ وأنت الـ A تيجي بعد الـ E صح ولا
لأ؟ نقدر نكمل علامة هذه بتاعة التكملة جايها كمان
مرة يعني، مش مشكلة، خلّيها جايها كمان مرة ارجع
الآن تبرفش الـ sink كيف أنا معاكم؟ الآن تبقى لا فيش
sink جايها كمان مرة .. كمان شوية الآن خلينا نفعل
احتمالين ما فيش غيرهم الاحتمال الأول أنه فراغ وأنه
لا يمكن الـ A تطلع من الـ E وأنه نعمل رسالة error و
نعمل skip لمن؟ للـ A ونكمل الاحتمال الثاني أنه هنا
يكون فيه شيء شيء يعني فيه شيء؟ إيش الشيء اللي بيكون
أن الـ E بيعطيني مثلاً TE bar مثلاً أنه بأعطيني
production مش أنا أتوقع أنه نقطة production في
الحلقة دي هتسوي حضرتك هتشيل الـ E من الـ stack و
تحط مكانه بالمعكوس تحط مكانه E bar T ليصير الـ top
هو الـ T ليش بياخدوا الـ top بالـ T لأن دي first high
أنا في النهاية فبحطهم بالمعكوس شوفت كيف الـ stack و
بنكمل عادي الآن A مع مين؟ مع T بتشوف A مع T افرض
لجيت T بتعطيني A هنشيل الـ T إيش هنحط مكانها؟ إيه؟
ماشي الحال؟ طب إيه مع إيه؟ مظبوطة مظبوطة خلاص pop
من الـ stack تجوزت الفحص وامشي يا look ahead أن
ما في مشكلة في الأول وكمل طب امتى بنخلص؟ إذا وصلنا
للـ dollar sign مع الـ dollar sign بدون أي errors
معناه هذه الـ sentence مكتوبة بشكل سليم وصحيح وفي
الـ language إذا كان فيه أخطاء مش مكتوبة بشكل سليم
كل شخص يقول لي يقرر ويكمل يقرر ويكمل كيف يكمل كمان
شوية هحكي عن التكميل أنا في الأول هعطي مثال بدون
أخطاء أن يمشي كامل صح وبعدين هنعمل أن لو في خطأ
كيف يكمل واضحية عشان نسوي تعالوا ناخد مثال ما فيه
أخطاء خليني بس ناخد المثال وبعدين نسمع الأسئلة
خليني أخد المثال هاي المثال يا بنات بقول لك بدنا
نبدأ نتأكد هاي الـ stack
هي أول ما بنبدأ يا بنات الـ stack إيش بيكون فيه على
الـ top أول start symbol وهذه الجملة الصحيحة اللي
ما فيش فيها خطأ اللي بدنا نعملها عملية parsing إننا
نتأكد إن هي في الـ language ولا مش في الـ language
وتنتهي بإيش؟ بالدولار أول ما هتبدأ حضرتك هتروحي
على الـ parsing table تشوف الـ ID مع مين؟ مع الـ E،
روح تطلع التقاطع تبع الـ ID مع الـ E، إيش هتلاقي
فراغ ولا فيه production؟ فراغ طلعت يعني، روح شوف
الـ ID مع الـ E في production اللي هو E T E bar صح
ولا لأ؟ إذا إيش هنسوه في الحالة هاي؟ هنشيل الـ E
ونحط مكانها بالمعكوس E bar وT الـ T تصير هي الـ top
عشان إيش قال لك؟ قال لك شيل الـ E وحط مكانها إيش؟ E bar
T بحيث الـ top من يكون الـ T الآن كملي كل ما بتلاقي
الـ terminal non-terminal روح على الـ parsing
terminal عشان تحسم الأمر أنه في خطأ ولا كمل إذا في
شيء معناه كمليه في الـ stack عيدي ID مع T روح يشوف
الجذول ID مع T إيش هتلاقي في المربع هتلاقي شيء
مكتوب إيش يعني شيء مكتوب يعني شيل الـ T لحالها و
استبدليها بـ T bar وF شال الـ T إيش يستبدلها بـ تيبار
وF الآن عادي ID مع F طلعي في المربع تقاطع ID مع F
هتلاقي F بعطيني ID يعني شيل الـ F وحط مكانه ID
الآن هتلاقي ID ID في الحالة هذه بوب امشي يا look
ahead يعني خلاص هذا صح هذا موجود هذا بطلع ما فيش
مشاكل فكيف بدي امشي الآن بمشي look ahead خطوة يعني
بيصير وين واقف اللوك هتقعد زائد والـ stack بيشيل
الـ top اللي هو الـ ID بيقول خلاص صدفش فيه مشاكل و
بنكمل عد نفس الطريقة يا بنات زائد مع مين؟ مع اللي
كان على الـ top زائد مع الـ T bar، روحوا شوفيها إيش
بتلاقيها؟ epsilon الـ T bar، بظبط؟ فرح مسحها، الآن
إيش ضال؟ زائد مع E bar، روحوا شوفيها هتلاقيها زائد
T E bar مظبوط فإشار الـ E bar وحط مكانها زائد E bar
زائد مع زائد بيشيلوا بيشيلوا بيكمل ID مع ID هيكمل
كمل كمل لما في الآخر يوصل دولار مع دولار يعني خلص
بتطلع ما فيش ولا أي خطأ ماصارش فيه أخطاء يبقى فعلاً
الـ sentence هاي هي في الـ language فهو فعلياً إيش
عمل؟ هو عمل parsing يا بنات هنا بس على شكل non
recursive ما عملهاش الـ cares الـ function تسادي نفسها
كل قصته stack وlook ahead وparsing table شيل في
الـ stack وحط في الـ stack وشيل في الـ stack وحط
في الـ stack لما يخلص dollar sign مع dollar sign
خلصنا في الـ language موجودة هذا لو كان ما فيش أخطاء
الآن هنعيد المثال لو كاتبين خطأ طبعاً لازم إذا
كاتبين خطأ مش يقول error ويطلع يقول الـ error
ويكمل الـ parsing لما يخلص دولار مع دولار ويكون
كتابة لرسائل الخطأ مش هيك اللي المفروض يسوي طيب
جاب لي الألم أروح على .. بتاع الأخطاء في أي مشكلة
حد مش فاهم كيف عملنا الـ non-recurgent parsing
simple خالص زي ما شايفه بس تابعي مع الـ parsing
تابعي في أي أسئلة يا بنات؟ في أسئلة ولا خلاص؟ طيب
خلونا الآن ناخد خطأ يعني نعتبر أن الجملة المكتوبة
فيها خطأ بس قبل ما أعتبر الجملة فيها خطأ بدي أحسن
الـ parsing table شوية احنا مش تاوي عملنا ال
parsing table هيو يا بنات الـ
parsing table هيو مش هذا عملناه
أه؟ بدي أحسنه شوية، شوفوا كيف بدي أحسنه، راجعوا
معايا، راجعوا معايا احنا اتفقنا أن لو كان الـ
look ahead terminal والـ
top بتاع الـ stack non terminal، إيش اتفقنا
نسوي؟ بدنا نشوف المربع التقاطع إذا في إيش بيستبدل،
بيستبدل، صح؟ افترض اجينا بين الزائد والإي لقينا
فراغ Stop Error خلصنا، بدك تسجل رسالة Error بدنا
نشوف كيف نكمل الآن كيف نكمل الحين في الأول خلاص
طالما الزائد فراغ إيه معناه الزائد بيطلعش من الإيه
معناها أول حاجة error الآن ضال السؤال طب كيف أكمل؟
ألغي من وين؟ ألغي من الـ stack؟ ولا ألغي من الـ look
ahead؟ ألغي من هنا؟ أي وركزي معايا قال إذا هذا
الزائد مش من الناس اللي بيطلعوا بعد الـ E بيطلعش كمان
بعد الـ E لا هو بيطلع من الـ E ولا هو بيطلع معاه بعد
الـ E معناه خلاص برايح راسي ومن وين بشيله من فوق
بقول هذا لا يمكن يبين معايا خلاص بقول error أنت
كاتب لي زائد زيادة وخلاص امشي يا look ahead وكمل
عملية الـ parsing سؤال لأ طيب افترض لو كان أن الزائد
من الناس اللي بتفهر بعد الـ E وافترض هنا كان في
مثلاً A bar وفي T وفي .. مليان الـ stack ولا جيت
الزائد ولا جيت الـ E وعندي معلومة من زمان أن الزائد
ممكن يجي ورا الـ E كيف نكتملي أشيل الـ E وخلاص و
أكمل الزائد مع الـ E bar ولا أمشي من الزائد أعمله
skip إيش الأفضل؟
ليش؟ طيب ما هو الزائد ممكن ييجي ورا الـ E صح؟ طب
ما أشير الـ E وخلاص صرت في نقطة بداية جديدة مش
أهلا بيقول الزائد ممكن ييجي ورا الـ E صح ولا فأنا
خلاص برمي الـ E وبجيب اللي ورا هي نقطة بداية جديدة
أن أنا أقدر أكمل كودياً احنا الآن skip كنا نكمل يا
بنات الـ strategy مش كنت بتعمل skip skip skip لما
تمسك نقطة أنك تقدر تبدأ من عندها طب ما أنا الزائد
هذه ما هي بتيجي ورا الـ E ما أنا لو رميت الـ E هاي
خلاص بدأت من جديد صح ولا لأ؟ مش أنا، بدأت من نقطة بداية
لكن إذا الزائد لا يمكن يضام الـ E ولا ورا الـ E بس
ينرمي من فوق لغاية ما ألاقي حاجة أبدأ من عندها
المشكلة عند الـ error لازم تقدر تلاقي نقطة تقدر
تبدأ من عندها، فأنا طالما بعرف أن الزائد ممكن يجي
ورا الـ E ما خلاص ما برمي الـ E و بمسك اللي وراها
فصارت الـ E bar مع الزائد مرشحة إيش؟ تتكمل عادي
طبيعي عشان الزائد بيجي ورا الـ E رمينا الـ E خلاص
صرت في اللي وراها، إيش أنا رميت الـ E؟ يعني تبتدت
فيها فراغ وسجلتي error معناه ممكن تقدر تكملي، فعشان
تخديها من الآن قاعدة ومسلمة، إذا كان هذا فراغ بدك
تفحص الزائد مع الـ E، هل هذا الزائد ممكن من الناس
اللي بيظهر ورا الـ E؟ أه ممكن، إذا بترمي من وين؟ من
الـ stack لأ مش ممكن، كمان يجي ورا الـ E بترمي من
وين؟ من فوق، هي باختصار بس ضال السؤال، طيب أنا كيف
أعرف بيجي ولا بيجيش؟ من الـ follow عشان الحضرة
جنابك تعالي للـ follow E مين هم الـ follow E كانوا؟
مين هم الـ follow E؟ الـ follow E ارجع شوفيها الـ
follow E تسكير القوس و الدولار، مش الـ first الـ
follow هذا مش الـ T يا بنات، هذا .. هذا خلاص هذا مش
مثال تاني هذا .. هه .. هذا جديد هذا .. هه .. هذا
قديم هه .. خلاص هذا .. أيوة، نسوي تسكير القوس و
الدولار، أيوة عشان هيك هنجي عند تسكير القوس إيش
هنكتب؟ هنكتب كلمة sink، إيش مقصود فيها sink؟ إنه هذا
يظهر بعد هذا، و هذا يظهر بعد هذا، و هدول ما كتبتش
عنده sink لأنه لا يظهر، خلاص ريحت دماغي، طب هنا ليش
مافيش sink لأن استخدمت الـ first و الـ follow، هنا في
sink اه لأنه مافيش follow، إيش الـ follow بتاع الـ
تيكان يا بنات؟ إيش follow التيكان؟ شوفوا الدفتر
عندكم، إيش follow التيكان؟ الزائد، يعني هحط عندها
sink و الدولار sink و مين كمان؟ sink خلاص، و هذه
ما بحطش فيها sink لان استخدمنا الـ first و الـ follow
و الأخيرة استخدمنا الـ first، إيش الـ follow بتاع الـ
F، follow بتاع الـ F، إيش الـ follow بتاع الـ F اللي
حلينها المرة الماضية بقى مين اتضارب، طيب
تعالوا لنشوف، بنات راجعوا شوية، تعالوا نشوف كيبنا
نحل على الأخطاء الآن، تعالوا نطلعوا نشوف كيبنا نحل
الآن، افرضي .. افرضي أن الـ look ahead واقف على زائد
وأنا شغال في E، إيش هتسوي حضرتك في الحالة هاي؟ error
error، وكيف هتكملي؟ حرف على الزائد، حرف على الزائد
لأنه لا يمكن الزائد يجي ورا الـ E ولا يبدأ من الـ E
نبقى مع السلامة، طب افترضي كنا .. الـ look ahead هنا
وهنا خلاص برفع عليه لأن sink معناها أن هذا بيجي ورا
الـ E، فممكن أكمل من عنده فبرمي من الـ E عشان هي كبس
عدلت الجدول اللي حطيت الصينكات هدول، لما بتشوف
الصينك .. يعني دلوقتي ستحتي تلت احتمالات في
التقاطع، يا فراغ يا sink يا production، إذا
production تستبدليه ومشينا، إذا فراغ أبيض ارر و
بتشيلي من فوق، إذا sink برضه ارر و بتشيلي من ال
stack، طب ليش شيلت أنا من الـ stack؟ لأنه نقطة بداية
جديدة، لما بشيل ما هذا بيجي ورايا و ورايا فمقدر
أكمل، شوفتي كيف؟ فهي ال .. ال .. ال sink و الحين
بناخد مثال و بعدين نسمع أسئلتكم و بنختم الـ session
هذا بس في الأول أنا بدي أعمل الـ sink هاي شايفين يا
بنات؟ هاي اللي توع حليناها إحنا أيوه .. أيوه عدله
و عمله جاهز للأخطاء و حط الـ sink زي ما احنا عملنا
بالظبط، يبقى لما بدك تشتغلي على الخطأ أنه يعمل حسابه
الخطأ، هتشتغل على هذا الجدول المعدل مش الـ parsing
table اللي قبل شوية، واضحة؟ طيب تعالوا الأن ناخد
مثال، افترضي كتب زي هيك يا بنات، بنات افترضوا كتب زي
هيك، لاحظوا أن هذه فيها إيش؟ فيها errors فعلا، لأ
تعالى نشوف عملية الـ parsing كيف هتم، طبعا بس في
ملاحظة صغيرة قبل ما نشتغل، احنا قلنا إذا التقاطع
sink من وين هترمي؟ من الـ stack بس في استثناء واحد
إذا كان هذا الـ non terminal اللي بدك تشيله هو الـ
start ولسه بادئين بشيلهش، عارف ليش؟ لأن لو حضرتك
شيلتي هي الدولار وهي الـ E، لو شيلتيه خلص هتبطل اعمل
parsing، بس قال لي هي الاستثناء الوحيد أنه لما بكون
أنا داخل لسه من الـ start symbol، تجاوزا بشيل من
وين؟ من فوق عشان يقدر يتكمل، لكن لو الـ E هادي في
النصف فوق بشيل منه عادي خلاص، تعالوا نشتغل
هيقارن هاي مع الـ E، هتروح تطلعي هتلاقي sink المفروض
كان يشيل من وين؟ من الـ stack بس لأنها الـ star
symbol هيشيل من وين؟ من فوق، فالـ look ahead where
هيصير؟ الـ look ahead هنا وإيش هيسج رسالة؟ arrow
فهي أول arrow لقطه وقدر يكمل، الآن طيب الـ ID مع الـ
E، روح يشوف تطلع الـ ID مع الـ E تي إي بار، الـ ID مع
الـ T ف تي بار مظبوط، الـ ID مع الـ F زي ما كنا نشتغل
ID ID بوب ID بوب ID ضرب مع تي بار ضرب ف تي بار روح
شوف ايه المتجهة موجودة، درب مع ضرب بيروحوا الزائد
شوفيها مع الـ F، شوفيها الزائد مع الـ F، sink إيش يعني
sink؟ يعني شيل الـ F كاملي لأن هذا الزائد ممكن تجي
مع اللي ورايا فعلى طول شال الـ F وكمل طبيعي، بس إيش
سجل؟ error، زائد مع T bar هتلاقي epsilon، زائد مع E
bar خلاص كمل عادي لما خلص، لكن الخلاصة طلع كام
error؟ errorين وخلاص ومش بارسنج طبيعي، شفتي كيف؟
واضحيت؟ في أي مشاكل؟ الآن بدا تسأل .. تسأل
ما فيش أسئلة؟ كل عامة بخير، طيب break قبل ما أنتقل
لل chapter الجديد، قبل ما أنتقل لل chapter الجديد
بدي بس سؤال للشاطرين، سؤال للشاطرين الآن
إيش الستراتيجية بتاعة الـ error اللي احنا
استخدمناها هنا، إذا أنت تتذكر احنا كنا فيه أربع
استراتيجيات للـ error، الـ panic mode و الـ phrase
level mode و الـ global correction و الـ error
production مظبوط، أخدنا أربع احنا هاي أي واحدة فيهم
الـ panic ولا الـ phrase، الـ panic ولا الـ phrase، إيش
الـ panic معناها؟ إيش الـ panic معناها؟ إنه لما بلاقي
غلط بيبقى يعمل skip، skip، skip لما يلاقي بداية
يقدر يبدأ من عندها، إيش الـ phrase بيعمل؟ إنه لما
بلاقي غلط بيحاول يفهم معنى الغلط ويكمل، هاي من
النوع، عيّن الـ phrase ولا الـ panic، الأول اللي هو الـ
panic، ليش؟ لأن أنا لما بلاقي error بصير أدور على
بداية جديدة، صح؟ يا بعمل skipات، يا إذا هي بتجي
ورايا برمي من تحت، صح ولا لأ؟ طب السؤال كيف هذه
ممكن نطورها، نعدل عليه، الـ books هذا على أساس نعمل
phrase level recovery، إيش نسوي؟ كيف
أعمل هذه الجثة؟ كيف نعمل .. هنا panic mode
recovery، كيف نعمل الـ phrase level؟ كيف نعرف؟ أنا
أقولكوا باختصار عشان كوش شكرين، تمام؟ الآن، لو بين
الزائد والإي لجيتي فراغ في البنك اللي كنتش هتسوي
تعمل skip للزائد صح؟ عشان تصبح phrase بدك تحط
function هنا معينة تسميها مثلا fail، ويروح على هذه
الـ function ياخد الطرفين الزائد والإي ويحاول يتعرف
على الغلط ويعرفه، هل الـ إي زائد زيادة زائد ناقص
ويحاول يفتي فيه ويطلع نتيجة ويكمل، يعني بس الفرق
الوحيد أنه بدل ما نعمل skip بدنا نعمل إيش؟ details
function، إنه يروح على الـ function يشوف شو الغلط
اللي موجود، تحاول تعمل expectation له وبعدين تكمل
هذه الفرق الواحد بينهم، شوفتي كيف؟ إنه ما عملش ي
skip ومشي، لأ، راح أخد الطرفين وحاول إيش يعرف شو هذا
غلط وهك الـ phrase، الـ phrase برميشال phrase من مطرح
ما بيصير الخطأ، بيحاول يعرف شو هو الإقصار نسي زائد
كتب زائد، فبيحاول يعمل شوية الـ process اللي اتعرف
عليه ويقدر يكمل، هذه باختصار، واضحة يعني التعديل
طفيف لو بدنا نخليه يعمل الـ phrase خلاص؟ لكن هو
بالحالة هذي إيش panic خلاص؟ الآن تعالوا ندفوت على
الـ chapter الجديد، طب أنا بناهي هذا الـ chapter
الجديد زي ما تشايفين بالنسبة لنا مش جديد syntax
directed translation، واحنا عمليا أخدنا نوعين
syntax directed definition اللي هو بيكون فيه rules
منفصل عن الـ grammar وفعليا بيكون عندي نوع تاني
اللي هو translation scheme اللي هو بيكون الـ rules
موجودين وين؟ جوا الـ grammar و بنعلمهم بالـ brackets
هدول عشان نعرف أن هذا الـ action الموجود، بإمكانك أنت
تعتبري chapter خمسة في الغالب مجرد exercises زيادة
و أصعب شوية لأن احنا أخدنا كتير أسئلة في الـ syntax
directed definition و translation وكنت مرشحة تاخد
أسئلة عليها في المتحان النصفي وبتوقع لما رجعتي
النماذج النصفية السابقة، شفتي كتير أسئلة لل
Transition Scheme ومن هرده أنك قعدت تحلي فيهم
واحنا already أخذنا أنت بتتذكري حول من infix لـ
postfix احسب قيمة الـ value عند الـ root أخذنا اعمل
تبع الـ symbol tables أخذنا كتير أمثلة غير أسلوب الـ
exercises طب إيش اللي بيصير هنا اللي بيصير هنا
مجرد أمثلة جديدة أصعب نوعا ما شوية في بعض المناطق،
تمام؟ لكن أنا عندي الإمكانيات نحلها، ليش؟ لأن أنا
عارف من زمان أنه لازم أفكر في الأول كيف أعمل الـ
grammar للبسه في الـ language، بعدين كل production كيف
أعمل الـ rule على جباله اللي بيقدر يعمل
translation، فهذا الكلام لن يتغير لكن ضال السؤال
تختلف من صيغة إلى آخر ف أنت ما تجلجي من هذا الـ
chapter الـ chapter ما فيش فيه إشي جديد كتير فيه
معظم مجرد exercises وأسئلة جديدة طبعا أول ما ببدأ
الـ chapter ببدأ بمثال في الأول ببدأ زي ما تشايفين
بتعريف النوعين اللي عند الـ SDD أنه بكون الـ rule
منفصل يعني بحل في الأول بعمل الـ tree وبعدين بعمل
الـ annotated إني أحل عليها الـ rules عشان تطلع
النتائج اللي بديها عملتي التحويل أو ممكن يكون
موجود direct جوا الـ grammar وهذا بنسميه الـ
transition scheme فبدأ يوريكي البدايات هاي عساس إن
أنت كأنك مش عارف إشي لكن هذا كله أنت عارفاه فهنمشي
عنه بسرعة مش في إشي طبعا هنا يمكن في حاجة جديدة
بسيطة في الـ Synthetic Definition في حاجة اسمها
الـ Synthesized Attributes وفي حاجة اسمها Inherited
Attributes احنا مين أخذنا منهم الـ Synthesized إيش
كان الـ Synthesized Attribute معناه؟ إن الـ attribute
عشان يتحل قيمته في الـ annotated parsing tree بيعتمد
على الـ children على حاله أو على الـ children تبعونه
عشان هيك احنا لما كنا ناخد الدرس هذا زمان كانت كل
الـ attributes اللي نتعامل معها من نوع synthesized
عشان هيك كنا نقول زمان الـ bottom up traversal أو
الـ depth traversal بيسد الغرض إن يحل كل الـ
attributes لأنه بتشوفي دايما في الطريقتين هدول الـ
children قبل ما تشوفي مين الـ parent وبتقدر يتحلي
لكن لو اليوم قلتلك إن لأ في عندي inherited إيش الـ
inherited إن عشان أحل الـ attribute بتاع الـ node
بيلزمني أعرف معلومات من الـ parent attributes من الـ
parent أو الـ siblings من الـ إيش اللي معايا في نفس الـ
level وبالتالي زي عملية وراثة يعني لازم أورث
القيم من برا عشان أنا أقدر أحله وهذا بنسميه
inherited attribute يعني بيعتمدش على أولاده عشان
الحل بيعتمد على ناس يا parent يا siblings وبالتالي
هل طريقة الـ bottom up traversal والـ deep
traversal بتنفع؟ ما بتنفعش ليش؟ لأنه في الـ deep
traversal أبقى بشوف الأولاد قبل الأب لكن هنا عشان
أقدر أحسب قيمته لازم أشوف الـ parent والأخوة قبل الـ
node وبالتالي أكيد في لها طريقة معينة عشان نقدر
نحسب الـ attributes بس مش اليوم المرة الجاية هناخد
الطريقة هاي تمام؟ بس من اليوم افهم الفرق بين الـ
inherited وبين الـ synthesized طبعا في الـ grammar
هل كلهم بيكونوا synthesized؟ هل كلهم بيكونوا
inherited؟ هل هما mixing؟ حسب السؤال ممكن تلاقيهم
كلهم synthesized زي السابق وكنا نسميهم as
attributed فهذا كان تظبط معاه الـ bottom up
traversal والـ depth traversal وممكن يكونوا mixing
inherited على synthesize وفي الحالة هذه ما يكفيش
لحاله الـ bottom up ولا الـ depth of the basin لازم
زيارات للـ node بطريقة مختلفة هتشوفها المرة الجاية
عشان نقدر إيش نحل الـ attributes الموجودين عندي
طيب هذه ملاحظة ما حدش يقولي خلص قبل إلا ربع دقيقة
عشر كتير ممكن خلصنا بس الـ chapter هي العلم اللي
بتدوروا عليه ما شاء الله عليكم شاطرين
طيب بنات لحد الآن أنا بتطمنكوا يعني العشر دقايق
بتحكي فيهم مراجعة يعتبر ما فيش إشي جديد هذا المثال
شايفينه؟ أخذتوها قبلك ولا لأ؟ هذا أول مثال بدأنا
فيه ما كانش مشروع عندكم في الكتاب لكن مشروع اللوح
اللي هو احسب الـ value بتاعة الـ infix and الـ root
هذا ما كانش موجود في الكتاب مثال الكتاب كان الـ
postfix بس أنا شرحت هذا المثال أول مثال أخذناه ف
... فايه زي ما نشوفه؟ ايه الـ infix وكيف نحسب الـ
value and الـ root فبدأ يعملك الـ grammar وبدأ
يعملك الـ definition طب كيف نعمل الـ annotated يا
بنات؟ أكيد هيديني sentence أعملها letter E في الأول
وبعدين أبدأ أحل عليها الـ nodes وهنا بظبط الـ
bottom up traversal والدب في الـ traversal ولا لأ
بظبط لأن أي attribute بيتمد على الـ children يعني
اتطلعي تيد وتبال تحت الأب وبتساوي value الأبناء
الأب مستوى الأبناء فبالتالي هذا من نوع synthesized
attributes هذا الـ grammar كله as attributed يعني
كل الـ attributes فيه synthesized وبالتالي bottom
up أو different traversal بتقدر الغلط طبعا هو عمل
مثال عمل
مثال هاي المثال
جالك كيف نعمل ثلاثة ضارب خمسة زائد أربعة عادي
عملها parsing tree بعد ما عملها parsing tree قعد
يحل الـ attributes لغاية ما وصلت النتيجة عند الـ node
وهذا المثال حلناه في أول الفصل تمام فهذا اسمها
annotated parsing tree طبعا هنا في معلومة مهمة
ما أخذناهاش بس بذكرها إيش بيقول دايما الـ semantic
rules تبعتك حاولي ما تكونش الـ dependencies تبعتها
circular بمعنى ما تكونش الـ a مثلا ... آه يعني خليني
أورجيكيها فوق مكتوبة ما تكونش الـ a عشان تنحسب
بيديعرف الـ b في الأول وما تكونش الـ b عشان تنحسب
بيديعرف الـ a في الأول طب هيك صار مشكلة إن مين أعرف
الأول هذا بقت ما اتفتت بيتسميه الـ circular أو
dependences طبعا مش شرط يكونوا اتنين ممكن يكون زي
هيك عشان أعرف الـ A بدي أعرف الـ B وعشان أعرف الـ B
بدي أعرف الـ C وعشان أعرف الـ C بدي أعرف الـ A برضه
هذه نفس الفكرة أنا مش قادر أعرف هذه قبل ما أعرف هاي
ومش قادر أعرف هاي قبل ما أعرف هاي ومش قادر أعرف هاي
قبل ما أعرفها نفس الفكرة فبقولك حاولي تنتبهي إن
الـ dependencies الـ circular بالطريقة هاي هذه مشكلة
ما بتجيش أي طريقة إن أنا أقدر أحل عليه فبنحاول
دايما إن الـ semantic rules اللي هنا ما تاخدش هذا
الشكل الـ circular ونحاول نحله لكن في حال وجوده
أكيد هيتعامل معاملة خاصة وهذا برا الـ scope تبعنا
خلاص؟ طيب الآن هذا الـ grammar عبارة عن إيش يا
بناتي؟ شايفين هذا؟ شايفين هذا؟ لو قلنالك نعمله
predictive parser بنقدر ولا لأ؟ predictive parser
بنقدر ولا لأ؟
نقدر نعمل predictive parser؟
أنا بحكي لهذول ليش؟ ليش هفيل؟ في left recursion واضح
ت ت هي ت ت إ إ إ في left recursion عشان نعمل بتكتب
بارثر لازم حد بتشيل الـ left recursion في الأول بس
هنا قعدت في مشكلة جديدة عليها ما كنتش زمان زمان أنا
كنت أخد الـ grammar لحالي بدون rules أو إذا كان فيه
rule جواته كان print زاد إشي مش مؤثر مش حسبة صح
ولا لأ اليوم الوضع اختلف إذا الـ rules هذه داخلة
جوا ما أقدرش أشيل الـ left recursion بدون ما ألاقي
طريقة للتعامل مع الـ attributes إيش أسوي في الـ
attributes؟ يعني أديكي مثال بسيط هذه إيش تحولتها
بنات في الـ left recursion؟ هتقوليلي T
السهم طبعا الـ T bar أنا بحكي عن الـ T bar ما اديتش الـ T
العادية الـ T bar هتقولي ضرب F T bar مش هيك أنا
بحكي عن الـ T bar وفي الآخر or epsilon مظبوط والـ
action هذا لو دل قاعد زي ما هو طب وين الـ F هذي وين
الـ T ما فيش T شايفك كيف؟ أنا إيش بقول، الآن أنت
مُخيّرة كيف تساوي، هيك ممكن تفكيرك الأول يكون إنه
اعتبر الـ action كأنه مش موجود وحلي وحطي مش هيك
ممكن تفكري كنت لو حطيته زي ما هو وشلت الـ left
recursion، هيصير فيه خربطة، ليش؟ طب الـ action في T
ضد ذال، طب المعادلة الجديدة بطل فيها T أساسا صح ولا
لأ؟ طب كيف من وين بتجيب هذا الـ value؟ إذا واضح
أنها ما بتركبش، ما بتظبطش، ما بتيجيش، إذا مستحيل أنا
أشيل left recursion إذا في عندي action وحسابات
بدون ما أخد في الحسبان الحسابات تبعتي، شفت أنت
كيف؟ فهي اللي بدنا نقوله عشان هيك ... طب إيش الحل؟
الحل إن فيها هنتعلم بعدين قانون جديد في آخر محاضرة
للـ left recursion في حال وجود rules كيف ينعمل الـ
left recursion وكيف يتعامل مع الـ rules عشان يطلع
الإشي صح هذا مش اليوم هناخده القانون هناخده بعدين
المهم لما يطبق هذا القانون على هذا المثال هيطلع
معاه أي grammar اللي شفناه هاي هذا ال grammar
شايفين هذا ال grammar عبارة عن إيش يا بنات؟ هذا ال
grammar شال ال left recursion أنسى ال rules .. انسى
ال rules .. مش كنت تشيل ال left recursion قبل هيك
و يطلع هذا الجواب فت بار و ت بار ضارب فت بار أو
إبسيلون مش كنت تخليه زي هيك اليوم مش اللي جات جديد
أنه أخذ بالحسبان و هو بيشتغل ال semantic rules و
اتغيرت شايف انبرت ال semantic rules زي أول و كيف
طلعت ال semantic rules هذه هناخدلها قانونها قدام
بس المهم أنه صار في عندي grammar
مضمونًا شبه السابق اللي قبل شوية شوفته لكن شكلًا
يختلف، بس صار شكلًا مناسب لمين؟ لـPredictive parser
صار، الآن طيب بتقدر نعمل 3 ضارب 5؟ بتقدر تعمليها
ولا لا؟ هه بندق بدون in هذا مش حاضر، 3 ضارب 5
بتقدر ولا لا؟ كيف بتعمليها؟ الـT بتعطيني F T bar و
الـF بتعطيني طبعًا إيش نقول؟ أف تي بار والـT bar
بتعطيني طبعا الأف الأولاني هتعطيني تلاتة والتي بار
هتعطيني ضرب أف تي بار والأف هت بتعطيني خمسة والتي
بار الواحد هت أبسط خلاص بتطلعيها يعني هاي بالعربي
نفس ال language اللي كانت قبل شوية لل infix لكن
اللهم شال ال left recursion المرة الجاية بنكمل من هنا
يعطيكم العافية