بسم الله الرحمن الرحيم اليوم إن شاء الله بدنا
نستكمل دراسة الـ translator اللي بدينا فيه المحاضرة
السابقة أخذنا المرة اللي فاتت نوعين من الـ
translator الأول سميناه syntax directed definition
والتاني سميناه translation scheme بالنسبة للأولاني
شفناه تقريباً بشوية تفاصيل قلنا بيكون عبارة عن
جزئيتين جزئية مكتوب فيها الـ Grammar والجزئية اللي
عليها قبلها بيكون فيها حاجة بنسميها semantic rules
وطالما بنتكلم عن semantic rules معناها بنتكلم الآن
عن attributes معناها كل grammar symbol non
-terminal أو terminal ممكن يكون له attribute أو
أكثر على حسب طبيعة الـ translator أو اللي احنا طلبناه
من هذا السؤال وأخذنا مثال يمكن بسيط أن أنا عندي
infix كيف أحسب له الـ value عند الـ root وشوفنا هذا
المثال مرة لفترة في المقابل في أنا عندي translation
scheme لسه ما أخذتهوش وحابده في تفاصيله بعدين قلنا
بتكون الـ rules موجودة وين؟ في نفس الـ grammar يعني
بيكون الـ grammar عمال قاعد بيشتغل بيتحقق أن الـ
tokens مكتوبين بشكل مطابق للـ syntax تبع الـ
language وفي نفس التوقيت بيكون في fragments وفي
مقاطع خاصة بالـ semantic قاعدة بتعمل عملية التحويل
المطلوبة أو عملية الحسبة المطلوبة وهذا إن شاء الله
هنأخده احنا لاحقاً تمام؟ الآن كمان مرة بنحب نؤكد أنه
ما تفكريش أن الـ attribute هو بس مجرد value مش شرط
ممكن يكون type ممكن يكون string ممكن يكون location
ممكن يكون scope كل شيء يحتمل أن يكون هذا attribute
وبرضه ما نفكرش أن الـ semantic rule الواحد أنه بس
عبارة عن حسبة زائد أو ناقص لأ ممكن يكون if
condition ممكن يكون مقارنة ممكن يكون مقطع من code
فهذا كله وارد لكن احنا لسه بنتكلم في الأساسيات
يعني فعشانك أخذنا مثال بسيط و simple لكن لازم تظلي
أنتِ متذكرة أنه لأ وارد جداً يكون معقد شوية وارد جداً
يكون في تير حسابات في منطقة الـ semantic rules لأنه
في النهاية احنا بنتكلم عن الـ translator مش عن حساب
value الـ translator يعني بيحول من شكل إلى شكل وبالتالي
لازم يكون في عندك semantic rules تستطيع التحويل
عشانك نقدرش نقول أنه بس هي values وخلاص وهذا إن
شاء الله هيبين معانا تباعاً خلال الأمثلة اللي جاية
طبعاً اليوم بدنا نستكمل في الـ syntax directed
definition وناخد مثال ثاني والمثال الثاني تحديدا
بتكلم على الـ postfix الآن الـ postfix أخذتو قبل هيك
في الـ data structure إيش يعني الـ postfix؟ هو اللي
يكون الـ operator بعد الـ operand شو استفدت منه؟ ليش
عملوليها؟ ليش وجعوا راسي في حاجة اسمها postfix و
علمونيها؟ إيش بدي منه؟ أسهل الـ computer من الـ
operator من ما يفرق الـ issue اللي يكون في المصلحة
للمستخدم ليش طبعاً سهل؟
طيب، بس ليش أسهل؟ ماشي الأوليات مرتبة، يعني إيش هي
بتقول؟ بتقول إن الـ postfix أسهل في عملية الـ
computation لأنه بتشوف الأرقام في الأول، بعدين
بتيجي العملية، إيش رأيكم في الكلام هذا؟ طيب الكلام
اللي بيحكوه مظبوط كلام صح بس خلّاني أحاول نفهمه
بشكل دقيق عشان نستوعب إيش سبب وجود الـ postfix
الآن لو أنا كاتب اثنين زائد ثلاثة و لسه بدي أكمل
وبدي أكمل، الآن هذه الصيغة بنسميها احنا infix
الصيغة اللي تعلمناها احنا في الرياضيات العادية
اللي هي الأرقام وبينهم زائد ناقص ضرب قسمة هذه
بنسميها صيغة الـ infix تمام؟ الآن تخيل الـ computer
أو الـ system بيعمل computation أو حسبة لهذه القيمة
فسؤالي هل بمجرد ما شاف الاثنين بعدين شاف الزائد
بعدين شاف الثلاثة بيقدر على طول يعمل الحسبة ويقول
اثنين زائد ثلاثة خمسة؟ ليش لا؟ لأنه ممكن ببساطة
يكون برا الثلاثة ضرب صح؟ ليش؟ لأنه بتصير في الحالة
هذه الثلاثة غلط تنجمع مع الاثنين عشان الأولويات
صح؟ لازم الثلاثة تنضرب مع شيء معين وبعدين يرجع مع
الاثنين يجمع يعني ما يقدرش يعمل الـ process طيب اتخيلي
بعد الضرب في افتح قوس واحد شاف فترة قوس من الواحد
وشاف زائد بيقدر يعمل حسبة؟ لأ لأ بيقدرش فالمشكلة
أنه بيضطر عشان يعمل الحسبة بشكل سليم يمشي ويمشي
ويمشي ويمشي ويدور قدام لما يعرف مين الأرقام اللي
بدها ولا مين الـ operands اللي بدها عشان يقدر
يعمل عملية الحسبة تبعته صح ولا لأ؟ وهذا تخيل أيه؟
هياخد وقت في الـ computation ومش efficient طب شو
الحل؟ قالوا احنا بنقدر نعمل حاجة اسمها postfix هذه
الـ Postfix بتخلي العملية الحسابية تتنفذ بغاية
السرعة طب شو بقصد فيها؟ و كيف صارت بغاية السرعة؟ و
طالع نفس النتيجة؟ تعالى أديكي مثال على الـ Postfix
الأقل عما نقول 2 زائد 3 ونسكت بس عشان أفهمك إيش
الـ Postfix الـ Postfix هو عبارة عن إيه؟ 2 ثلاثة
زائد قال بالنسبة للـ Postfix الحلو فيه أن
الـ operands بيبينوا قبل الـ operator بمعنى أنه بمجرد
ما يشوف زائد automatic بنفذ العملية بياخد آخر
رقمين شافهم في الطريق ثلاثة أو اثنين أربعة من عملية
الزائد يعني مش هيشوف الـ operator إلا يكون شاف الـ
operands اللي خاصين بهذا الـ operator وبالتالي
العملية الحسابية بتصير سريعة جداً يعني مثلاً لو أنا
عندي تسعة زائد خمسة زائد اثنين هذه الـ postfix
بتاعتها مثلاً بعدين بنشوف كيف زائد اثنين زائد الآن
كيف أعمل .. هذا الـ postfix لهذه لكن الآن كيف
الـ تنفيذ هيتم؟ جالك بنروح على الـ stack مثلاً و الـ
stack سريع جداً في الـ تنفيذ هنا بنعمل pushing للـ
stack تسعة بعدين خمسة لاجى زائد إيش بسحب التسعة
والخمسة و بيعمل على طول بينهم الزائد بنفذ ما نستناش
أنه بيدي عرف حدّن فبشيل على طول هاي من الـ stack زي
هيك كان فيه تسعة كان فيه خمسة لاجى زائد فهم أنه هذه
على آخر اثنين operands موجودين في الـ stack على الـ
top two فبيروح بشيلهم التسعة والخمسة وبيعمل عملية
مين؟ الزائد إيش بيطلع النتيجة؟ أربعة عشر وبرجع
بيحط هنا إيش؟ أربعة عشر الآن لاجى رقم إيش بيسوي؟
بيضيفه لاجى زائد بيرجع بياخد آخر رقمين اثنين أربعة
عشر واثنين إيش بيحط مكانهم؟ ستة عشر طيب إيش أفرجت
الطريقة هاي عن الطريقة اللي قبل شوية؟ فرق كبير أنه
دائماً وأبداً أول ما بيشوف الـ operator بيكون عارف
أن اللي بيشتغل عليهم العملية موجودين آخر اثنين
بياخدهم بيعمل حسبة وبيخلص ما نستناش ما ندور طب هنا
للأسف هنا أيه شاف الزائد ما بيقدرش ينفذ وحتى لما شاف
الثلاثة ما بيقدرش ينفذ فالـ infix فيها مشكلة ما بيقدرش
يعمل computation بسرعة فعشانكش بقوله بقول لو حولنا
الـ infix لـ postfix أصبحنا الآن نستطيع تنفيذ
العملية بسرعة إنه خلاص صلة واضحة كل ما بلاقي إشارة
بيرجع على آخر اثنين الـ operands شافهم بنفذ الإشارة
هذه عليهم وبيبقى الـ systematic ماشي بهذه الطريقة
و الجواب هيطلع بالظبط نفس الجواب بتاعة مين؟ بتاعة
الـ infix اللي أنا حولته مش بس هيك حتى من ناحية
برمجية قال لي بقدر أستعين بحاجة اسمها stack يعني
حتى الـ postfix في صورته أنه حط الخمسة حط الاثنين
حط الـ Z بياخدهم الاثنين وبيعمل عملية أسباب وبعدين
بيعمل pushing يعني حتى الـ stack كتكنيك سريع جداً في
الـ تنفيذ يعني حتى من ناحية تنفيذ مش بس من ناحية فكرة
أنه دائماً الزائد موجود أو الناقص موجود أو الـ
operands موجودة لأ كمان طريقة التنفيذ صارت سريعة
جداً باستخدام الـ stack عشان أيه كان لازم عليكم
تتعلموا حاجة اسمها الـ postfix واضحة ليش الـ postfix
موجود عشان يسهل عمليات الحسابية الموجودة في الـ
systems بطريقة أسرع و efficient باختصار يعني طيب
الآن السؤال كيف بنحسب الـ postfix للرقم للـ infix كيف
بنحسبه تعال نشوف طبعاً أنتم أخذتو المفروض
بتعرفوا كيف تحسبوا postfix لكن من باب المراجعة إيش
بيقول if E is a variable or constant يعني إذا الـ E
هذه خمسة سبعة سبعين X شوفتي أو constant معين مالها
إيش الـ postfix تبعها؟ إيش الـ postfix تبعها؟ إيش
رأيكم؟ إيش الـ postfix للخمسة؟ نفسها إيش الـ
postfix لـ Y؟ Y إذا constant طبعاً مش expression
عشانك هو بشكل واضح بيقول إذا
الـ E variable أو constant خلاص الـ postfix تبعها
هو نفسه is E itself هي نفسها طيب إذا الـ E كانت مش
constant كانت expression ناخد صيغة E1 operator E2
يعني خمسة زائد اثنين مثلاً أو أي expression زائد أو
ضرب أو ناقص أو قسمة المهم operator E2 في الحالة دي
إيش الـ postfix اللي هون قال لك الـ postfix الحالة هاي
هي الـ postfix بتاع الأول بتلزق وراها الـ boss fix
بتبعي التاني و بتحطي وراها الـ operator يعني لما
أنا أقول خمسة زائد ستة شو الـ boss fix تبعها؟ ال
boss fix تبع خمسة، خمسة الـ boss fix تبع ستة، ستة و
الزائد تنحط ورا الـ operator، باختصار طيب لو كانت
زي هيك مثلا خمسة زائد اثنين ناقص واحد ما هو الـ boss
fix لهذه؟ ستقولني في الأول الـ boss fix لهذه التي
هي 5، 2 زائد الـ boss fix لهذه التي هي 1، و بعدها نضع
الـ minus، هذا باختصار طيب، آخر قانون ما يقول؟ يقول
طيب، لو الـ E كانت عبارة عن بين bossين E1 مثلا، ما
هو الـ boss fix لهذه؟ هو نفسه الـ boss fix لـ E1 يعني
بمعنى لو كنا بنقول يا بنات خمسة زائد اثنين شو ال
boss fix بتاعها؟ خمسة اثنين زائد طيب خمسة زائد اثنين
بين قوسين شو الـ boss fix بتاعها؟ خمسة اثنين زائد
يعني بس بتوصلي لمعلومة أن القوسين مش هيأثره في ال
boss fix يعني أنا حاطط الـ E بين قوسين ولا بدون قوسين
الـ boss fix في الحالتين واحد هاي باختصار الـ boss
fix كيف بنحصلوا واضحة كيف الـ postfix بنحصل؟ طيب تعالي
نشوف المثال اللي هو ذاكرو في
الـ example دعونا نمسح اللوح شوية شوفوا
يا بنادر إيش الـ postfix لـ 9 ناقص 5 زائد 2 إيش ال
postfix لهذه؟
هتقولي هذا تبريها وحدة واحدة صح؟ الوحدة الواحدة
زائد الاثنين، إيش اللي هي اللي بتجاوبها؟ هذه
الوحدة الواحدة، الـ postfix تبعها، بعدين اثنين،
بعدين زائد، صح؟ طيب إيش الوحدة الواحدة و هذه ال
postfix تبعها؟ شايفاه؟ تسعة خمسة ناقص اثنين زائد
يعني بدكم تنتبهوا لشغلة مهمة لما يكون كتب لي زي
هيك تسعة ماينوس خمسة زائد اثنين سهليها على حالك
كيف تسهليها على حالك اعتبري هاي L عشان أسهل على
حالك كأنه السؤال صار L زائد اثنين دائما خدي الكتلة
الواحدة في رمز و بعدين بتحليه الآن شو حل هاي ال
boss fix بقى هأقول لك الـ bar الـ boss fix لـ L الـ Voice
Fix على 2 زائد الآن الشطارة هذه .. شو الـ Voice Fix
تبعها؟ خلاص تسعة خمسة minus و تنزل و تكملين لـ اثنين
زائد، هاي باختصار شوفتي كيف؟ تمام؟ طيب إيش رأيك في
هاي؟ هذا تغير طبعا دي دي بارك تسعة ناقص خمسة كده
يا شبنات؟ أربعة زي اثنين ستة مظبوط أو لا؟ طبعا لو
يجب أنا أحلها بالـ stack كيف تحلها بالـ stack؟ هيحط
التسعة، هيحط الخمسة، هيلاقي الـ minus، هيرجع التسعة
والخمسة، يتراحوا مع بعض، بيطلع أربعة، بعدين هيحط
الاثنين، بعدين يلاقي الزائد، فـ اثنين زائد أربعة،
ستة، فالجواب ستة، هيطلع نفس الجواب طب تعالي شوف
الصورة هي هذه نفس الجواب لأ هذه خمسة زائد اثنين
بدها تم بيصير سبعة بنقطع تسعة في الجواب هذه مختلف
فأكيد الـ boss fixed هذا بقى هذه كمان ماله مختلف كيف
نجيب الـ boss fixed لتسعة ناقص خمسة اثنين هتقولي لي
اعتبر هي الـ هتقولي لي تسعة الناقص طب الـ E عبارة عن
إيش؟ خمسة اثنين زائد والناقص بتنزل زي ما هي و
التسعة بتنزل زي ما هي شايفة شكل الـ boss fix بقى
هذه ماله؟ اتغير طب كيف بتنحسب؟ تعالي كيف تنحسب
هتنحط التسعة في الـ stack هتنحط الخمسة في الـ stack
هتنحط الاثنين في الـ stack لجة زائد هيسحب مين؟
الاثنين و الخمسة و يعمل بينهم جمع فحط بدل الاثنين
و الخمسة سبعة لجة minus هيسحب التسعة و يطرح منها
السبعة فبيجي يطلع الجواب اثنين نفس الجواب اللي كان
هنا لكن لاحظة أن الـ boss في X ماله مختلف في
الشكل يعني أنت بدك تتبعي لأن أي تغيير في الأقواس أي
تغيير في الحسبة في الـ infix هينعكس على الـ postfix
فتسعة ناقص خمسة بين قوسين اللي هي قبل شوية زائد
اثنين تختلف تماما في الحسبة عن تسعة ناقص الخمسة
زائد اثنين بين قوسين عشان إيه طبيعي جدا الـ postfix
تبع هذه و الـ postfix تبع هذه يكون شكلهم مختلفين أنت
في النهاية ما يعنيك الشكل الجيد ما يعنيك القانون كيف
أجيب الـ boss fix و خلصنا لحاله هيطلع مختلف إذا
الصيغة مختلفة و الحسبة مختلفة تمام؟ في أي أسئلة
لحد هنا كيف نحسب الـ boss fix؟
احنا لحتى اللحظة بنتعامل مع الأرقام اللي من خانة
واحدة واحدة هتقولي إيش يعرفني تسعة خمسة اثنين زائد
أنه خمسة وتسعين وغالبا مش هيك ما تقولي الآن بدأ
أفهمك شغلة مهمة احنا الأساس الأرقام بتجيني من ال
lexical الـ tokens يعني لو كنا كاتبين خمسة وتسعين
كان الأصل الـ lexical يقولي خد لجة token number فخلاص
يكون واحدة واحدة جايين الـ number فلما يكون ال
lexical جاي اللي جاي لك number جاي لك operator جاي لك
number two خلاص النتيجة number one ورا number two
ورا الـ operator الآن بكتب number one الـ attribute
تبعه لو بدي فدائما ما أجدنيش الرقم مفرج الـ lexical
بديه رياه كله كتلة واحدة هاي الـ attributes تبعه
واضحة؟ فما عندي مشكلة لو كان الرقم من خانتين ولا من
ثلاثة ولا من خمسة ولا من واحد في الـ postfix ما عندي
مشكلة لأنه في الآخر كتلة واحدة هذا الرقم لكن لحد
الآن احنا مثالنا كله على إيش؟ على خانة واحدة لكن
أكيد لما آخذ الـ lexical بتفاصيل أكثر و كيف بيشتغل
هأصير أكبر الشغل تبعي و أقول لأ بدي أعتبر الأرقام
مش من خانة من الخانات، هذا هنشوفه بعدين إن شاء الله
طيب، لحد هنا واضحة الأمور بتاعة الـ postfix؟ في أي
مشاكل في الـ postfix؟
الآن إيش رأيكم في هذا المثال consider the postfix
expression تسعة خمسة اثنين زائد ناقص ثلاثة ضرب كيف
الحسب أنا هذا التن؟
آه إيش اللي بيصير التسعة هتروح في الـ stack الخمسة
هتروح في الـ stack وراها، الاثنين وراها لجة، هيك
هالين علشان الناس تستوعب تسعة، خمسة، اثنين، لجة
زائد على طول هيسحب آخر two operands اللي هم
الاثنين والخمسة يجمع ويحط مكانهم شو؟ سبعة، هاي
يرجع مكانهم سبعة بعدين إيش لجة لجة ناقص صح هياخد
هدول الاثنين ويتراحوا تسعة ناقص سبعة جد إيش اثنين بعدين
لجة إيش ثلاثة بعدين لجة إيش ضرب هيقول اثنين في
ثلاثة ستة ويطلع نفس الصيغة بتاعة الـ infix طبعا هو
محول ومخلص يعني بس بورجيك كيف كان ممكن يحسب على
السريع بالـ stack تبعه طيب الآن تعالوا نشوف كمان
شغلة وهذه هنتكلم فيها كمان شوية synthesize
attributes بس
قبل بدي أكد على المعلومة التالية اللي هي الـ syntax
زي الـ definition لما نتكلم عنه إيش ماله with each
grammar symbol إيش بنقصه في الـ grammar symbol
production؟ يا terminal يا non-terminal في ال
production .. في الـ production ليش مكون؟ مش محرف
و لطيف مش عارف إيش؟ في شغلات تمثل .. non-terminal
في شغلات تمثل terminals؟ مصروف ولا تمام؟ كل
grammar symbol ممكن يكون اللي هو إيش؟ attributes
واحد ولا واحد مجموعة إلى آخرين بعدين إيش بيقول؟
وهي المهمة with each production لكل production في
الـ grammar شو؟ a set of semantic rules for
computing the values of the attributes of the
symbols appearing in the production إيش مقصود أن
لكل production في جهة الـ grammar هيجابله مجموعة من
الـ semantic rules ممكن يكون ولا قانون ممكن يكون
قانون واحد ممكن يكون مجموعة من القوانين لنفس ال
production لا تنسيش احنا قولنا المرة اللي فاتت
syntax definition عبارة عن إيش؟ الـ productions، ال
grammar، والباقي كل واحدة rules ممكن يكون ولا
rules، ممكن يكون rules واحدة، ممكن يكون أكثر، على
حسب طبيعة الـ translation اللي كان عملها، احنا في
مثال اللي أخدناه المرة اللي فاتت كان تقريبا كل
production إيش؟ كل واحدة، لكن هل هذا ضروري بس يكون
rules واحدة؟ لأ، فهذه اللقاءات اللي عامة بتتبهيها،
كان ممكن تكون أكثر من rules بتنسيش و ممكن ما يكونش و
في قواعد عجباله و مش يكونوا ليه attribute واحد
ممكن يكونوش ورا attribute و في كل attribute أو
أكثر اللي بيضبط الموضوع أنه لازم في الآخر الـ rules
هذه تقوم بـ task معينة فأنا بحط اللي مناسب للوصول
لهذا الـ task
a set of attributes إيش مقصود فيها يعني لما أكون
هناكتب المرة اللي فاتت expression بيعطيني
expression زائد term هذه كلمة expression بتسميها
grammar symbol فهذا الـ grammar symbol هو non term
في الحالة هذه ممكن يكون و يقول لك attribute ممكن
يكون و يقول لك attribute ممكن يكون مجموعة set of
attributes بعدين كمان شوية بتكلم أن هذا ال
production الآن ما حكيش هذا ال grammar symbol اللي
داخل ال production لكن ال production الكامل هذا
ممكن يكونوا يتبقى مشروع rules واحد في أكثر بصيغة
كيف بيكونوا مشروع رولز؟ كمان شوية حنشوف في ده أجل
ممكن يكونوا مشروع رولز، في كتير أوقات أخدهم عالمية،
أن مافي داعي أعمل أي حاجة في هذا ال production،
ممكن تبقى مش حاجة، حسب تمامًا مرة، حسب طبيعة السؤال،
حسب طريقة ال translation اللي أنا بدي إياها، تمام؟
يعني مش بالضرورة الفكرة هي كمان مرة، مش بالضرورة
أن لازم كل production يحط ال attribute و شغله، مش لازم حسب
حاجتي لـ Translation بيلزم ولا ما بيلزمش كمان مرة
مش بالضرورة أحط وقت attribute و الله كتير ولا
كتير ولا واحد كمان مرة حسب الحاجة حسب الحاجة يعني
أنا ما رفعتش من ال مثال بحق المثال كان ما رفعتش من ال
vector و من ال index بسبب قيمة عند ال root اليوم
هاخد مثال تاني كمان شوية حاجة دلوقتي كمان شوية
دلوقتي بس خلّيني أخد النقطة اللي قبلها طيب الآن
برضه في حاجة نسميها Synthesized Attribute في حاجة
نسميها Synthesized Attribute إيش بنخصص الـ
Synthesized Attribute؟ إذا كان هذا الـ Attribute
علشان أحله باعتمد فقط على نفسه أو الأبناء بنسميه
Synthesized يعني بمعنى لو أنا كاتب مثلًا Exhibition
و جاي الـ Exhibition عبارة عن Exhibition زائد term
مثلًا للمرة المفروضة اللي حكيناها الآن أنا هل بقدر
أحل هذه إذا بدي أحسب ال value بدون معرفة قيمة ال T
العتادية و ال T العتادية طبعًا لأ في مثلنا المرة اللي
فاتت يعني لازم أعرف value هاي ولازم أعرف value
هاي اللي هم الأبناء عشان أقدر أعرف value من الأب
في الحالة هذه هذي بنسميه synthesized attribute هذا
مصطلح يعني لما جيت ما نقول synthesize attribute
معناه عشان نعرف قيمته لازم نكون بمعنى آخر زرنا
الأبناء في الأول ليش؟ لأنه لما بحل الأبناء ال
attributes تبعتها بعرف ال attribute تبع الأب طبعًا
هذا معناه أن ممكن فيكون في أمثلة أن يكون ال
attribute يعتمد على ناس إيش برا مش أولاده هذا في
تفصيل مش الآن هننجيله بعدين قدام في chapter مستقل
قدام احنا قاعدين بناخد ال basics الحاجات ال simple
عشان نفهم الفكرة و ال idea لكن أكيد هيجينا لكل
chapter للمشاكل للحاجات اللي بدنا ناخد بالنا منها
قدامها ده فلاص لكن الآن مؤقتًا بنقول أن هذا ال
attribute إذا اعتمد على أبناءه فقط وعلى نفسه
بنسميه synthesizer إذا اعتمد على الأبناء أو نفسه
أو حدا برا يعني أخوه ال parent تبعه بيطلّع اسمه
synthesizer لازم أتعامل معاه بطريقة شو مختلفة شوية
واضحة طيب أنا ليش يا بنات بحكي هذا الكلام هنا لأن
أنا المرة اللي فاتت احنا عملنا tree في الأول لما
أخدنا مثال ال infix وقعدنا نحل ال values عليه
تتذكر إيش سوينا؟ سوينا tree في الأول صح؟ وبعد ما
سوينا لي tree إيش عملنا؟ بعد ما سوينا لي tree إيش
سوينا؟ قعدنا نحل عليها ال semantic rules مظبوط ولا
لأ؟ طب أنا كيف قعدت أحل المرة اللي فاتت؟ كيف قعدت
أحل ال semantic rules؟ مش قعدت أطلع أشوف الأبناء
في الأول و أخلص من الأبناء وبعدين أحلهم عشان أقدر
أ... بالظبط صح ولا لأ وطالما أنا قلت في عندي tree
معناه صار في عندي حاجة مصطلح اسمها visiting
traversal لل nodes مش أخذتو ال visiting
traversal؟ إيش بقصد فيها؟ يعني كيف أنا بزور ال
nodes صح ولا لأ؟ ليش هذي بتفرج معي؟ ليش بتفرج معي؟
بتفرج معايا عشان أقدر أحل يعني تخيلي ال Synthesize
Attribute كيف يُنحل؟ لازم أنت تقوليلي لازم أزور
الأبناء في الأول عشان أقدر أحل ال Synthesize
Attribute شوفتي كيف؟ طب الآن أنا على كيفي بدأت قعد
أفكر كيف أزور الأبناء؟ أنا تعلمت في ال Data
Structure أكثر من طريقة للزيارات ال Nodes ومتذكرك
من ضمنها كان في حاجة اسمها Bottom Up Traversal إيش
كان بقصد فيها دي Bottom Up؟ وكيف علموها وقيمتها؟
بتزوروا من تحت لفوق ال Leaves وتبدؤوا إيش؟ تطلعوا
في الشجرة لعين ما توصلوا لل Node فهذه الطريقة اللي
زمان بتاعت ال bottom-up للزيارات ليش بتلزمني عشان
أحل ال synthesizer لأني بأطمن أني بشوف ال children
في الأول بعدين بشوف ال parent فبأطمن أن لو عملت
هذه الزيارات بحل كل ال note تبعتي بناء عن ال rules
اللي كانت المرة اللي فاتت طب مش بس ال depth
traversal مش بس ال bottom-up بنفع كمان في حاجة
أخذتها اسمها ال depth traversal إيش ال depth ال
traversal؟ بيضل طول ما فيه depth ينزل ينزل ينزل ينزل
ينزل ينزل لما يوصل لآخر شي تحت وبيبدأ من الشمال
لليمين يمشي ويطلع برضه بطريقة ال depth ال traversal
أنا بضمن أني أزور الأولاد قبل ال parent وبهيك أنا
بضمن أني بقدر أطبق ال rules اللي كتبناها المرة
اللي فاتت بتاعة ال semantic على letter E وأحلها
شوفتوا يعني كله مقترن في بعضه يعني لما هو اليوم
بي عرفني مصطلح synthesized إيش العبرة؟ عشان لما تأخذ
أنت معلومة إذا والله كل ال attributes اللي بدهم
ينحل من نوع synthesized معناه خلاص بجيب ال depth
traversal أو ال bottom up traversal وبضمن أني حليت
الشجرة من خلال ال semantic rules فشايفة أنا قاعد
بستفيد من علم مين؟ ال data structure الموجود مسبقًا
مش أنا لسه توّ حطيت ال data structure مش من عندي
جبتها موجودة وجاهزة bottom-up موجودة وجاهزة
visiting ال notes موجودة وجاهزة بس الشطارة إيش
بدك تسوي عند كل زيارة note بتصير يعادش طبق ال
rules بتاعتك بتاعة ال semantic على كل الأحوال أنا
كمان شوية أعطي مثال كامل غير المثال اللي أخذناه
المرة اللي فاتت وهتكلم على كل الأمور هذه كمان مرة
بس لحظة أنا لما بتكلم الآن بفترض أن أنت دارسة
محاضرتك الأخيرة وفاهما كويس فشايفة أنا قاعد
بحكي كأنه أنت عارف ال rules والمثال وإيش بسوي
فأنا هيك بشتغل فضروري دائمًا تيجي محاضرتك تطلع على
المحاضرة السابقة عشان نقدر نمشي بدون مشاكل واضح؟
على كل حال قلب مش مشكلة هعطيـكـم أمثلة كاملة ونتكلم
عن كل الكلام هذا اللي قلناه قبل شوية طيب طيب الآن
السؤال إيش بيقول أو قبل السؤال بدي أنا أتأكد أن
انتوا عارفين في ال postfix وبدي أعطيـكـم سؤال
كالتالي واحد زائد اثنين ضرب ثلاثة قسمة أربعة ناقص
خمسة زائد ستة في سبعة إيش رأيكوا بقى ده السؤال؟ كويس
آه كويس الآن عارفين إيش بيتطلب منكم؟ تمام؟ بدي...
لأ لسه ما بديش tree بدي واحدة تطلع تجيب لي ال postfix
لهذه hand مين؟ تطلع تحللي ال postfix
تجيب لي إياها hand اه
تجربي... جربي... انتوا تقبلتوا جربه... مش مشكلة...
المهم أنا بتأكد أن انتوا قادرين تطلعوا ال postfix
ولا لأ... تمام... جرب... وجربي على الدفتر... في
الآخر برضه بتقيميلي شغلها... تقوليلي هي فعلا صح
ولا غلط... تمام... حاولوا تفكروا وتجربوا و
تخربشوا على الدفتر... كيف نحسب ال postfix... أنت
جربي... الآن حلي... إذا استسلمت... الآن أنت بدك
تبدي بعرفش هذا الآن شغلك أنت بدك تطلعي لنا ال
postfix لل notation اللي فوق آه بتفكري جربي
إذا استسلمتي بتشوفي حد تاني مش مشكلة تحاولي يعني
السلام عليكم ورحمة الله وبركاته
خلصتي؟ استريحـي إيش رأيكوا في الحل تبعها؟ صح ولا
غلط؟
غلط؟ في الأول صح ولا غلط؟ غلط؟ مين عند الحل الصح
تطلع تحله؟ حل بقعرفش حل مختلف اطلع حل حل مختلف يلا
بدي حلين قبل ما احنا نحله بدي كمان حلين عليه ماشي
يلا خذي ماشي يلا انسخـي حلك مباشرة يلا بدنا كمان
حل تالت وبعدين نشوف أيهم الصح just
fix و غرف الأولوية ال postfix اه بيكون كله ما خد
باله منه الأولويات وغير الأولويات كل شيء والأقواس
كل حاجة يكون ما خد باله من ال postfix طيب
استريح، الآن حالها صح ولا غلط؟ برضه غلط؟ طيب مين
بيضيف حل آخر؟ مين بيضيف حل آخر؟ اضيف حل آخر؟ يلا
اضيف حل آخر اضيفها الأخرى احنا لسه مش عارفين يمكن
يكون فيهم صح يمكن يكون فيهم غلط لكن احنا بدنا نشوف
إيش المحاولات اللي عندكم عشان نبدأ نحل وأنا معنى
أن أنت تجربي بإيدك لأن كمان شوية هأعلمك طريقة سهلة
أنك تحسبي ال postfix وتكوني عارفة أن أنت بتحلي
صح بدون مشاكل بس خليني في الأول تفكري أنت وتجربي
تمام طيب الآن زي ما أنتم شايفين في على اللوح تقريبا
ثلاث حلول، الثلاث حلول ما لهم مختلفين عن بعض، تمام؟
تعالوا احنا نشوف كيف بدنا نحل هذا السؤال وبعدين
نشوف مين فيهم الحل الصح في الأول، كم واحدة مع الحل
هذا؟ ثلاثة؟ أربعة؟ وكم واحدة مع الحل هذا؟ لحالك؟
كم واحدة مع الحل هذا؟ برضه لحالك؟ طيب الحين بنشوف
نفسنا والباقيين مع مين؟ الآن
تعال نشوف كيف نحل أنا قلت قبل شوية الـ trick
عشان أستطيع أن أحل أي سؤال بوست فيكس، الشيء اللي
بيقدر يتجمع مع بعضه حطيه رمز ورايح، حراسك منه يعني
الفكرة أنك بدك تحاولي هذه الصيغة كلها الكبيرة
تخليها مالها أصغر ما يمكن، الآن لو جيت أطلع عليها
بيكون واضح وضوح الشمس بالنسبة لي أن هدول كلهم هذا
الصندوق، بدي أخلص هذا كله مع بعض لأنه ضرب وقسمة هذا
كله كتلة واحدة صح؟ فكأنه السؤال واحد زي something
زي something آخر فكأنه صار السؤال، اعتبري هذه مؤقتا
اعتبريها X واعتبري هذه Y، خلاص فكأنه صار السؤال ده
بس شوي عشان نستغل اللوح، تمام؟ كأنه صار السؤال واحد
زائد X زائد Y، هاي أول خطوة، الـ X طبعا لها الفكة تبع
التالي هي هذه اللي هي كتلة واحدة، والـ Y هي هاي وال
واحد مظلوطة ولا لأ؟ طيب الآن واحد زائد X، هاي زائد
وكيف نعملها؟ مش هي بالـ tips من الشمال لليمين مش
بيخلص هاي بعدين بيعمل زائد Y، وأخذناها قبل شوية
فأنت حتقوليلي ببساطة واحد X bar .. إيش بقصده X bar؟
أن الـ boss fixed فيك سامعين؟ أيوة زائد .. بعدين إيش هنحط؟
Y bar .. بعدين إيش؟ زائد .. مش هيك اتفاقنا أن هاي
زائد Y bar بعدين زائد تبعه؟ وهي مش هي 1 X bar زائد
طب ليش بقصد في الـ X bar يا بنات؟ الـ Y bar بقصد
فيها الـ boss fixed على X مش القانون قبل شوية، هاي
بذاكر في القانون لما كنا E1 up E2 كيف كان حالها؟
خدي E1 لازجي وراها E2 أن هو الـ boss fixed لازجي
وراها الـ up وهالي اللي أنا سويته، أنت تعتبر هذه L L
زائد Y عبارة عن إيش؟ عبارة عن L Y bar زائد، طب الـ L
نفسها عبارة عن إيش؟ one X bar زائد يعني أنت حتى
هذه الجدران اللي كنتوا تسوها تعتبر هذا L زائد Y و
تشتغل بس كنا مش مستاهلة سهلة أخذناها قبل شوية واحد
X زائد طبعا X bar تمام وبعدين الـ Y bar والزائد
الأخيرة، تمام لحد هنا؟ طيب الـ Y شكلها سهل نخلص منها
إيش الـ boss fixed تاع الـ Y؟ ستة سبعة ضرب فهتقولي
خلاص ستة سبعة ضرب، طبعا هتكمل كل شيء زي ما هو هترجع
الزائد هنا وهترجع الزائد هنا وهنا الـ X bar وهنا
الواحد شايفة؟ فأنت بتحطيها في مكانها مش بتروحي
تغيري مكانها، طيب الآن مين ضال علينا عشان نخلص؟
اعتبري سؤال جديد، اعتبره كإن واحد بيقولك هات الـ
boss fixed لـ 2 ضرب 3 على z مش هدول كتلة واحدة فكان
السؤال، اعتبري كإن السؤال صار 2 ضرب 3 على z مثلا
الآن، هدول إيش حولتها؟
إثنين ثلاثة ضرب Z bar، ليش بعمل Z bar؟ عشان أقول أن
الـ boss fixed الـ Z الـ X صح ولا لأ؟ طيب الـ Z bar
عبارة عن إيش؟ أربعة خمسة ناقص يعني إيش بتصير كلها
إثنين ثلاثة ضرب بعدين أربعة خمسة ناقص تقسيم هذه
كلها عادة وأنت تاخديها تحطيها
فبيصير الـ boss fix النهائي واحد اثنين ثلاثة ضرب
أربعة خمسة ناقص حتى لأن هذا اللي ماشي صح، تجهز قسمة
بعدين زائد ستة سبعة ضرب زائد، ممتازة دكتور تقول
عشان أعمل مثلا الـ blocker، السن يشتمل مش على كيفك
أنت بتعمل الـ block على أي أساس؟ على أساس الرياضيات
الصح، عساس الأولويات الصح، عساس الـ left associative
الصح، مش على كيفك، على أساس الرياضيات، كيف مصمم وكيف
معمولة، الآن الإثنين والثلاثة والجسمة والجثين هدول
كلهم لو في المدرسة لازم تخلص من هدول وتضيفي واحد
وتضيفي ستة في سبعة، هيك في المدرسة، هيك في المدارس
فأنا ما أقدرش أعمل على كيفِي، مش الدرب .. مش الدرب و
القسمة أولوية أعلى والأقواس أعلى منهم، فالآن لو
سألتك انسى الـ postfix، أنا لو قلت لك سؤال مدرسة هادي
إيش تساوي؟ مشكلة، ما عرفتيش، عشان تحل الصح لازم تكوني
فاهمة الأولويات وفاهمة الـ left associative، لحاجة
لازم تكوني فاهمة، لازم تكوني عارفة أنه حضروا
الإثنين في الثلاثة وحقسم على الأربعة ناقص واحد
تمام وبعدين هجمع لهم الإثنين وأربعين وهجمع لهم
الواحد، لازم تكوني عارفة أنه من الشمال لليمين بتتم
أساسا كمان يعني، بيجمع الواحد وبعدين بيجمع الإثنين
وأربعين، واضحة؟ فإذا أنت فاهمة هذا صح خلاص بطلع الـ
boss fix زي ما احنا عملنا، أنا ريحتك، قلت لك دائما
في الـ boss fix حاول الصيغة الطويلة الكبيرة هذه
تقطعها لكتل مع بعض، هدول مع بعض، هدول مع بعض، هدول
مع بعض، هدول مع بعض، هدول مع بعض، هدول مع
هدول مع بعض، هدول مع بعض، هدول مع بعض، هدول مع
بعض، هدول مع بعض، هدول مع بعض، هدول مع بعض، هدول
مع بعض، هدول مع بعض، هدول مع بعض، هدول مع بعض،
هدول مع بعض، هدول مع بعض، هدول مع بعض، هدول مع بع
لحد هنا في حد مش فاهم كيف نحسب الـ postfix أو أهمية
الـ postfix أو ليش احنا عملنا الـ postfix واضحة؟ طيب
تعالوا الآن نرجع للـ compiler عاد وخليني الآن أنا
أنصح، هذا كله الآن بدنا
نرجع نسأل سؤال مهم وبنفكر فيه شوية
السؤال بيقول، ركزي، السؤال بيقول، اعملي translator
بيحول من infix لـ postfix، بس هاي السؤال، سمعتوا السؤال
كمان مرة، اعملي translator بيحول من infix لـ postfix
إيش
رأيكم؟ كيف السؤال؟ يعني يصير automatic لحاله
التحويل اللي تطلع بوصفكس بدون موجه راسي، automatic
الكمبيوتر طلع ليه بوصفكس، كيف نسوي؟ السؤال سهل ولا
صحيح؟ هو شوفوا عشان تكونوا في الصورة للوهلة الأولى
بالفعل بتتخيلوا السؤال صعب كتير، ليش؟ اف .. إيش يتحول
من infix لـ postfix كله على بعض وهيك لما تفكر فيه
مرة واحدة بيبين أنه صعب واحنا قلنا قبل هيك دائما
إذا قدرت تجسمي الـ problem لـ sub problems بتصير
الأمور إليك أسهل، فهذا أول خطوة بدك تعمليها دائما
الأسئلة الصعبة اللي بتخوف زي هيك ما تنظريش إليها
نظرة واحدة مكتملة لنفس السؤال، لأنه ولا عمرك هتعرفي
تحليه، هذه نقطة مهمة فلأ بدك تجسميه، طب في سؤال زي
حالتي كيف بدي أجسمه؟ بذكركم المرة اللي فاتت قولنا
لما نشوف سؤال زي هيك أول حاجة بفكر فيها كيف أعمل الـ
grammar بس ما لي دعوة في الباقية، يبقى أنا اختزلت
السؤال بدل اللي كان بيقولي من infix لـ postfix في
الأول، قلت بس أطلع الـ grammar بعد ما بدأت أطلع الـ
grammar بدي أقعد أسرح في كل production وأكون
شايفها قدامي، إيش عاجبها أحط عشان يطلع الـ postfix
شوفتوا كده تفكير زي هيك بدك تحاولي تتجسمي مشكلتك
شوية شوية عشان تقدر تحليه، وكوني فاهمة أنه عندك
القدرة أنك تحلي هذه الشغلتين الضروريات وإلا أن أنت
حاطط في رأسك أنا مش عارف أحله، مش قادر أحله ولا
هتفكر ولا هتحل، فدول النقطتين دائما مهمات في أي
problem بتمر عليك، مش بالشرط في الكمبايلة، في أي
problem دائما فاكر كيف تتجزئيها، تتجسميها وتمسك كل
جزء لحاله وكيف أحله عشان أقدر أحل كل problem بشكل
كامل، الآن نرجع لسؤالنا احنا اللي بده يحول من infix
لـ postfix، أول حاجة إيش نفكر في الـ grammar بس يعني
مش هوجع راسي في النص الثاني لأنه لسه أنا مش عارف
أحط الـ grammar كيف، بفكر في الثاني والأول مش موجود
إذا التفكير السليم إنه كيف أستطيع وصف الـ syntax من
خلال الـ grammar بشكل سليم، هذا الجزء الأول اللي
هنرجع نركز في الجزء الأول هو إيش بدي أوصف infix
إيش يعني infix؟ يعني أرقام من خانة، احنا فرضنا خانة
الآن يفصلهم إشارة يعني expression، ما نعرفش نعمل
grammar للـ expression، بنعرف أخذناه مش أخذنا الـ Z وال
ناقص والضرب والقسمة مش أخذناهم؟ فأنا الآن اللي
أخذناهم هدول إيش نسوي فيهم؟ بدنا ننسخهم على اللوحة
ونكتبهم عشان نفكر في النقطة الثانية، طبعا هنجي
نعمل زي هيك، نجي نقول، طبعا لحد الآن احنا ما أخذناش
translation scheme، أخذنا syntax directed definition
يعني لحالك هتعرف أنه لازم نقسم اللوح لإيش؟ لجزئين
تمام، أيوة، grammar وsemantic rules، بس الآن أنا
بتركز على مين؟ على الـ grammar وهي الـ grammar وهي
اللي هو مين؟ الـ rules، semantic rules، طيب الآن الـ
grammar كلنا عارفينه من زمان، expression سهم
expression واحد زائد term، طبعا ليش أنا حاطط واحد
يا بنات؟ طالما بتتكلم عن attribute كمان شوية لازم
أميز الأب عن الابن عشان في attributes جاي، فبس بحط
رقم ايش واحد صغير عشان أقول إنه بقصد هذا مش هذا
لكن مش تفكر إنه صار عندي non terminal الجديد اسمه
expression ولا لأ هو نفس الـ non terminal لكن
الواحد الصغير إن أنا بحكي عن هذا مش على أبه لأن
طالما بتتكلم عن attributes معناها ممكن الـ value
بتاعتهم يكون مختلفين، الـ value بتاعة الـ app غير الـ
value بتاعة الـ event فطالما مختلفين مش زي بعض لازم
أحط ايش تمييز بينهم، تمام؟ الآن هتقولي كمان
expression عبارة عن expression ايش minus term أو
expression عبارة عن ايش term وهتيجي تقول لي الـ
term ماله؟ term في factor وهتيجي تقول لي الـ term
ماله؟ طبعًا طالما في اتنين term هتعمل أيش برضه؟ هذا
واحد يعني مايزي إنه نقصد الأبن وبعدين هتقولي term
على factor وبعدين لسه في term يساوي factor صح؟ و
بعدين الـ term عبارة عن factor وبعدين الـ factor
ممكن يكون number والـ factor طبعًا ليش أنا حاطيتها
في سطر ثاني عشان ممكن يكون في rules ده كل واحدة
مختلفة عن التانية فيفضل إنه دائمًا كل production كل
حالة ما تحطش قواعد بناتهم لأن يمكن هذه يكون لها rule
مختلفة عن هذه الـ rule التي هي هذه الـ exception
مثلًا شفتي كيف؟ ممكن، لا نريد أن نضع or جانب بعض
عشان أقدر لكل production أحدد إذا فيه .. إيه؟ ليش
الـ factor بيسور .. بيسور القهر خلاص علطول؟ عشان
في exception، في أقواس، مش كنا المرة اللي فاتت
أخدنا الأقواس؟ وبعدين factor أو الـ number اللي أنا
أخيرًا أخيرًا ايش action ديال number تيجي ايش نسوي؟ نم ايش
يكون النم zero أو نم واحد الأخره صح؟ لغاية نم لتسع
طيب هيك أول ملاحظة عملناها ايش؟ أول ملاحظة قلنا إنه
بدنا نحاول نوصف الـ syntax تبع الـ language من خلال
الـ grammar ووصفنا وخلصنا هذه أول حاجة، طيب step 2 و
ركزوا الآن شوية عشان أقدر أفكر في الـ semantic
rules وأحطهم صح، دائمًا يفضل تاخدي مثال بسيط 5 زائد
2 أو 1 زائد 2 زائد 3 أو تعمل letter E الها عشانك
عشان تفكر في الـ letter E مش أنا بدي أحل على letter
E عشان أوصل للمطلوب فبتفكر كيف بدي أحل في letter E
لأن هذا ممكن يديكي معلومات عن طبيعة القوانين اللي
بيحطيها، يفضل أن تضع لي مثال بسيط قبل أن تضع hand
طبعًا ليس ضروري يعني في ناس على طول ممكن يقولوا أنا
خلاص أنا بهابد ويدخل ويجاوب في ناس زيك تشتغل مش
غلط لكن من بقى برضه الاحتياط شوية خد يقولي خطوة
زيادة زي هيك تيجي تقولي مثلًا كيف نعمل واحد زائد
اتنين زائد تلاتة مثلًا هتيجي تقولي لي expression
عبارة عن expression زائد term shake عشان نطلع واحد
زائد اتنين زائد تلاتة، والـ term عبارة عن إيش؟
factor والـ factor عبارة عن number والـ number
عبارة عن إيش؟ تلاتة والـ expression هاد عبارة عن
expression زائد term والـ term factor number اتنين
والـ expression هاد term factor number واحد، الآن
تعالوا نفكر شوية، أنا ليش بحطها دي الرسمة؟ مش أنا
في النهاية بدي أقعد أطبق الـ rules اللي أنا لسه مش
عارفهم عليها عشان أوصل لإيش المطلوب عشان ايه بحاول
أحطها قدامي وبفكر كيف أعمل حسابات لطلع المطلوب،
الآن هو مش طالب، هو طالب يطلع عند الـ roadshow شو؟
الـ boss fix عشان أقول إنه نحول من infix تطلع لـ
letter E أو الـ rules تطلع لـ boss fix معناته
الكلام إن أنا بدي أطلع boss fix هنا، الآن أنت ايش
هتقولي ليه؟ هتقولي لي مش هقدر أعرف الـ postfix طبعًا
لما يكون عندي هدم طالع لي يا بنات expression زائد
term، شو الـ postfix بتاعها هي؟ الشاطرين هيقولوا لي
الـ postfix بتاعها هي بلزق وراها الـ postfix بتاعها
هي، بلزق وراها الزائد طبعًا لسه مش عارف شو الـ
postfix بتاعها هي فبدي أعرف الـ postfix بتاعها هي
عشان أعرفها هي وبدي أعرف الـ postfix بتاعها هي عشان
أعرفها هي فتعالي انزلي انزلي دفنتر ايه؟ لما الـ N
بتعطيني واحد شو الـ postfix للـ N في الحالة هذه؟ واحد
.. واحد .. واحد .. واحد .. واحد .. واحد .. واحد ..
واحد .. واحد .. واحد .. واحد .. واحد .. واحد ..
واحد .. واحد .. واحد .. فلما الـ number بيطلع لي واحد
ايش بدك في الحالة دي نعمل؟ بدنا نقول إن الـ postfix
لك يا number في الحالة دي يكون واحد وحطينا .T
ليش؟ أنت حرة .T .B .V زي ما بدك المهم بدك
attribute ياخد الـ postfix للرقم، طيب هذه اللي أنا
استنبطتها، ايش ساعدتني؟ إنه عرفتني الـ rule لما الـ
number بيطلع واحد لازم عاجبالها ايش الـ rule اللي
أكتبه أقول ايش؟ بده أقول اه يا بنات number.Dot T
يساوي واحد شايفها؟ أنا عرفت الـ rule بس في كيف
أستطبطه من هنا إنه والله بالفعل لما الـ number طالع
لي واحد عشان أقدر أوصل الـ postfix اللي فوق لازم
هذا ياخد الـ postfix بتاع هذا صح أو لا؟ بدأت أستطبط
شغلات وأعكسها هناك لكن كمان أنا مش بتضرر تفدي من
هنا في ناس شاطرين بيقولوا طب ما خلاص لما الـ number
بيطلع zero فالـ postfix هو نفسه ففي ناس برضه بتشتغل
هيك هو طول فمتى كيف اتنين صح؟ طيب الآن ايش هتقول
أنتِ هنا هتقولي نم .T ايش تساوي Zero وهتضلي ماش
.T تساوي 9 هيك حتى ترولز لها دول، صح؟ تعالوا نرجع
لصمتنا شوية، طيب لما الـ factor بيطلع number ايش بدك
تقولي في الحلقة هذه، في القوانين؟ لما الـ factor
طلع لي number، ايش رأيك؟ هتقولي أكيد الـ .T تاعتها هي
بدها تساوي الـ .T تاعتها، يعني الـ boss fix تاعي هو
نفس الـ boss fix تاعي فكأنه بدك تقولي أنتِ .T هنا
ايش تساوي؟ واحد، مظبوط؟ طب يعني أنتِ ايش دي text؟
لما الـ factor بيطلع number، ايش ده نقول؟ ايش بدك
تقولولك بالها؟ بدك تقول على طول الـ factor هذه .
T بديها تسوي هذا number الـ T تبعته، مش هيك؟ non
.T باختصار، ليش أنا بقول هذا الكلام؟ عشان لما
تيجي تحلي، تيجي على طول تقول الـ fact .T القانون
ايش بيقول لك؟ واحد شفتي كيف؟ طب .. طب تعالي تطلعي
كمان شوية، طب لو الـ term جلب factor ايش نعمل؟
هتقولي نفس الفكرة خلاص الـ value بتاعة C والـ value
بتاعة I صح ولا لا؟ عشان هيك أنا هدور لما الـ term
بيعطيني factor خلاص على طول term .T بدها تساوي
شايف أنا قاعد بحط قوانين in general للكل بس قاعد
أستندقهم من وأنا قاعد بحل المطلوب في حاجات جديدة
تعالي لما الـ term بيعطي factor هتقولي نفس الشيء
لازم الـ .T بتاع الـ term تساوي الـ .. هيا عملناها
.. هيا عملناها، طيب لما افترضي expression أعطى term
هتقول لما الـ expression بعت الـ term في هذه الحالة
الـ .T بتاع هذا شو يساوي؟ الـ .T بتاع هذا صح؟
يعني وين هي .. هيا لما الـ expression بعت الـ term
ايش ده أقوله؟ الـ expression .T تساوي term .T
هزوت ولا لأ؟ طيب تعالوا نكبر شوية نشوف حاجات ثانية
طيب لما الـ expression بتعطيني expression زائد term
شو أعمل؟ كيف أحسب الـ T تحت هذه؟ كيف حسبتي تاعتها دي؟
هتقولي اللي بدأ أخد الـ T هاي الـ bossfix هاي صح؟ و
لزج عليها الـ term .T ولزج وراهم الـ Z بشكل ..
عشان تصبط؟ يعني أنتِ هتيجي تقبلي هدش تقولي بدك تقولي
بدنا نأخذ عشان نحسب الـ .T للأبو يعني الـ bossfix
للأبو هتقولي يساوي الـ bossfix لمين؟ اللي هي .T
صح؟ concatenation هذه إشارة الـ concatenation اللي
لزج وراها concatenation مع مين؟ term .T term
.T وراهم جمع concatenation مع مين؟ جمع مع إشارة
Z فأنا الآن هذا القانون موضح لي إنه لما الـ
expression بتكون expression plus term إن الـ boss
fix بتاع هاي هو الـ boss fix بتاع الأول يعني الـ
value تبعته بدي لزج وراها الـ boss fix بتاع هاي و
أحط وراهم الـ Z القبرته، مش هيك؟ القانون قبل شوية كان
E of E الـ Postfix تبعها والـ E10 Postfix تبعها
وراها الـ operator نفس الفكرة إذا أنا لما جيت أحل
استنبط القصة هذه فخلاص الأقل المفروض تكون مضحكة
خالص لما طب الـ expression بتعطيني expression minus
two هتيجي تقولي نفس الأشياء الـ .T بتاعة الـ app
تساوي الـ expression .T طبعًا على أساس ايش مخزن
في الـ .T هنا الـ postfix المرة اللي فاتت كنا
مخزن .. مخزن فيها value عساس كنا بنحسب النتيجة
والـ route المرة هذه غيرنا السؤال فعملنا
attributes لما نخزن فيه شو الـ boss fixed فحسب
السؤال دي بتنتبهي عشان هيك مش هتقولي dot T ماله
concatenation مع مين؟ مع الـ term dot T
concatenation مع مين؟ مع minus طيب إيش رأيك في هذه
لما الـ term بيعطيني مثلا مش موجودة يعني بس خلاص
احنا عشان نستوعب الـ term بيعطيني term ضرب factor
هتقوليلي الـ term dot T بتاعة الـ app إيش تساوي؟ الـ
term dot T بتاعة الـ app اللي هي الـ boss ال fix
الأولاني concatenation
مع الـ fact dot T concatenation مع مين؟ مع الضرب
واللي وراها نفس الفكرة term dot T تساوي term وحد
dot T concatenation مع الـ fact dot T concatenation
مع القسمة طب إيش رأيك في هاي؟ لما الـ fact يعطيني
فتحة قوس exhibition تسكير قوس ايش بدها تكون الـ .t
بتاعتها؟ اي نفس الـ exhibition.t يعني الـ boss fix
اللي هنا هو نفسه اللي هنا شوفتي؟ فدائما بحب ارسم
الرسم عشان اشوف كيف احسب عشان اعرف كيف القانون بدي
يجي عشانك إيش هتيجي تقولي هنا؟ fact.t تساوي
exhibition.t
أنا إيش اللي سويته لحتى اللحظة يا بنات؟ أنا كل
اللي سويته حاجة واحدة حطيت قوانين semantic rules
وظيفتها تحول الـ infix لشو؟ ل postfix طب كيف
هيتحول؟ إذا إنتي طبقتي عند كل production القانون
المكتوب لازم تتحول و أنا هعملك المثال الآن كامل
هعملك إياه على الكبيرة هايعشان أثبتلك الآن أن أي N
Fix تيجي على بالك اعملي لها الـ Tree تبعتها طبق
القوانين عليها هتلاقي كل مرة بتطلعلك الـ boss fixed
on the road automatic صارت بس الشطارة أنه تعرف
تحطي هدول فزي ما أنا قلت بأكد إنه في ناس بيقدروا
يحطوا هدول بدون ما يعملوا letter اي بس أنا بحب
دايما أرسم letter اي لأن عليها بدنا نحل و نطلع
المطلوب فمنها بشوف كده بحل و برجعاش بطريقة عكسية
أحط القوانين فهذه ماتروكالة كيف أنت تحل المهم إحنا
هي جواب هذا الآن translator بيحول من infix ل
postfix و هثبت هذا الكلام الآن من خلال مثال
هثبتلكم تمام لحد هنا؟ طبعا بس في ملاحظة صغيرة قبل
ما ناخد ال break جيجا شايفين لما بقعد أنا أحل لما
بعمل بالأسود زي هيك و بحلها و بحلها و بحلها عارفين
الرسم اللي بتنتج معاه إيش بنسميها اللي عليها الحل
اللي بتطلق لهنا بنسميها يا بنات Unnotated Parse Tree
Unnotated Parse Tree
طبعا اللي بالأحمر قبل ما نحلق عليها إيش
بنسميها parse tree لحال تمام؟ لكن لما بدي أطبق الـ
rules عليها إيش بنسميها annotated parse tree عشانك
دايما لما تشوفي أي سؤال في الكتاب بيقولك annotated
parse tree هتيها معناه بيكون لازم يكون فيه syntax
directed definition عشان تعمل الـ tree في الأول و
بعدين تطبقي مين الـ rules عليهم واضحة؟
الإيش؟ أه عشان أبدأ أحل يعني لما الـ in أعطت واحد
شو الـ rule بيقوللي أنه الـ value بتاعة الـ non
بتساوي واحد فمش هاين روحت عملتها فانت بدأت تحلي
الآن الـ attributes هاد يقولك لما تحلي الـ
attributes النتيجة اللي طلعت معاك الحلول هذه كلها
هاد الشجرة بنسميها annotated يعني طلع عليها الـ
attributes وحلناهم بدون الـ attributes بدون الحل هي
parse tree لكن لما بنحل عليها annotated بس عشان
نكون فاهمين إيش عن annotated طبعا طيب الآن زي ما
قلت هناخد break دقيقة او دقيقتين و نرجع نجرب على
المثال الطويل خد ال break دلوقتي لسه
احنا قاعدين بنتكلم في موضوع ال grammar لسه لأ لأ لأ
احنا بتتكلم في ال grammar لحد تلان في ال grammar و
أخدنا حاجة اسمها translator بس هذه هتكون فيها أكتر
من المكان لان استراحة تجيب تاني ان شاء الله طيب يا
بنات خلونا نبدأ نرجع لسؤالنا لو سمحته هدوء لو
سمحته نرجع للمثال تبعنا الآن احنا ليش بدنا نسوي
بدنا نتأكد انه هذا عبارة عن translator بالفعل
بيحول من infix ل postfix وبدنا نتناول و ناخد كمثال
المثال الصعب اللي قبل شوية قعدنا نحل فيه نشوف كيف
بشكل automatic ومحاوسب هيطلع لل postfix بشكل جاهز
طبعا إيش بدنا نعمل أول خطوة لهذا المثال؟ ايه اللي
بتسويه الأول حاجة؟ أول اشي بدك تعملي Parse Tree أنا
بقولك الخطوات أول اشي بدك تعملي Parse Tree بعد ما
تجهز الـ Parse Tree بدك تبدى تشوف كل production
استخدمتيه تشوفي إيش الـ semantic rule اللي على جباله
و تنفذيه إن نفذتي هذا الكلام هتلاقي طالع عندك في
الآخر الـ postfix بشكل صحيح وسليم الآن تعالوا، هذه
كيف نعملها يا بنات؟ الـ tree؟ هتقوليلي أكيد هنددها
من وين؟ من expression اللي هي الـ start symbol الآن
كيف نطلع هذه؟ إيش نعمل؟ طبعاً للناس اللي نسيين هذا
كله expression آخر حاجة زائد Ter مش هانا بنطلع
الاخر إيش؟ عشان أعرف إيش مين ده اكتف مش هي
expression زائد أو ناقص Ter يعني أنا هذه بتثبت؟ وين
الـ term عندي مثل هذا؟ أكيد الشاطرين هيقولوا ليه كل
هذا expression زائد term طيب لو فرضنا إنه هذا
ماكنتش زائد كانت ناقص كان كل هذا expression minus
term واضحة؟ الآن في مثالي الموجود على اللوح
هتقوليني ببساطة expression خليني بس عشان نستفيد من
وسع اللوح expression
زائة term هذا الـ term نخلص منه لأنه سهل عبارة عن
ايش؟ term في factor و خلونا نكتب هذا من باب
الاختصار الـ factor ده كتوبها F و الـ term كتوبها T
لكن الاصل الصح كان نكتب الاسم كامل خلاص من باب
اختصار الـ factor هذا عبارة عن إيش يا بنات؟ number و
الـ number عبارة عن إيش؟ هي سبعة تمام و الـ term هذا
عبارة عن إيش؟ factor و الـ factor number و الـ
number ستة خلصنا من هذا الآن تعالوا لهذا الـ
expression كيف بدي أعمل خريطته؟ هذا عبارة عن
expression زائد و هذا كله term لأنه ضربه قسمة و
factor بين جثين هذا كله term في النهاية عشان هيك
هذا إيش بنقول عنها expression زائد term تعالوا نخلص
من هذا الـ Expression اللي هو الواحد إيش هتقولي
ليه؟ expression عبارة عن term و الـ term عبارة عن
factor و الـ factor عبارة عن number و الـ number
عبارة عن واحد الآن تعالوا لمن؟ للـ term مش هدا
عبارة اتنين في تلاتة على x تبريه كيف بنا نعملها؟
عبارة عن term في factor ولا term على factor على
factor من الآخر صح ولا؟ عشان كده كفك كده هتكون
term على تمام على ايش factor و الـ term هذا عبارة عن
ايش term برضه فيه factor مش هذا كان ضيوف شوية
عبارة عن إيش term فيه factor و الـ term هذا إيش
factor number اتنين و الـ factor هذا إيش number
تلاتة
والـ factor هذا إيش if تهي قوس expression سكري قوس
لأن مش على كيف أنا ببدل أنا ببدل حسب القوانين هاي
factor قوس expression تسكير القوس عشان نطلع هاي
الآن الـ expression اللي هنا عبارة عن إيش
expression minus term
الـ term هذا factor number خمسة و الـ expression هذه
term factor number أربعة أربعة طيب الآن أنا إيش
اللي سويته على اللغة؟ أنا بس سويت حاجة واحدة أنا و
هي اعمل Parse Tree عادية إيش الهدف من الـ Parse Tree
أنه نتأكد ان هذه صيغة الـ infix موجودة في الـ
language إذا هي موجودة في الـ language خلصنا منها
مظبوط ولا لأ الآن طالما بدنا نعمل annotated
parsing tree يعني الآن بدي ابدأ اطبق الـ rules على
هدول مظبوط ولا لأ بدي أديكي ملاحظات ومعلومات لو أنا
حكيتلك أن كل attribute في هدول من نوع synthesized
ايش بدك تفهمه؟ بدك تفهم أنه بيتمد على ابناءه لازم
اعرف ابناءه عشان اعرف قيمة الأب باختصار طب ايش
عرف انه synthesized؟ شايفة الـ T هاي بتساوي T
الإبن شايفة هاي؟ T الأبو عشان تتحسب إيش ممكن
تساوي؟ T الإبن تمام؟
حسبة تهتم على كمان مين؟ T الابن و بينهم زاد
فالواضح عشان أعرف الأب لازم أعرف مين؟ attribute
الأبناء فلو مسكت كل واحدة و قعدت تطلع فيها هتلاقي
دايما عشان تحسبي T الأب و تحسبي T الأبناء T الأب و
T الأبناء فمن هنا أنا عرفت معلومة أن هذا كل
attribute في هدول من نوع ال synthesizer طب هاذي شو
هتفيدك ان انت عارف ت synthesize الـ attributes الآن
أنا عشان ما أخلطش في راسي عشان أطبق الـ attributes
قالك لو بدأت من تحت لفوق bottom up يعني بدأتِ من ال
bottom الـ N طلعت أربعة شو القانون بيقول حليها الـ M
طلعت خمسة شو القانون بيقول حليها الـ N طلعت ستة شو
القانون بيقول حليها بعدين طلعتِ شوية فوق طلعتِ
شوية فوق قالك لو مشيتي بطريقة الـ bottom up اللي
اتعلمناها في الـ data structure في زيارات الـ nodes
و في كل node تشوف القانون اللي موجود قالك ابتضمن
إن الشجرة كلها هتنحَل بطريقة مين الـ bottom up طيب
مافيش طرق تانية أنا ممكن أستفيد منها؟ لأ في في الـ
depth traversal عارفين كيف الـ depth traversal
بتشتغل بيبدأ .. لأ بنزل هيك عشان يحل بنزل هيك بنزل
هيك، بنزل هنا، لإن في depth، بنزل هنا، هنا، هنا،
خلص، بيبدأ يحل هيك، خلص، بيبدأ يحل هيك، خلص، بيبدأ
يحل هيك، خلص، بيبدأ يحل هيك، الآن بيحلش الأبو،
بنزل في depth، depth، depth وهكذا فكل مرة بالـ
depth traversal بيحل الأبناء وبعدين بيطلع للأباء،
برضه بتنحل، شوفتِ كيف؟ لأنه لازم يكون في شيء
systematic يمر على هدول ويشوف القوانين وينفذها،
فبنقول deep traversal بمشي، bottom up بمشي، لأن في
الطريقتين أنا بأضمن شو؟ بأضمن إنه هيشوف الأبناء
قبل الأباء، وبالتالي هيعرف يحل كل الدائرة بدون
مشاكل طيب أنا كـ human خلاص فهمنا الآن كـ system أنا
كإنسان كـ human أنتِ حرة الآن على اللوح يعني ممكن أنا
جايش أقولك بدي أحل الـ N بعدين الـ F بعدين أحل الـ N
بعدين الـ F بعدين الـ F أنا حر الآن كـ human لما أنتِ
المهم بدّك تحلي رسمتك لكن كـ system هيمشي بطريقة
معينة خلاص طبعاً أنتِ حتى كـ human ما بتقدرِش تعرف اللي
فوق إلا وين اللي تحل اللي تحتها؟ مش هتقولي اللي تحل
اللي تحتها، فهمتِ كيف الأمور؟ طيب، الآن تعالوا
نشوف كيف بدنا نحل، بدي أبدأ أحل وأنا بدي أبدأ زي
الـ depth أو أبدأ زي الـ bottom، هقول لما الـ number
يعطي واحد، شو يا قوانين أنتوا بتقولوا؟ لأنه مش على
كيف الآن بدي أحل الـ number أعطى واحد، إيش القانون
بيقول ليه؟ إنه في value لهذا الـ number بدّك تسويها
بواحد على طول أنا بطبخ، ما ليش دعوة الآن، بفكرش خلاص
مش يعني فكرنا وتعبنا هام هذا صار automatic
translator هذا صار automatic محول خلاص بيحول
automatic بس بنفذ القوانين عن كل node الآن الـ N
أعطى واحد إيش بيقولوا القانون .dot T يساوي واحد
وخليني أحلهم كلهم لهدول نفس الشيء .dot T يساوي
اثنين .dot T يساوي ثلاثة .dot T يساوي أربعة .dot T
يساوي خمسة .t يساوي 6 تأخرنا اليوم مش هفل الشيخ طيب
..........................................................................................................................................................................................................
.dot T تساوي اثنين .dot T تساوي ثلاثة .dot T تساوي
أربعة .dot T تساوي إيش؟ خمسة نفس الفكرة يا بناتِ
تربيع تفاضل نفسها فهذه الطريقة هي تقولي .dot T
تساوي أربعة وهنا .dot T تساوي اثنين وهنا .dot T
تساوي واحد مظبوط؟ وهذه .t تساوي 6 وهذه .t تساوي 6
وهذه .t تساوي 7 صح ولا لا؟ هم بيشتغلوا طيب تعالوا
نشتغل لما الـ expression أعطى الـ term .t تساوي 1
هيا نفسها طيب تعالوا الآن نبدأ ندخل شوية وهذه .t
إيش تساوي 4 وهذه .t إيش تساوي 5 مظبوط؟ طيب تعالوا
نشوف الـ term هذا لما أعطاني term ضرب factor شو
القانون بيقول؟ هيّا شايفينها؟ قال لي أول شي بأخذ الـ
value بتاعة الابن الأول بلزّق وراها الـ value بتاعة
الابن الثاني بلزّق وراهم ضرب نفسي تعالوا إيش الـ
value بتاعة الابن الأول؟ طبعاً دلتا تساوي اثنين
لزّقي وراها ثلاثة لزّقي وراها ضرب خلصنا من هذه هدي
ستة سبعة ضرب تعالوا لمين .. هدي .. خلنا الـ .. لأ
.. .dot T هدي لما الـ expression بتعطينا expression
minus term قال لي الـ value بتاعة الأول لزّقي وراها
الـ value بتاعة الثاني لزّقي وراها وما يعيش الزائد
تعالوا نشتغلها وينها؟ يعني هتقولي لي أربعة خمسة ..
طب أنا ناجس هنا خلصنا؟ الـ F .dot T نفسه نفسه أربعة
خمسة minus طيب الـ term .dot T قالك خدي الأولانية
اللي هي إيش؟ اثنين ثلاثة ضرب ولزّقي وراها مين؟
أربعة خمسة minus أربعة خمسة minus واضيفي وراهم
مين؟ زرع القسمة خلصنا هاي طيب هاي القانون شو بيقولك
خدي الأول وبعدين خدي الثاني اللي هو اثنين ثلاثة
ضرب أربعة خمسة ناقص قسمة واضيفي عليهم؟ من القانون،
صح؟ إيش ضال عنا عشان نخلص؟ دوتي هذه شبرا إيش؟ خدي
هذه كلها، اللي هي واحد، اثنين، ثلاثة، ضرب، أربعة،
خمسة، ناقص، تقسيم، زائد، واضيفي وراها مين؟ ستة،
سبعة، ضرب، وحطي وراهم مين؟ زائد هل هذا هو الـ boss
fix اللي قبل شوية أخذناه؟ automatic، خلاص، ولا
بفكر ولا غيره شوفتِ اللي قاعدتنا نستصعب فيها على
طول جهّزت وطلع جاهزة واضحة يا بنات؟ واضحة الفكرة؟
اللي أنا أصلاً إيش مصمم؟ translator بيحول من infix
يعني أنا بعطيله infix بيطلع لي postfix اللي أنا آخر
سؤال بتأخذ فيه معليش في نص دقيقة عشان ما هيش الدرس
افترضي كنت سألتك سؤال كالتالي اعملي لي translator
بيحول من infix لـ postfix وبيحسب لي الـ value عند الـ
root بس مثلاً هتكوني فاهمة الآن إنه صار لكل non
terminal اثنين value واحدة تحتفظ بالـ post واحدة
تحتفظ بالمجموع وهتصير تحطي عند كل واحد قانونين تيجي
تقولي expression .dot T1 قانون الـ boss fix
expression .dot T2 اللي عملناه المرة اللي فاتت إنه
نجمة فبس فأنتبهي إن ممكن للـ production واحد يكون
إيش أكثر من rules وممكن يكون أكثر من attributes
حسب السؤال طب افترضي كمان كملت عليه وبدي أكبر
قيمة أو أصغر قيمة هتلاقي للـ expression أربع قيم
واحد هتخزّني boss واحد هتخزّني value واحد هتخزّني أعلى
رقم واحد هتخزّني أصغر رقم فعلى حسب السؤال بدّك تقرّري
كم attribute بالزمن لكل production كم semantic
rule على جباله وعشان هيك زي ما قلنا لازم في الأول
تحطي الـ grammar وبعدين تسرحي في كل واحدة كيف أنا
أظبطها