بسم الله الرحمن الرحيم اليوم يا بنات إن شاء الله
بدنا نستكمل الـ pseudocode اللي أخدناه المرة اللي
فاتت و نحاول نعمله اليوم بالـ Java تمام؟ بس في
الأول قبل ما أروح على الـ Java بدي أذكرك إيش اللي
سويناه احنا كان عندنا translator بيحول من infix لـ
postfix وقبل ما أعمله أي تعديلات كان هو عبارة عن
non-terminal اسمه expression و non-terminal اسمه
term مش هيك؟ لجينا إن هذا الـ non terminal تبع الـ
exception في مشكلة الـ left recursion في بداية
مكررة اللي هي نفس الـ non terminal قبل السهم يبدأ
بنفسه بعد السهم وقلنا هذه تمثل مشكلة left
recursion بيصير في عندي infinite loop لازم أحلها
وقلنا عشان نحلها على القوانين اتغير شكل شوية الـ
grammar فصار عندي حاجة اسمها exception كـ non
terminal حاجة اسمها rest مظبوط اللي هو الـ R اللي
بنضيفها وحاجة اسمها term هذا كـ grammar هذا الـ
grammar الجديد اللي خلصناها المرة اللي فاتت الآن
أنا لما بدي أعمل parser كام function بتتوقع بالزمك
أكيد هتقوليلي وبدي function للـ expression للـ non
terminal وبدي function للـ rest وبدي function للـ
term وبدي الـ function المعروفة تبع الـ match هذا
المفروض من المسلمان، مظبوط أو لا؟ لكن بدي أذكرك أن
هذه الـ risk احنا المرة اللي فاتت لجينا طريقة أن
نستغنى عنها ونسرق الـ code تبعنا، إذا بتتذكري طبعًا
احنا مش ملزمين كـ compiler أن نعمل الحركات هذه لكن
احنا من ناحية برمجية كان الأصل بنعمل القصة هذه واضح
أنا هحاسبك في إمتحاناتي على الـ compilation أكتر من
الموضوع البرمجة لكن مش غلط أن تكوني فاهمة هذه الـ
skills طبعًا هذه الـ skills أدت إلى شغل المرة اللي
شفناها أنه بطل في عندي rest لأن سيبت عملها loop و
طالما بطل في عندي function اسمها rest شيلتها كلها
حاطيتها وين؟ جوا فما تستغربيش الآن انه لو بدأ
الأربعة function في الـ code اللي بنكتبه بس كتبنا
الـ expression بطل نكتب الـ rest لأن الـ rest صارت
عبارة عن إيش code حاطيته جوا الـ expression
وبالتالي بطل فيه rest عشان هيك هتلاحظي بس في عندي
function اسمها expression و function اسمها term و
function اسمها match هي اللي هنشوفه باختصار فما حدش
يقولي وين الـ rest راحت الـ rest راحت في عملية الـ
optimization للـ coding حولتها من tail recursion لـ
loop وبعدين لا جيت فيش إليها أكتر من استدعاء غير
مرة واحدة فشلتها ونسختها في المكان اللي هي بتظهر
فيه فارتحت منها فظل عندي الـ expression والـ tail و
الـ match طيب الآن السؤال هذا الـ code اللي بعد
التعديل كيف أنا بدي أعمله بالـ Java؟ طبعًا احنا
عارفين أن الـ Java باختصار هي لغة object oriented
طيب قلنا لغة البرمجة بتعتمد بتاعة الجاوة على الـ
object oriented وبالتالي كلها بتلاقيها مبنية على
classes وبعدين تيجي في المين إيش بتسوي instance
من هذا الـ class على شكل object وبتتشغله الآن أنا
جاية بتكلم هنا كـ parser فكيف تتوقع هذا الـ code بدي
انحط كبرمجة وأين بدي أحطه؟ أكيد الشطرينش بيقولوا
أكيد لازمني أعمل class اسمه parser وجوا هذا الـ
class أحط كل الـ functions الخاصة بـ main بهذا الـ
parser وبجعل الـ main .. لما بعمل عملية parsing
إيش بسوي في الـ main؟ بعمل منه instance object و
بعدين بستدعي أي function عشان عملانة الـ parsing الـ
start symbol اللي هي في حالتي مثلًا expression يبقى
أقصد أن تحويله لموضوع Java مش موضوع صعب أنا بس
الهيكلية بتاعت Java الهيكلية زي class لكن كل الـ
code زي ما هو هنا بتروح يقعد بده يقعد جوا هذا الـ
class وجوا الـ main أنا بفعله باختصار يعني طيب
دعاني أشوفها كيف كبرنامج Java شايفين؟ بدأ برنامج
عادي جال أنا بهمني يكون في عندي class واسميه زي ما
بدك بس احنا بنسميه تسمية related للشغل تبعنا فانا
بعمل عملية parsing يعني بدي parser فرح سماه class
parser طبعًا لحظة إيش عرف جوا variable ليش؟ أنا
بلزم .. بلزمله كهدف ليش بالزمن؟ لأن عملية الـ
parsing مستحيل تتم إلا لازم يكون في lookahead واقف
على الكلام اللي كتبه المبرمج مش أنا بصيحة عملت
مقارنة بين الشيء المكتوب وبين اللي المفروض يكون
مكتوب أو الـ syntax تبع الـ language إذا لازم يكون
في عندي lookahead موجود عشان هيك هو قال لي خلاص
هذا الـ lookahead هيو موجود اللي هو هيمثل الـ token
الحالي الموجود اللي جايين المفروض من الـ lexical
طيب إيش هاي عبارة عن إيش هذه الـ parser بين جثين في
البرمجة؟ إيش معناها؟ constructor صح method لكن هي
constructor إيش يعني constructor؟ يعني هذه الـ
function يتم استدعاها بشكل أوتوماتيكي أول ما تعمل
creation للـ object من المين يعني بمجرد ما أنت تعمل
create للـ object أوتوماتيكي الـ constructor بتم
استدعاه إيش في جواته ينفذ؟ طبعًا لحظي إيش كاتب هو
جوا؟ الـ constructor هذا جاية بحط قيمة للـ
lookahead ليش لازم يكون في عندي lookahead كبداية؟
لأنه بدون الـ lookahead مش هيصير عملية parsing احنا
تنسّي عملية الـ parsing بدها طرفين الطرف اللي هو الـ
code اللي جاية يتشجر وجاية يعمللي الـ syntax و
بوصفه والطرف الثاني اللي هو الـ lookahead اللي هو
واقف على الكلام المكتوب من المبرمج اللي بتتحقق منه
بالطرفين مش موجودين ما أقدرش أنا أعمل عملية الـ
parsing لازم هذا يكون موجود ولازم هذا يكون موجود
الآن الأكواد أو الـ functions الخاصة بوصف الـ
grammar لازم تكون موجودة تحت الآن بيضل مين ناقص
معايا اللي هو lookahead هذا فعشان إيه أنا سويت
شغلتين عرفت lookahead كـ variable و أعطيته جوا الـ
constructor قيمة ابتدائية طبعًا من وين هياخد القيمة
الابتدائية لحظي هنا من المبرمج من الـ user اللي جاء
اتشغال هو الأصل في المستقبل من وين ناخد القيمة هيك
مش من الـ user الأصل الأصل أن في lexical analyzer
بدخل على الملاف بيروح بيقطعه لـ token بيمسك الـ
token بيبعتليه والـ lookahead بيجف عليه هيك الأصل لكن
لأنه احنا لسه ما أخدناش الـ lexical analyzer فقلنا
مؤقتًا بنحط قيمة lookahead من الـ keyboard شوفتي كيف؟
يعني أنت هيطلب منك أول ما تعمل creation للـ object
هيطلعلك رسالة دخلي character مثلًا الـ character
اللي هتدخليه هيفترضه هو شو الـ token اللي انبعت لكن
زي ما قلت أنا الـ code الكامل تبعنا ما بيكونش بيقرأ
من الـ user زي هيك بيقرأ من وين؟ من الملف بيجيبلي
الـ tokens الليكسيكال بيجيبليه وهذا اللي هنعدله
بعدين في مشروعنا في نهاية chapter 2 طيب هنتكلم عنه
بعدين الآن تعالى اتطلعي قعد كل اللي موجود هنا يا
بناتي الآن إيش هو نفسه الـ pseudocode اللي قبل شوية
جابه وحطه هاي بدأ بـ function اسمها expression
استدعى term ونسخ مين؟ نسخ الـ rest شايفة ما استدعاش
rest احنا قبل شوية كان بيستدعي rest الآن بطل يستدعي
rest فراه عملها copy paste وإيش ونسخها زي ما هي
شايفة كيف هي نسخ بس لحظة إيش ملاحظة صغيرة، في الـ
grammar كنا نكتب هنا print، print صح؟ مش print
that، الآن أنت بدك تطبيقها بالإجابة، كيف بدك تعمل
print؟ فالآن عندك حرية الخيار، بدك تطبعي على ملف،
بتطبعي print على ملف، بدك تطبعي في الـ console،
بتطبعي في الـ console، هذه الشيء بترجعلك يعني هذه
عمر تنظيمي المهم .. طب إيش هيطبع خلاص الـ code لما
أنا استدعيه؟ هيطبع الـ postfix انتبهي عشانك أنت
بتلاحظي أنت بيحط الزائد بعد عملية الـ operation
بيقولك اطبعي زائد الرقم بعد الرقم اطبعي رقم فلو
احنا اتبعنا كل الطباعة اللي صارت هنجيب نطبع إيش؟ الـ
postfix عشانك أنا إيش بقول؟ أنت قاعدة تنظم الـ code و
تعمل عملتي الطباعة وين؟ عملها في .. فبتشوفي بعد ما
يخلص التنفيذ إنو إيش طبعلك للـ infix في الملفظ الـ
postfix لو بدك طيب احنا لسه ما شغلناش دري بالك
عملية الـ parsing أنا لسه قاعدة بهيئ الـ parser أنّه
هي الـ functions اللي بتعمل عملية الـ parsing عملية
الـ parsing هتم من الـ main كمان شي و هشوف كيف بس
الفكرة تبعتي أن كل الـ code اللي كان قبل شوية بـ
pseudo code أجهزي ما هو قاعدة في الـ Java بدون مشاكل
بس جوا الـ class قاعدة، يعني مش الـ قصة الصعبة تمام؟
المهم بعد ما خلص من الـ expression إيش تتوقعي
حنلاقي؟ حنلاقي tear تعالي نشوف code الـ tear، هاي
code الـ tear تتذكري الـ grammar تبع الـ tear؟ ال
grammar تبع الـ term كان كام جملة كام production
كانوا .. كانوا عشرة مش كان zero واحد اتنين تلاتة
لغاية تسعة بدل ما أنا بالظبط بدل ما أنا أعمل if
lookahead تساوي zero if print zero match zero if
lookahead one match one بدل أعمل عشر مرات ايش سوى
تقال طلع ايش سوى أنا قلت باختصار هل الـ lookahead
digit وهذه جاهزة وموجودة في الجابع هل الـ look
ahead digit ليش؟ لأنه احنا قلنا الـ syntax بتاع الـ
language بتعامل مع ايش؟ digits يفصلهم زاد أو ناقص
فلو كاتب حاجة غير الـ digit المفروض مش في الـ syntax
المفروض يكون غلط عشانك ايش بنقوله else يعني إذا مش
digit ايش بيكون النتيجة؟ error يعني افترضي أنا أول
ما بديت حطيت حرف H كـ initialization مثلا هيجرها ..
طب هاد الـ H مش digit بطلع على طول ليش بقولي error
خلاص شوفتي كيف؟ طيب افترض أن أنا ضغط على تسعة
digit هيدخل جوا when الـ if condition لأن بالفعل هي
digit ايش أنا بدي أقوله عند جوا الـ digits؟ ايش
رايك ايش دي أقوله؟ لو قلتله match و print راحت
فقدامي خيارين يا بعمل temp و بخزن خيمة الـ
digitized وبعدين بعمل match وبعدين بقوله print
يا إما قلنا المرة اللي فاتت أنه لو طبعنا جابل مش
هتفرق و أثبتناها المرة اللي فاتت وبالتالي ممكن
أقوله print بعدين match لأنها مش هتفرق عارفة لو
كانت بتفرق ممنوع أعمل حركة يعني كان لازم تمت
استخداميها لكن احنا شوفنا المرة اللي فاتت لو طبعت
قبل الرقم هيظل both tricks المرة اللي فاتت منها
عشانك تطلعي سوا قال اطبع في الأول وبعدين ايش أعمل
matching طيب سؤال صغير ليش بحطلي car قبل look
ahead لانه .. ليش casting؟ لأنه طالع هو ايش معرف
فوق look ahead ايه معرفه انتجار، مظبوط؟ طب ايش
بيصير لما أكون أنا معرف الـ X انتجار و أجي أعمل
زائد زيكي؟ طب هذا معرف انتجار، ايش بيصير؟ ايش
بتخزن في الـ X؟ بنفع، ليش بنفعش؟ ايش بتخزن في الـ X؟
بتخزن في الـ X الـ ASCII code بتاع الزائد الزائد ايه
مكان في الـ ASCII code؟ مثلا مكانه 70 بيروح بتخزن
جوا الـ X قيمة سبعين تمام؟ والعكس صحيح لو أنا عامل
Int X تساوي خمسين وجيت قلتله اطبع Car X لو قلتله
اطبع Car X ايش هيطبع؟ مش هذا رقم خمسين؟ هيروح على
الـ ASCII code عنده رقم خمسين؟ ايش الـ character
هيطبعه؟ فعادي جدا يعني حتى لو أنا ماعرفه انتجار و
قلتله يطبعليها كـ character بالحالة هذه بروح الـ
ASCII code يشوف شو الـ character اللي اقبال هذا
المكان وبطبعه والعكس صحيح لو أنا معرفه character
وقلتله طبعليها كانتجر بطبعلي مكانه في الـ ASCII
code هذه المعلومة لازم تكون عارفها في البرمجة مافي
مشاكل هو أنا معرف الـ lookahead ايش معرف الـ
lookahead؟ انتجار وبالتالي لما نخزّن في علامة الزائد
ما تخزّنتش زائد تخزّن مكان الزائد الـ ask code
تبعها طيب أنا لو قلتله اطبع الـ lookahead وسكتت
هيطبع رقم الـ ask اللي فيه الزائد طبعا لأ بدي أشوف
الزائد في الطباعة عشان الـ post fix عشانكش قلتله
حولها هذه القيمة لـ card ففي الحالة دي مش هيطبع في
البرمجة هيطبع الزائد مضحك؟ يعني مافي مشكل بين الـ
car يكون انت أو car خلاص يا بتعامل مع الـ ask code
يا بتعامل مع الـ character it's up to you كيف أنت
في البرنامج تطلبي تمام؟ عشان هيك هي طلعي إيش قال
اطبعي عارف لو مش كاتب الـ car هاي؟ ايش كان هيطبع الـ
ASCII تحت الـ digital أو تحت الـ character اللي يعني
لما أقوله أطبع car خلاص على طول بطبعه كـ character
طيب الآن الـ term من صفر لتسعة طيب شو المشكلة
فالمفترض أنه هنا مش هيطبع زائد أو أكثر لأ قصبر
يعني قصبر بسمعها شوية أنت لإننا نميز بين شغلتين
أنا مش بس عندي أرقام أنا عندي أرقام وعندي إشارة
زائد وعندي إشارة minus مظبوط ولا هذي اللي بتكون
فاهمها في الأول 100% الـ look ahead هذا في النهاية
فالـ look ahead لأن ممكن ياخد digit وممكن ياخد
إشارة زائد أو ناقص الآن أنا طالما خلاص عرفته من
الأول انتجار خلاص لو وديتة أنا رجم 9 مثلا هيسجلها
9 كـ number لإن عامل إن هو انتجار لكن إذا فضلته
زائدهيروح ask a code هذا الزائد وان ما كانوا خمسين
بكتب جوا خمسين خلاص هيك .. هيك يصير الـ lookahead
تخزن قيمها الآن في موضوع الطباع اشي تاني أنا قلتلك
أنا كيف بتخزن الان هذا القيمة integer الـ lookahead
أنا قاعد أقوله اطبعها طالما ما عملتش casting إلا
هيطبعها كـ integer حتى لو زاد هيطبعلي خمسين مكانها
أو تلاتين حسب مكانها لكن إذا حطيت أنا لأي رقم
integer بيرجوسين كار اطبعليه كـ character في الحالة
هذه مش أنه هيقولي غلط هيروح يشوف هذا الرقم 50 ولا
60 الـ value اللي جوه الـ look ahead ايش عاجبالها
character ويروح يطبعلي صوت الـ character تبعها، هيك
بتشتغل البرمجة واضحة؟ فما في أي تعارض أنه أنا معرف
الـ look ahead انتجر وقاعد بخزن فيه زائد أو ناقص أو
ضرب أنا مش هلاحظ القصة هي لأنه internally جوا في
الـ look ahead هيحط قيم انتجر لكن لما أنا بقول
اطبعها كـ character البرج هيطبع ليها زائد وناقص كـ
character فمافي عندي أي مشكلة تمام؟ فهي كل القصة
في الموضوع اللي هاد طيب على كل الحوار بعدك ايش
عندي؟ function مين؟
الـ match الـ match ايش بتسوي؟ بدها تتأكد إنه اللي
جاي اللي المفروض يكون مكتوب ويشوف المكتوب الـ look
ahead بيساوي بعض ولا لأ إذا بيساويش بعض على طول
الطلعش قاللي إذا بيساويش بعض Error صح؟ بيساويوا
بعض، ايش نسوي؟ مش بده يرجع للاستدعاء والـ look
ahead ايش بيصير فيه؟ مش الـ look ahead يمشي خطوة؟
ايش عم بيمشي خطوة؟ مش بده يشوف الـ token اللي وراه؟
طب أنا ما عنديش الآن ملف يجيبلي tokens فايش قلتله؟
اجرها من الـ user، بهمش، ماشيها من الـ user شوفت كيف
الآن هنصير من وين ناخد كل مرة الـ tokens؟ من الـ
user لإنه ما عنديش function الـ lexical اللي بتجيبلي
الـ tokens فكل مرة ما بده token هتلاقيه بيقولك أنت
دخليه لنا يا فهتصير أنت لما تعملي هذا الـ code
تبرمجيه هتصير تشتغل شغلتين تصير قاعدة بتدخلي في الـ
infix تسعة ناقص خمسة زائد اتنين هو قاعد بيفحص
الأرقام اللي بتدخليها وبكتب علي جبالها الـ bossfix
مش أنه ملف مكتوب وراح جاب منه التسعة وجاب منه
الناجس وجاب منه .. مش هي قاعد كل ما بده token
بيقولك تفضلي دوسيفانت تدوسي تسعة هيطلعلي كثيرة
هاتي كمان minus الـ minus صح هاتي كمان خمسة الخمسة
صح هاتي كمان ضغط غلط بطلعلي syntax error طول ما
أنا قاعد بشتغل معاه بعطيه قيم صح هو قاعد بشتغل
parsing وا ايش بطلع بطبع الـ boss fixed الحاجة اللي
أنا دخلتها طبعا هنا ملاحظة صغيرة أنه ممكن أنت لو
عملتي نفذت الـ code هذا تلاقي أن الـ in والـ right
في نفس المكان في نفس الـ console قاعدين بيشتغلوا
فممكن تتخربطي فأنت عشان ما يصيرش مشاكل ممكن تعدّي
على codec انه يقرأ ماشي في الـ console ويطبع في
مكان تاني بعيد عشان ما تتخربطيش أنت لو نفرتي هذا الـ
code هيقولك هتلاقي رسالة، دخل خمسة، دخلت خمسة طب
ما طبعت يمكن خمسة شوية خمسة، هتلاقي خمسة وخمسة
جانب بعض، لأنه قاعد في نفس المكان، بيجرى وفي نفس
المكان بيكتب، فممكن ما تلاحظيش كيف حولت، فأنت عشان
تشوفيها بشكل واضح، لو جيتي بس عدالتي على الـ code،
موضوع الطبعة طبعته في books تاني، مش في نفس الـ
books أو في ملف تاني، بكون أريح، بيبين بشكل أوضح
الـ code واضحة؟ طيب الآن لسه لحد الآن يا بنات أنا
ما فعلتش عملية الـ parsing أنا بس أسست الـ code اللي
بيعمل الـ parsing وكان عملتي تأسيس simple خالص كل
الـ functions بتاعت الـ pseudocode كلها حطيتها وين؟
جوا الـ class لكن لسه ما استدعت ما عملت creation
ما سويت parsing تعالي نشوف كيف الـ parsing بيتم كيف
أنا بسويه كيف بيشتغل الـ code هي الـ Java طبعا هيها
تبدي الـ function main عادي زي ما بتعمليه شايفة ايش
أول سطر؟ عملت object سميته parse من نوع parser
عارفة بعد تنفيذ هذا السطر ايش بيصير؟ بيكون راح الـ
constructor والـ constructor بيكون بده قيمة للـ
lookahead فبيكون ساقلك الـ keyboard دخليلي قيمة الـ
lookahead لأنه بتنفيذ السطر هذا بيكون استدعى الـ
constructor automatic ولو طلعت تشوف الـ
constructor قاعد بيستنى منك lookahead لأنه فيه cin
فوق read هيا ده اللي نسيين
شايف الـ constructor شو بيقول لك؟ بيستنى منك إيش؟
بغطى على أساس يبدأ يلقط الـ look ahead الأولاني
عشان يبدأ إيش يتغير؟ عشان هيك أنت بمجرد بتعمل
الجملة هذه في الـ main خلاص بيكون بيستنى منك إيش؟
الـ cursor عندك هنا دخلي character عشان يبدأ كـ look
-ahead ابتدائي الآن start and look-ahead موجود كيف
عملت الـ parsing؟ بدك تستدعي الـ start symbol
اللي هو الـ start function مش هيك؟ اللي هي مين في
حالتنا؟ expression عشان إيه؟ إيش قال لك؟ قال لك هذا الـ
parse ضد expression خلاص عارفة بس في هذه المنطقة
خلاص هيبدأ عملية parsing لأن استدعى الـ start
function اللي هي start symbol اللي هي الـ expression
هذا هيفوت يقرر يـ look ahead مع الـ .. مع أول حاجة
موجودة عنده في الـ code لقاهم شبه بعض هيطلق مني في
الـ keyboard إيش؟ هات كمان look ahead لقاهم غلط إيش
بيسوي؟ بيطلع فطول ما أنت الآن ماشي معاه في الـ
keyboard تدخل قيم صح تسعة ناقص خمسة اثنين بيضل
قاعد الـ bars هذا إيش الـ expression اتنجل وين؟ في
الـ pseudocode اللي كنا عاملينه قبل زي ما اتعلمنا زي
ما عملنا simulation للـ four احنا مرة فأتعلمنا
simulation للـ four صح ولا لأ؟ عشان شباب مت الـ
parsing فنفس الفكرة بتقول خلاص ماشي مش هيوقف إلا
كاف يوقف أدخل إشي غلط بيطلع بيقول syntax error طول
ما أنا قاعد بدخل إشي صح بلاقي بيطبع الـ postfix صح
بدون مشاكل طبعًا زي ما قلت الـ code هذا code بس
ابتدائي ممكن تعدلي عليه وتظبطيه وتدخلي يوغاف إذا
حاطط له كذا يوغاف إذا عملتيه يعني بتقدري تعدلي عليه
هو حاطط زي أساس بس أنه جلب كل الـ pseudocode السابق
خديه حطيه جوا الـ class زي هيك وبعدين من تحت من الـ
main اعمل صورة من هذا الـ class استدعي الـ function
الأساسية بتبدأ عملت الـ parsing طبعًا مش هقدر أستدعي الـ
function الأساسية إذا الـ look-ahead إيش موجود عشان
إيه كان يعمل في الـ constructor look-ahead وأدى
قيمته ابتدائية خلصناها طب في المستقبل كيف عملت الـ
look-ahead هتكون؟ مش هعمل عملية cn هنا وهنا في الـ
match اللي جاب لي شوية ولا هعمل في الـ constructor
cn هتصير أقول له استدعي الـ function lexical اللي بيجري
من الملف فديك الـ function lexical هتروح تفتح الملف
وتدور وتلاقي الـ token وتقول له هاي الـ token تفضل
هاي الـ token خلاص يا طيني العافية فكل مرة بدك look
ahead هتصيري كل مرة تستدعي مين؟ الـ lexical اليوم
احنا استعاد معنا بإيش؟ بالـ user بس هي اقتصار
الفكرة واضحة هيك أنا خلصت هذا الـ code ما فيش إشي
لأن بدنا ندرسه المهم فيه أسئلة تفضلي فوق التاريخ
تفضلي في الـ S digit بيعمل match بتاعة إيه؟ الـ match
ده الـ S digit؟ سواء يوينا الـ S digit اه أول شي
بتبعد الرقم وبعدين بيعمل له match في الـ S digit مار
إيش سؤالك؟ اه كيف يعني يعمل له match مع مين؟ بتقول
المفروض يكون مكتوب مع .. الآن معلش شوية بس اصبر
عليك الآن أنا كاتب رقم مثلًا تسعة خلاص؟ لجاه هو
digit، مظبوط؟ الـ grammar إيش كان يقول لي أسوي؟ الـ
grammar ارجع للـ production، إيش كان يقول لي؟ مش هذا
برمجة فعلية للـ grammar الموجود لما كان يقول لي الـ
term بيطلع تسعة مش كنت أنا أعمل action أprint تسعة
أنت كودك اللي بتعمليه مش ع كيفك بتعمليه أنت كودك
اللي بتعمليه بتعمليه بتنفذ لـ grammar لأن احنا
اكتشفنا مسبقًا زمان إذا نفذنا لـ grammar برمجناه
automatic هيطبعوا يشتغلوا صح احنا كنا زمان بنفكر
كيف نعمل لـ grammar اللي بيحول صح فإذا برمجت هذا
اللي بيحول برنامجي خلاص هيشتغل زي ما كان الـ grammar
بيسوي مش هيك اتفاجأنا؟ طيب، الآن أنا عندي قمر إيش
بيقول لي؟ بيقول لي لما أنا الـ term يطلع التسعة بدي
إيش أسوي؟ اطبع تسعة ليه شوفوا اطلب طباعها؟ عشان
أقدر أشوف الـ boss fixed or infixed تمام؟ الآن احنا
قلنا المرة اللي فاتت لو أنا طبعت قبل ولا بعد
الرقم مش هتفرق معايا تمام؟ مية مية الآن جينا الـ
as digit فأنا طبعت قبل، الآن خلاص إيش هنطبعنا؟
خلصنا التسعة لقيناها موجودة ومشينا، إيش نسوي بعد
هيك؟ مش المفروض إنه نشوف الـ look ahead اللي وراه؟
احنا بعد ما بنطبق، مش لازم أمشي أكمل ولا أطلع من
البرنامج، مش بدي أمشي أشوف الـ look ahead اللي
وراها، مش بدي أقول هذا البحث تم وهذا الرقم موجود
وما فيش مشاكل، الآن افطر، امشي يا look ahead، افحص
الناس المكتوبة ورا من وين الفحص هذا بيمشي؟ من الـ
match فأنا عشانك ببعت له خلاص التسعة اتأكد إنه هي
نفس المكتوب نفس اللي بده ييجي اتأكد الـ match الـ
match إيش هيسوي؟ هيمشي خطوة فلازم أعمل الـ match
باختصار مش بس عشان يتحقق وعشان يمشي الـ look ahead
للي وراه أنا قصدي إنه match مثلًا للتسعة زمان تقول
طب ممكن يكون ماشي ما هو مخزن هنا الـ look ahead إيه
في طفلة الـ look ahead خمسة؟ إيه معناه؟ إيش هيطبع
هنا؟ خمسة صح؟ الآن إيش قلت له match؟ أنا إيش
بعدت له؟ الخمسة فالآن هيروح يقارن هناك الـ match
الخمسة ويشوفها digit ولا مش digit، مظبوط ولا لا؟
هي الـ match، طلعت الـ match أنت هي الدكتور اللي كتب
الـ user مع مين قلت قارنها؟ مع مين؟ مع الـ
lookahead اللي حاليًا هيدخلها المبرمج؟ مع مين؟ الـ
user، هتقرر مع هذا؟ هتقرر مع الـ TV هذا؟ طب ما نقول
هذا الكلام، اه، إيش اللي مش واضح عندك؟ الـ TV في
المهاتف الشمالي، هي مين؟ اللي المفروض تكون مكتوبة،
صحيح مع ميزة القارن، بس اصبر، مع الـ lookahead اللي
بيدخلها الـ user الآن، مظبوط إذا الـ user الآن افترض
الـ user عشان أفهمك الصورة أنا قلت له match 5 صح؟
اجى الـ user لقى أن الـ lookahead اللي أنا دخلتها مش
5 زائد صار غلط المفروض يجيني digit الآن لازم يكون
مكتوب digital عشان يمشي من هذا الفحص ويكمل إيه لو
أنا كنت كاتب زائد؟ إيه لو أنا كنت كاتب فتحة قوس؟
هيقول لي خلاص أنت مش كاتب زي ما هو مطلوب digital
أنت كاتب حاجة ثانية كأنني كاتب تسعة زائد قوس أو
تسعة زائد زائد فمش هيكون صح إلا إذا هو كان كاتب
كمان digital طب كاتب digital digital إيش المفروض
يجينا بعد هيك؟ إشارة مثلًا فبقول خلاص اتجوزنا ارجع
كم قولك شوف إيش لازم ييجي بعد الـ digital واضحة ولا
لسه؟ إذا مش واضح هاي السؤالية مش مشكلة كيف
رقمت يعني؟ يعني أنا الرقم اللي هيجي المفروض يكون
مكتوب يكون عرفاه أقل من الـ .. لأ ليش؟ أنت تبهي أنت
.. هنا أنت قعدت له إيش؟ نفس الرقم اللي عندك،
مظبوط؟ ليش؟ لأن أنت عندك الـ undigit افترض أن الـ
look ahead كان خمسة مثلًا الآن إيش قلنا match تعال
على match نفذه في match إيش أنا بقول له هل الخمسة
تكافئ الـ T اللي عندي هنا؟ الـ T شو قيمة هالـ T هنا؟
شو قيمة هالـ T؟ اللي هي الخمسة هذه، مظبوط؟ إيش
اللي .. عفوا اللي اللي قاعدة؟ إيش هذا اللي قاعدة؟
أساسيًا هتكون خمسة في مثالي لأنه كنت دخلتها جبله
لما وصلنا هنا كانت لك هذه داخلة فهي دائمًا أول مرة
هتكون شبه بعض أول مرة لأن الهمزة بارك هي خانة مع
نفس الخانة بتكون فدايمًا بتكون واحدة أنت المشكلة وين
بتبين معك أكثر لو كانت الإشي له structure مقاومة
أكثر من واحدة يعني زي لما بقول أنا مثلًا الـ F لازم
يجي فرقة فتح الـ ghost لازم يجي فرقة فتح الـ serious
ففي عندي سيرة فالـ F الأولانية لازم تكون دائمًا زي
بعض مش أنت أصلًا اخترت الـ production بناء على الـ F
ففي أول match بيكونوا زي بعض لكن اللي بقعد هيك
بيصيروا يتغيروا أنا عندي في سؤالي هذا للأسف كلهم
إيش؟ من واحد فدائمًا هيطلع زي بعض لأن الـ look
ahead اللي انقرت هي نفس الـ look ahead اللي انبعثت
في المثال هذا لأن أنا من digital فدائمًا هيطلعوا
نفس بعض فهمتي؟ لأنه بيكون انقرت قبل طيب تمام
واضحة؟ طيب الحمد لله الآن خلونا نتابع .. في أي سؤال
على هذا الـ code .. هذا البرنامج طيب خلونا الآن
ندخل على الدرس المهم جدًا .. هذا المفروض خلص بسرعة
المفروض الـ code هذا ما اخذناش فيه وقت لأن من القصر
احنا عارفين اللي بيسيده الـ code المرة اللي فاتت والـ
المفروض اليوم على طول إيش بس حطيناها في جابة و
خلصنا ما شرحناش في إيش كثير لكن يالا لعله خير طيب
خلونا ندخل في الدرس المهم موضوع الـ lexical
analysis متذكرين الـ lexical إيش بيسوي؟ ايوا
بمسك الملف بيشتغل في الملف وبروح بيطلع لي كل الـ
tokens اللي موجودين وين في هذا الملف طيب تعال
نشوف إيش المهام اللي بتقوم فيها الـ lexical طبعًا
إحنا يا بنات إيش أنواع ال tokens اللي اتفقنا ممكن
نلاقيها في المرحلة هاي؟ شو هم ال tokens؟ كأنواع
هتقوليلي ممكن نلاقي number خليني نتفق على ال
tokens اللي نتعامل معهم ممكن نلاقي number إيش أنا
بقصد number؟ يعني أنا ممكن أكون كاتب في الملاف 556
و 21 ممكن أكون كاتب أرقام و بنفرض هنا الأرقام
constant مش فواصل مش real مش float خلاص الأرقام
اللي هتتعامل معها أرقام إنتجة إذا ال token المحتمل
الأولاني يكون عندي number طب هل في token تاني؟ اه
ممكن ال token يكون identifier إيش بقصه ال
identifier؟ يعني يكون مثلا كلمة position كلمة rate
كلمة initial X Y whatever هذا برضه كل واحدة واحدة
اسمها identifier token وممكن ال token يكون كمان
keyword يعني زي ال F زي ال Y زي ال D زي زي زي هذه
كلها الكلمات ال break الاخرى كلها كلمات محجوزة
ممكن تكون token بعد هدول هنفترض أن أي character
قائم بذاته هو token خلاص يعني هي فرضيتنا الآن في
المرحلة هذه يعني الآن إذا هو مش number وإذا هو مش
keyword وإذا هو مش identifier خلاص هو ال character
هذا الموجود لحاله بحاله token زي إيش مثلا؟ زي زائد
زي ناقص زي ضرب زي قسمة زي فتة قوس زي تسكيرة قوس زي
فصلة مربوطة فصلة عادية الاخرين طب حد بيقدر يجيبلي
مثال يقولي لأ طب مافي token تانيات غير هدولة مش من
character واحد من أكتر في حد بيقدر يذكرلي حاجة
يقولي هي كذا تاو أنا فرضت assumption قولت إذا مش
مش ID مش keyword مش number خلاص token قائم بذاته
في حد ممكن يقولي لأ مافي حاجات غير هيك زي إيش أو
الأكبر أو يساوي أفرض
يساوي يساوي أفرض له يساوي اه اه شوفتي يعني احنا لأ
ممكن يكون في tokens مكوّنين غير اللي انا قلتهم من
خانتين لكن احنا اليوم في ال code في ال section هذا
بدأوا يفترضوا هدول ازاي مش موجودين خلاص انه الأكبر
يساوي الأصغر كله character واحد لكن اكيد لو انا
بده أظبط ال code اللي هنكتبه عشان يعمل الحاجات هذه
بقدر أظبطه بس زي ما قلت في assumption بعدي في ال
section انه قال خلاص اعتبره ان ال tokens اللى عندي
ID, Keyword, Number وبعد هيك كل character قائم
بذاته لكن هاد فرضية مش حقيقية مئة بالمئة بدليل
يساوي يساوي أكبر يساوي صح ولا لأ؟ واضحى؟ مش
هنشتغل؟ فاهمين إيش بقول؟ أنا بأسس اللي بقوله مش
كمان شوية قولولي و hi و ديك طيبتعالوا نبدأ نشتغل
الـ lexical هيقوم الآن بمهمتين رئيسيتين المهمة
الأولى بده يريحني من ال spaces و ال new lines و ال
tabs و ال comments كل هذا بيشيله و يريحني منهم هذه
المهمة أساسية موجودة في ال lexical المهمة الثانية
اللي احنا عارفينها أنه بده يتعرف على ال token اللي
هو الوحدة الواحدة وياخده وإذا إله attribute يحسبله
ياه ويبعت للناس اللي بعتوله اتفضل لجينا token كذا
و attribute وكذا مثلا واحنا أخدناهم كلهم المعدودين
يعني لو لجي number هيبعت يقول لجيت number وإيش
يبعت معاه قيمته 25 .. 15 .. 200 .. حسب القيمة اللي
لجيها صح؟ لو لجي ID هيقول لجيت ID وإيش قيمته؟ يا
إما مكانه في الـ Symbol Table، الـ Pointer اللي
عليه، يا إما الـ Xيم المكونة إليه، الحروف المكونة
لهذا الـ ID نفس الفكرة، لو لجأ Keyword، حيكون
حروفه المكونة إليه I, F, Y, Do إلى آخرين طبعا
مالوش Attribute، لأن F هو نفسه F، لما يقول ل gate
F، ماخلص، مايدهش Attribute، ل gate Y، مايدهش
Attribute تمام؟ طيب لما يلاقي character قائم بذاته
token زي الزائد أو النقص أو الضرب أو القسمة مافيش
له attribute خلاص بقول له جيت زائد، لجيت نقص فهيك
هنتعامل احنا في هذا ال section لكن مانستغربش انه
لو لاجينا مثلا في مكان تاني انه عامل الزائد أو
النقص أو الضرب أو القسمة token اسمه operator في
الحالة هذه لازمش يضيف attribute عشان نعرف مين فيهم
لكن على حالتنا ان احنا اللي سهلة كل character قائم
بذاته token مايدوش attribute باختصار في الحالة
تبعينها إذا وظيفة الـ lexical التانية بعد ما بيشيل
ال spaces و الأمور هذه كلها أنه يعرف شهو هو ال
token و يبعته للجهة اللي ورا مع ال attribute لو
كانه attribute باختصار واضحة؟ طيب تعالوا نشوف الآن
كيف ال lexical بيشيل ال spaces كيف بتخلص منها و
بريحني منها طبعا أكيد لازم نكون احنا فاتحين الملف
وأكيد لازم نكون نبدأ نقرا إيش؟ في ال characters مش
هيكرا عشان نقدر نعرف ف ال بيك هذا يا بنات اللي في
ال code ال بيك هذا وانه يكون واقف على أول
character على أول character يا في الملف يا أنا
ممكن أكون جيبت من الملف على بفر هذا هشوف القصة
بعدين المهم اعتبره الآن في الملف مؤقتا على أول
character في الملف الـ peak واقف، ماشي الحال، الآن
إيش بيسوي ال code؟ طبعا أنتو مستغربين أن ال four
أن تو متعودين تاخدوها ال four تلت أجزاء، مظبوط أو
لا؟ أنتو بتاخدوا ال four على أساس إشي فاصلة
منقوطة إشي، فاصلة منقوطة إشي، مش هيك؟ أنا بس ده
فهمك ال four الإش اللي بيكون في الجزء الأول هو
عبارة عن إيش؟ عبارة عن جملة لل initialization يعني
بيطبقها لمرة واحدة في ال for أول ما بفوت ال for
إيش فيها بيطبقها و عمري مش مابرجعلها إيش بعد اليوم
خلاص بيطبقها مرة واحدة اللي هنا ال condition يعني
أفوت في ال loop ولا مافوتش في ال loop على حسب ال
condition وبالتالي لو هذه مش موجودة معناها دائما
هيفوت في ال loop الجزء الأخير هذه يا بنات هذه
الجملة اللي هان تنفذ في آخر ال four في آخر ال four
قبل ما يرجع إيش مكتوب هان بنفذه يعني أعرف لو أنا
بدي أحول هذه إلى while إيش بسوي؟ هذه مثلا a,b,c
لو بدي أحولها إلى while باجي بكتب a قبل ال while
بعدين باجي بقوله while b وبعدين أخر إشي في الكود
c لو بدي أعمل ذلك شوفتي باختصار يعني هاي بتكون وان
موجودة في الآخر تنفذ وبعدين بيرجع يشوف ال B يدخل
ولا مايدخلش الآن نجي لل four اللي موجودة هنا لحظة
أول إشي سايبها فراغ بقى أنا مش عامل initialization
ما بدوش يبدأ بحاجة معينة وال condition سيبه فرارة،
إيش يعني ال condition سيبه فرارة؟ يعني كل مرة
هيفوت في ال loop زي .. زي wildly true يعني مش هطلع
من ال loop إلا ب break أو ب error أو ب return
طالما هو مش حاططلي شرط يعني كل مرة هفوت جوا ال
loop مش هطلع إلا بالحالات اللي .. اللي بتطلعني
خالص اللي زي ال exceptions زي ال errors زي ال
return أمور هذه بس اللي بتطلعني هذه الجملة هتنفذ ..
مش هفهاش في الأول هذه بعد ما بيخلص ال four كلها
بنفذها و بيرجع الفور طبعا؟ طيب الآن ال beak .. إيش
قلنا ال beak واقف على مين؟ على أول character في
الملف على أساس بيبدأ يتعرف عليك token صح ولا لأ
عدش بيقول لي .. بيقول لي إذا هذه ال beak تمام؟ طبعا
هو الآن body بيك معينة لسه هذه ال beak هتتنفذ كمان
شوية و هيمشي علي وراها هو body بيك معينة إيش
بيقولي؟ بيقول إذا هذه ال beak مالها blank فراغ
space يعني أو tap إيش بيقولي؟ do nothing ماتعملش
شيء إيش يعني ماتعملش شيء؟ يعني لا هيفوت في ال
else؟ ولا هيفوت في ال else؟ وبعدين إيش هينفذ؟
هينفذ high و يرجع، مش ايه؟ لأنه high بتتنفذ في
الآخر، قولنا شو بيقوله عاد هنا؟ بيقوله الآن خلاص
ال peak high تمشي خطوة لأنه كانت space، مديش أعمل
إشي فمشي عالجنبها و رجع تاني، افترضي جنبها space مش
هيدخل في ال else ولا في ال else F هذه و هيمشي عنها و
يرجع .. و هيمشي عنها و يرجع .. و هيمشي عنها و يرجع
.. و هيمشي عنها و يرجع .. و هيمشي عنها و يرجع .. و
هيمشي عنها و يرجع .. و هيمشي عنها و يرجع .. و
هيمشي عنها و يرجع .. و هيمشي عنها و يرجع .. و هي
تمام؟ إيش بيسوي؟ المفروض مايسويش أشي كتير بتعنيش
بيقول إيش بيسوي بيقولك لو كانت ال peak is in U
line يعني slash N إيش بده أعمل؟ قال بس بدي أزود
عداد بواحد عداد السطر ليش بيزود عدادها بواحد؟ لأنه
إذا بتتذكروا في ال compiler لما مكشف خطأ بيحاول
يعطيكي رقم السطر يقولك في السطر العاشر في السطر ال
11 في السطر الخمسين إذا ضروري ال lexical كل ما
يشوف أنه نزل على سطر يسجل معلومة أن أنا سلت في
السطر الثاني أو الثالث أو الرابع
شفتي كيف؟ فلو أنا مش عامل هذه الجملة وكاتبها هنا
blank or tab or new line do nothing ممكن يكون نزلت
عشر أسطر ومش هعرف أنا في أي سطر فهنا قالوا خلاص
عشان نعرف السطر اللي احنا فيه قالوا إذا الـB كان الـU
line، هذا الـLine اللي هو بيكون ابتداءً بـ0، إيش
بزوده؟ بواحد فلما لقينا line زوده بواحد، بعدين
إيش؟ مش هيفوت هنا، هيرجع وين؟ كمان مرة، فتخيل أنت
دايسة بعد عشرين فراغ، دايسة عشرة الـ new lines عشرة
انترز، إيش هيصير؟ في العشرين فراغ مش هيعملش شيء،
بعدين هيصير كل انتر بيلاقيه بيزوّد عداد، بس بيعملش
شيء، بيرجع، line، new line، بيرجع، new line، new
line، new line، new line، بيصير بس إيش؟ أيه عندهم،
مش أكثر، لكن هو في الآخر do nothing، هذا بس عداد
طيب السؤال متى بده يفوت على الـ else؟ هتقوليلي
هيفوت على الـ else بشرط مايكونش space ولا tab
ولا new line بيفوت يعني بالعربي لو الـ beak لقى أي
character خلاص هيطلع من هذه الـ loop ليش؟ ليش يعني
break؟ يعني افترض لقى .. افترض لقى لقى أو لاطرمش
هيفوت في الـ F ولا في الـ else تحت الـ new line و
هيفوت في قد إيش؟ بقوله أنا بقوله اتفضل خلاص اطلع أنت
من كل الـ four يعني ملاحظتنا المهمة إنه مش هيطلع من
هاي الـ four إلا إذا الـ beak كان فعلياً واقف على
حاجة ملموسة بداية token باختصار طول ما الـ beak على
حاجة مش بداية token فراغات الـ new lines tabs بمشي
عنها أول ما يلقوا بداية مشروع token يعني أول ما
يلقوا character بتطلع من هذه الـ loop طبعاً إيش بتوقع
أشوف بعد هذه الـ loop بتوقع أشوف فحص هذا الـ character
لأي token هذا الـ character لـ number هذا الـ
character لـ digit هذا الـ character لـ ID أكيد هتسيب
فحصات هتشوفها كمان شوية لكن احنا الجزء الأول سهل
مافيش فيه إشي واضح كيف عمل skip للفرغات و الـ spaces
و الـ new lines طبعاً هتلاقوا في أسئلة الكتاب في الـ
exercises بيقولك افترضي بإننا نعمل skip مثلاً للـ
comment لأن هذا برضه من مهام الـ lexical بس مش
هعملها في هذا الـ code بالنسبة لك مش هتكون صعبة ليش
لأنه أنت هتقولي مش هو امسك الـ character هتقولي إذا
هذا الـ character ي slash هتجري الـ character اللي
ورا إذا كمان ي slash هتقوليله خلاص ضلك امشي امشي
امشي لغاية ما تلاقي slash n جديدة عشان نبدأ نعيد
من الأول الشغل ليش؟ لأنه احنا قلنا إيش يعني comment
يا بنات؟ الـ comment بطريقتين إذا أنت عاملة
slashين كيف بشتغل؟ كله بيرتمها و بنزل على السطر
الجديد و ببدأ يفحص فأنت قادرة تكون تكملين في code
هنا إيش تقولي اجت slasha اجت slasha خلاص طول ما
شوفناش slash in لأن slash in معناها new line طول
ما شفتش الـ slash in اعتبر كانوا space مافحصوش أول
ما شوف slash in خلاص بطلع من بتاعة الـ comment و
برجع عشان نشوف إيش اللي مسكها في السطر الجديد طبعاً
بعض البنات يقولوا طب ممكن الـ comment تكون slash
نجمة اللي هي بتاخدها نفس الفكرة إن لاجينا slash
لاجينا نجمة الآن إيش يصير؟ أعمل skip كل character
ارمي ارمي ارمي ارمي لما ألاقي نجمة و بعد النجمة
لاجي slash جديدة خلاص أعمل كله skip فعملياً أنت كيف
تقدر يتحل الـ exercise مش صعب كتير إذا أنت فهمت
اللي أنا قاعد بقوله كيف نكشف الـ .. الـ tabs، كيف
نكشف الـ new lines، كيف نكشف الـ identifier، كيف
نكشف الـ .. الـ number، فإذا أنا متأكد فهمتي اللي
أنا بدي أقوله كله على أهدولك، هتعرف تدبري حالك في
موضوع إنه شيل الـ comments وشيل الـ .. الـ .. اللي هي
سواء بالطريقتين، فاهمين إيش بقول والله أنا بصبح
في وادي وأنت في وادي؟ طب الحمد لله على العالمين، و
اللي ورا أسألكوا عشان أتأكد إنكوا فاهمين؟ أنا حابب
أسألكوا لإن أنا .. مش مقتنع اللي يقول فاهم .. اه
.. عشان نشوف .. اهتمام الشراع الفاضي ..
تهاني اليازرآية هاني فاهمين؟ نقول أنا بدي بس موضوع
الـ comment اللي اتكلمت فيه تقدر تقديه لي أو
تشرحيه للبنات إيش موضوع الـ comment بالظبط فده احنا
حكينا بوضعنا إنه نفتقر و .. اللي بننصب الفكرة فو
احنا حكينا به الـ space وبه الـ comments اللي
موجودة عندنا فهنا كتبنا إن الـ code إنه إذا لقى اللي
هو الـ space مايعملش أي إشارة فاحنا حكينا كمان هذا
معمول وجاهز إن الـ space بيشيلها احنا سؤالنا ومش
عامل حسابه في هذا الـ code إنه لو في comment لكن في
exercises الموضوع هذا بيقول افترض فيه comment في
الحالة دي إيش دي تسوي؟ كيف دي أشيل الـ comment؟ افترض
الـ comment وقامز الـ slasher كيف دي أشيلهم؟ لو بدأ
أبرمجها؟ يعني
كيف بدأ أبرمجها هنا؟ في المنطقة هذه؟ إيش بدأ أدور؟
عليه أدور؟ إذا لقيت slashين إيش بتسوي؟ بتقوله
خلاص اهمل كل الـ characters لغاية ما توصل للـ new
line الجديدة لو لقيت slash نجمة بتقوله اهمل كل الـ
characters حتى الـ new line يهملها لغاية ما يلاقي
نجمة وبعدين ارجع كمل كودك بس مية مية خلاص أيه
النقطة اللي بيجب تكون واضحة عليكم على أممم خليني
الآن ارجع أكمل أحسنتي ممتاز ريحت اللي حواليك لإن
كنت حاجة أسألهم المهم تعالوا نشوف .. نكمل .. البنات
ضلوا مصحصحين معايا لإني في أي لحظة ممكن زي هيك
أسأل، يضلوا مركزين معايا للآخر، أنا كلامي واضح،
اللي مش فاهمة إشي، اتوقفني، طالما أنا قلت مين
بيهنده سؤال وماحدش سأل، بفترض إنك فاهمة، ساعتين
الحاجة أسأل على طول تبقى اللي مركزة معايا اللي يرضى
عليكِ، تمام؟ طيب، الآن تعالوا نكمل، إذا احنا كل
اللي سويناه لحد الآن فقط حاجة واحدة في الـ lexical
أنه شيلنا الـ .. شيلنا الـ spaces و الـ tabs و الـ new
lines واتكلمنا لو كنا بدنا نشيل الـ comments إيش
ممكن نسوي، طيب الآن لما نجي هنا نخلص من هاي الـ beak
وين واقفة بتقول لما طلعنا من الـ four هذه الـ beak
وين واقفة؟ هتقوليله الـ beak واقفة على بداية مشروع
token أنا لسه مش عارف مين هو هتقوليله الـ beak لأن
locked في character غير الـ space و الـ new line و
الـ tabs غيرهم أنا لسه بدي أشوف هو شو هذا عشان أقدر
أعرف شو الـ token اللي موجود تمام؟ بس قبل ما نروح
نشوف الـ code في موضوع أنا في غاية الأهمية لازم
أكون مستوعبه اللي هو reading ahead أنا لا يكفيني
وجود الـ beak لحاله لازم مرات أضطر أمشي لقدامي شوية
عشان أقدر أكشف الـ token ليش؟ افترضي الـ beak واقف
على رقم 5 خلاص قفتي أقوله لجيت number و الله أمشي
خطوة أشوف مشوارها هتمشي خطوة تشوف مشوارها لجيت رقم
اثنين اه معناه لسه صارت اثنين وخمسين امشي خطوة
كمان لجيت ثلاثة اه صارت خمسمية وثلاثة وعشرين فلا
إمتى بتضلني أمشي؟ المهم هضلني أمشي لغاية ما يبين
معايا حاجة مش number يعني أنا ممكن أكون كاتب 52
زائد 3 خلاص لاجيت حاجة مش number مش شرط space يا
بنات ممكن يكون أنا كاتب 52 فراغ زائد مسموح اكتب 52
والزائد على طول بدون space مسموح إذا أنا ما بقول
لازم آجي فراغ عشان أقول خلصنا أنا بقول كالتالي
بقول بضل طول ما بلاقي digit ماشي أول ما ألاقي حاجة
non-digit بقول خلاص لاجيت الـ token الخلاصة اللي بدي
أقولها إنه أحياناً مضطرين نمشي إيش لقدام عشان أكشف
الـ token مش إنه من أول الـ peak خلاص خلصنا طب سؤال
ثاني افترض لجيتي أصغر بتقدر تقولي خلاص لجيت token
لأنه يمكن يكون وراها يساوي بتصير أصغر أو يساوي
بعدين بتكملي أجي فراغ خلاص بتصير أصغر أو يساوي
فالمعلومة اللي بدي أوصلك إياها في هذا الـ
subsection إنه أحياناً نحتاج أن نمشي خطوة .. خطوة ..
خطوة عشان أقرر شو هو الـ token ما أقدرش في مكاني
أقول هو كذا حتى في الـ identifier نفس الفكرة لما
آجي كلمة P خلاص أقول لجيت identifier كلمة بي لأ
امشي خطوة يمكن لجيت O لما هذه صارت تكملة لجيت S
لجيت T لجيت I لجيت .. طول ما بلاقي الـ N letters
فهمتي كيف بدأت؟ أنا أكمل لجيت فرق خلاص عرفت إن
انتهيت بس كنت ماشي HNT أكثر من مرة فهذه المعلومة
اللي بدي أقولك إياها إن احنا أحياناً بنمشي لقدام
شوية على أساس نقدر نعرف نوع الـ token وما أقدرش على
المكان حتى لو الـ beak واقف يقول من هو الـ token هذه
معلومة مهمة تمام؟ طيب تعالوا الآن نشوف كيف بده
يتعرف الـ lexical على الـ tokens اللي من نوع number
وفرضنا الـ number إيش يا بنات constant انتجار كيف
نتعرف عليه؟ اه كيف نتعرف عليه زي ما قلنا قبل شوية
طول ما أنا الـ letter الـ beak اللي طلع من الـ spaces
و القصة هذه كان ماسك digit يعني أنا مشروع الآن
number مشروع token اسمه number لأنه ماسك digit
فالآن لازم أفوت و أفحص كل اللي وراه أول ما ألاقي
non digit بقول هاي رقم بس في ملاحظتين بتيجي تنتبهي
لها أنا لما بكون هي بنات كاتب خمسة و الـ beak واقف
على خمسة هذا character تمام و وراها ماشي لاجى
اتنين للأسف بيجرى كـ character فبيكون جارى
character خمسة و بيكون جارى character اتنين لازم
أنا اعمل عملية معينة تطلعلي الـ value اللي هي رقم
اتنين و خمسين أنت هو قرأه character خمسة character
و قرأ اتنين character لكن أنا لما بدي أحسب حسبته كـ
attribute لازم ألاقي طريقة أن أقول له 52 أجمعهم في
بعض طبعا كيف أجمعهم في رقم؟ في الجابة في حاجات
جاهزة، الآن كمان شوية هوريكي كيف نعملها تعالى نشوف
القصة و بعدين نسمع الأسئلة دائما بيقرا characters
لأن هذا الـ beak .. إيش الملف تبعك أنت؟ الكاتب
المبرمج كله characters لكن يجب أن يفهم أن الخمسة
والاتنين هي number فيحولوا إلى number ويديني قيمته
ويقولوا get number الـ B O I S T مثلا اه هذا
identifier فكله characters في النهاية اللي بتكتبيه
في الملف كله characters تعالوا نشوف القصة باختصار
أول
شيء يذكرك بيذكرك إن لو أنا كاتب 31 زائد 38 زائد 59
بيذكرك إنه الـ Lexical هياخد الـ 31 يقول لجيت number
ويبعت مين معها قيمة هذا الـ number اللي هو الـ 31
بعدين هيقول لجت زائد شايفة؟ ما بعثش مع الزائد أي
attribute لأنه افترضنا الآن كل character قائم
بذاته غير الـ ID و الـ keyword و التالتة و الـ number
قولنا token قائم بذاته فرضناهم و بالتالي الزائد
اعتبارها إيش؟ token قائم بذاته فمافيش له attribute
و لجت 28 قال لجت number 28 لجة زائد لجة زائد لجة
number 59 هيك الـ lexical اللي جيشنا الآن يعني الـ
lexical مش بيبعت شغلتين النوع الـ Terminal الـ
number و الـ value طبعا لمين بيببعتهم هول الـ barcel عاد
الـ barcel مش بالضرورة يتعامل مع الـ 31 الـ barcel بهمه
مين الـ number لكن طب هو ليش كمان جهز الـ 31 لأنه في
ناس بعد شوية زي semantic بدهوا الـ attributes فالـ
lexical بيخلص اللي عليه و بيريحني الـ lexical بيقول
يا جماعة لقيت number و هاي قيمته أنا يطيني العافية
كـ lexical أنتو الآن كاملوا شغلكوا اللي بدهوا الـ
number هيو و اللي بدهوا الـ attribute هيو خلصنا في
ناس هتتعامل مع الـ number لحاله، في ناس هتتعامل مع
الـ attribute لحاله، في ناس هتتعامل مع التنتين، حسب
الـ stages اللي جاية، كل إشي؟ بنا ننتبه له للقصة
هذه، لكن هو كـ lexical هيدوره، واضحة؟ طيب، الآن
تعالى نشوف كيف بيشتغل، لحظة بدأ الـ code، و هذا الـ
code و أنه هيكون مكتوب يا بنات بعد الـ four على طول،
مش في four طلعنا منها، قبل شوية، بيكون بعد الـ four
على طول، لحظة إيش الـ if condition بتقول، اجريلي
إياها، إيش بتقول if condition؟ if beak holds a
digit إيش يعني if beak holds a digit يعني مش هفوت
جوهان إلا إذا كانت digital الخانة اللي لجطها الـ
beak إلا إذا كانت مشروع number غيرك مش هفوت شفت
إيش معناها؟ لازم تكون إيش؟ digit طب افترضي كانت
letter يعني افترضي طلعنا من الـ spaces و الـ height
بـ letter مش هيفوت في كل الـ F طب ليش مافاتش في كل الـ
.. لأنه عارف إن هاد الـ letter لا تشكل number
وبالتالي ليش أفوت أضايق و اجت هنا؟ روح على المكان
اللي بيقولك لو letter شوفتي كيف؟ لكن لو كانت digit
في الأساس معناه هذا مشروع token اسمه number معناه
بدنا هنا نفوت عشان نفهم هاد الـ number إيش قيمته
إيه جدش حدوده كل التفاصيل شوفتي كيف؟ الآن إحنا
بدنا نفرض إنه واقف الـ look ahead على مين؟ على خمسة
خلاص عفوا الـ B واقف على مين على خمسة الآن إيش
بقول له if B holds a digit أول ما بدأش بقولي V تساوي
Zero اصبروا عليها الـ V شوية ده قيمة بتدايش بتساوي
Zero هنقول له do while تعالى شوفي إيش أول سطر هنا
قال قال V اضربيها في عشرة Zero في عشرة Zero زاديش
بقولي كأنه قرأها الآن الخمسة كـ character بدو
قيمتها الآن كانتجر فإيش قال؟ قال الخمسة كانتجر
زائد zero إيش بتصير الـ V؟ الـ V بتصير خمسة طبعا يا
بنات كيف أنا ممكن أجيب قيمة الخمسة من character
أحولها لـ انتجر؟ عندك حلول كتيرة عندك الجامعة جاهزة
أتحولها مباشرة من character لـ digit، أطول، ممكن أنا
حتى لو ما بديش بالجابة أنا معك خبر لو أنا طرحت الـ
character خمسة minus الـ character zero هيديني جاوب
خمسة، ليش؟ لأن هذا الـ ASCII code تبعه إذا سبعين
مثلا، هذا إيش بيكون ASCII code تبعه؟ خمسة وسبعين،
يا العكس المهم، تمام؟ فبطرح وحدة خمسة وسبعين، فلما
أطرحهم من بعض، لأنهم ورا بعض في الجدول، فببحثوا عن
الـ pure خمسة كانتجة، يعني قصة عملها مش هالقصة
الكبيرة، ومع ذلك الجابة مريحاكي، و بس بتقولي لي
حولها لقيمة و خلصنا واضحة؟ فالمهم اللي لازم تتحول
لقيمة لأن هي إيش هي قرأها كقرء بدوش هي character
بدوها قيمة فبقول حاوليها لقيمة أحيانا هقولك ليش
ضرب في عشرة أصبر شوية Zero زائد الخمسة إيش صارت؟
خمسة الآن إيش بقول له الـ beak بدو يمشي لمين؟ وين الـ
beak؟ بدو يمشي للي وراها افترض اللي وراها اتنين
مثلا السؤال هيرجع اللوب ولا لا؟ طالما digit ارجع، ليش
ضربت في عشرة؟ أنها اتبترت خمسة، صارت خمسين، لأنها
طالما انزاحت، بيصير عشرات، فعشانكش قال اضرب السابقة
في عشرة، فصارت خمسين و أجمع لها من؟ اتنين، صارت
اتنين و خمسين، الآن بيرجع بيجرى مين؟ الـ character
اللي وراه، افترضي كان واحد هيرجع يضرب 52×10 يصبح
520 و بضيف عليها الواحد و بتظل العملية تمشي متى مش
هيدخل لغاية ما الـ beak تيجي حاجة مش digits لأنه
بيقول لك طول ما digit لفّه أجت حاجة مش digit بطلع
إيش بدنا نطلع نسوي؟ الناس اللي استدعوني بيدا قول
لجهة لجهة token منه number و الـ value تبعته هيه في
V إذا بدك إيها اللي بيكون حسبها قبل شوية شوفت كيف
لجهة number و حلجه الـ value بتاعته عارفة لو أنا
ما بتهمنيش الـ value ما حدش بده الـ value كان بيعملش الـ
loop هذه خلاص على طول بيلاقي الـ number بيجمع الـ
digits و بيقول return number و خلصنا لكن ليش عملت
ضرب عشر أو القصص هذه لأن برضه في ناس بدها الـ value
فهو حسب كمان الـ value و رجع الشغلتين لمين طبعا
ديروا بالكم يا بنات بيرجع الـ lexical للاستدعاء اللي
في حالتنا الـ bursar يعني القصة كيف بتتم القصة كانت
تالي بيجي الـ bursar بتصل على مين؟ على الـ lexical
هاتلي token فبنسيب مكان التنفيذ لنسيطعه function
من الـ برسل و بروح نفذ في code مين؟ في code الـ
lexical ببدأ الـ lexical فراغ ارميه .. فراغ ارميه
.. فراغ ارميه الـ new lines كله بيخلص اه digit
بيفوت على تبعت الـ digit بمشي .. بمشي .. بمشي لغاية
ما يوجد الـ digit بالكامل و يعرف value تبعته و
بيقول يا جماعة خلاص أنا بقول لـ برسل اللي بعته بقول
اتفضل أنا لجتك number هيو و value هيو و bye bye
السلام عليكم و برجع الـ lexical الآن بنرجع لمن احنا
للـ bursar بنكمل بدي كمان مرة token بعمل calling
كمان مرة بتمشي العملية زيك باستمرار الاتنين بيمشوا
مع بعض الـ bursar بستدعي lexical الـ lexical بعمل
مهمة برجع للـ bursar بمشي الـ bursar كوده برجع تاني
مرة شوفتي كيف باختصار طيب وضح هذا الـ code كيف كيف
طلعنا الـ number في أي سؤال عليه؟ ليش درف في عشرة؟
الآن أنا لما بتكون عندي خمسة لو خانها واحدة إيش
بتكون قيمتها؟ خمسة الآن طالما بدنا نمشي خطوة على
اليمين لأنه في رقم تاني هذه بتبطل قيمتها خمسة بيصير
قيمتها خمسين عشانك بضربها في عشرة السابق عشان تصير
خمسين و يضيف عليها اتنين إيه صارت؟ اتنين و خمسين
الحين الـ V صارت اتنين و خمسين طب لاجينا في خانة
واحدة هذه بطرت اتنين و خمسين هذه صارت خمس مائة و
عشرين فبضرب كل ما بيلاقي إشي بضرب السابق في عشرة
زي أزاحة عشان الخمسة خلاص خمسة مشي خطوة مش هيلاقي
دي جيت بطلع بيرجع الـ V اللي هي خمسة ضرب السفر في
عشرة سفر في عشرة زائد خمسة شوفتي كيف؟ طيب أنا بس
سؤال عشان أختم و لو إن ما خلصنا عشان الطلاب أخدنا
أكتر كمان أن الطلاب أخدنا الـ ID و الـ keyword و شغل
كتير أخدنا من الطلاب عشان كل شي بيصعب أكل الأحوال
أكل الأحوال الآن سؤال اللي بدأ أختم فيه هنا لما
بنطلع من هذه ال loop لما بنطلع من هذه ال if
condition و هذه ال loop ال peak when بتكون؟ يا إما
على space يا إما على character داني أو token تاني
ال beak هتكون واقفة على حاجة بعد ال number ممكن
تكون space وممكن تكون letter وممكن تكون أي شيء
وبالتالي لو حد استدعى ال lexical كمان مرة هيكمل
انتبهي مش هو لاجى الان number يعني افترض ان انا
كاتب زيكى بنات افترض ان انا كاتب 52 زائد على طول
بدون فراغة ال beak مش موجف على زائد بيكون خلصت هذه
مظبوطة لا لأ فبروح بيرجع إيش لاجي هنا 52 لو حدا
بعد المرة هذه استدعى ال lexical كمان مرة ال
lexical بيكمل تكميل مش بعيد الملف من الأول مش
بيكون ماشي ال beak بيكمل تكميل إيش يعني بيكمل
تكميل يعني بنرجع من الأول لو كان واقف على فراغات
بمشي عنها زي ما اتعلمنا و neuron بمشي عنها لغاية
ما يلجط اشي و بدخل من الأساس هو واقف على letter مش
هيفوت في ال four تاعة الأساسية هذيك ايه روح اللي
بعدين؟ ايه روح اللي بعدين؟ شوفتي كده؟ بتكوني فاهمة
القصة يعني تكميل ما بعيدش كل حد بيساعد ال Lexical
بيطلعله و البيت بيبقى واقف عند نقطة بيرجعش بكمل
لغاية ما يخلص كل الملابطماشي يا بنات؟ طيب بنات
النقطة هذه كلها اللي شرحناها اليوم ضروري تعرفوه
كويس و مرة الجاية راح نعمل code Java مرة الجاية
هنكمل و نعمل code Java فضروري هذه الأمور تدرسوها
كويس ان شاء الله في أي سؤال يعطيكم العرفية