بسم الله الرحمن الرحيم اليوم إن شاء الله بدنا
نستكمل الدرس الخاص بال Lexical Analyzer يمكن
المحاضرة اللي فاتت شفنا البداية البداية كانت سهلة
جدا اللي هي عملية التخلص من ال spaces و ال new
lines و ال tabs بس اللهم لاجينا عند ال new line
كان يحط counter ويحاول يعد كل ما يلاقي new line
يزيد ال counter هذا بواحد ليش؟ عشان لما في
المستقبل نلاقي غلط يكون عارف مكان الغلط هذا وين
موجود زي ما بيصير في عملية الكشف للأخطاء في ال
compilation تمام؟ قولنا هذه ال loop هيدخل فيها طول
ما بيلاقي space بيبقى يمشي في ال loop أو ال new
line أو ال tabs لغاية متى؟ لغاية ما يطلع
character مش space ولا line ولا new line عشان يقدر
يكشفوا شو هو طبعا في ال .. برضه في المناسبة أقولنا
أنه ممكن ال code هذا الموجود يتعدل على أساس أنه
كمان أشيل ال comments لأن المفروض أن ال lexical
analyzer مش بس بريحنا من ال spaces و ال new lines
و ال tabs و الأمور هذه حتى لو فيه comments ماله
برضه بيشيلها الخلاصة أنه بيحاول ال lexical يلاقي
ال token ويقول اتفضل هي نلاجة ال token طبعا الآن
أول ما بمسك character معناه هو لا space ولا line
ولا new line يعني بداية ال token بيكون لاجئه بيطلع
من ال loop هذه بتاعة ال spaces و ال line to line
اللي كتبناها المرة اللي فاتت الآن الشطارة أنه بده
يحاول يعرف هذا ال letter أو هذا ال character عفوا
هو بداية أي token هل هو number؟ هل هو identifier
أو keyword؟ هل هو قائم بذاته؟ احنا طبعا المرة اللي
فاتت فرضنا فرضية لازم نظرنا متذاكرينها واحنا
بنعمل code اليوم أن ال tokens اللي عندي هم يا إما
number يا إما keyword أو identifier أو كل token
قائم بذاته هي اللي احنا فرضناها هيك هنشتغل في ال
code تبعنا تمام هتيجي تقولي طب الأصغر والأكبر ..
الأصغر أو يساوي أكبر أو يساوي هقولك لازم تعملي
تعديل معين في ال code لأن احنا ما فرضناه ازاي احنا
فرضناه أننا بنطلع ال number أو بنطلع ال keyword و
ال identifier والباقي بنعتبره قائم بذاته أي شيء
ثاني بدي كيام أنا لازم أعدل على ال code الموجود
تمام المرة اللي فاتت خلصنا برضه من code ال number
لجينا الموضوع simple خالص أول ما بيلاقي digit
بيفوت جوا ايش بيسوي بحاول يمشي عاد كل ما بيلاقي
digit معناه هو جوا بيكبر في الرقم تبعه كل ما
بيلاقي digit معناه بيكبر في الرقم تبعه فبيصير هنا
يعمل عملية حسبة لهذا ال value بتاعة هذا الرقم
والحسبة لجيناها سهلة كل مرة بضرب ال V بعشرة عشان
يزيد الوزن لأن هذا انتقل من الآحاد إلى العشرات مثلا
وبيصير يجمع عليه القيمة الجديدة و بيظل في العملية
هذه يلف لغاية ما ييجي حاجة مش digit خلاص الآن بعرف
أنه في لجأ token اسمه number فعلى طول بروحش برجّه
بقول يا جماعة لجأت أنا token اسمه number وال
value تبعته مخزنة في V باختصار وهذا اللي اتكلمنا
فيه المرة اللي فاتت الآن طلع من هنا في ملاحظة مهمة
ال peak وين واقف لما طلعنا من هذه ال function واقف
على أول character بعد ال number يعني لو استدعينا
احنا ال lexical مرة ثانية هيكمل تكميل من ال token
اللي ورا ال number ويفحصه طبعا هيعيد من أول إذا
فراغ مش فراغ إذا character المهم هيشتغل من جديد بس
بيكون واقف أكيد وين ال beak بعد أيوة أول character
بعد ال token اللي لجأ عشان يكمل تكميل من عنده الآن
طب بدنا نفرض أنه كان ال beak من الأساس من حد ما
طلع من ال spaces و ال new lines و ال tabs طلع
بقيمة مش digit معناها مش هيفوت مش هيفوت هنا ليه؟
لأن ال بيك hold a digit عشان يفوت هو مش digit يبقى
مش هيعدي هنا بيظهر طب وين بده يعدي؟ أكيد بده يعدي
على دائرة ثانية أو block ثاني يفحص شو هذا ال
character عشان نبدأ نشوف شو هذا ال token احنا الآن
بنفرضش أنه ممكن يكون identifier مثلا فلو فرضنا أنه
مثلا ال character البيك الحالي هو letter ماذا تتوقع
أن نفعله؟ هذا معناه أن هذا مشروع token من نوع كلمة
سواء ممكن تكون ID أو تكون keyword فالمفروض أن يكون
في code الآن خاص بمين بال ID أو بال keyword
باختصار عشان بال letter يدخل ويفحص تمام؟ طيب الآن
بس في الأول قبل أن نروح نشوف ال code في معلومات
عامة لازم نعرفها كيف احنا بدنا نميز ال keyword عن
ال identifier طبعا لما نجي نكتب مثلا كلمة I F F F
هذه مش هتبرها keyword هذه هتبرها identifier
والحروف المكونة لها I F F F لكن لو كتبت I small مع
F small لحالهم هذه مش هيعتبرها identifier هذه
هيعتبرها keyword طيب السؤال كيف بده يميز أن الكلمة
اللي لجاها هي keyword ولا هي identifier عشان يميز
ايه رأيكم؟ بايه؟ عندكم اقتراحات؟ يعني
بنخزن في جدول ال keywords نفس ما قلت هنا في ال
symbol table تمام يعني كويس الاقتراح اللي اقترحته
سليم أنا ال symbol table تبعي اللي بعمله اللي بخزن
فيه ال identifiers اول ما ببدأ البرنامج تبعي بروح
بحط فيه كل ال keywords في الأول خلاص وبقول مثلا
ال while هذه keyword while ال if هذه keyword if ال
false هذه keyword false مثلا ال do هذه keyword do
الأخرى اللي بحط في الأول خالص كل الكلمات عن ال
keywords وأن هذه ال keywords ليش أنا بعمل هذه
العملية؟ لأن احنا بنقول أو قولنا زمان أن أول ما
بيلاقي كلمة بيروح على ال symbol table بيدور عليها
إن لجاها بيروح بيرجع المعلومة اللي عليها فتخيل ايه
أنا معرفها while ومعرف do ومعرف ايش ولاجيه أنا
كلمة while أكيد هيلاجيها وين؟ هيلاجيها في ال
symbol table وروح يرجعليها ك keyword ليش؟ لأن أنا
مخزنها ايش؟ في ال symbol table ك keyword الآن لو
لجاها مش موجودة ايش هيفهم إنه هذه مش keyword هذه
أصبحت identifier فبيروح بيخزنها على أساس إنها
identifier هي باختصار يعني الحل simple وسهل إنه
أَلْجَأ لل symbol table وأعمله initialization طبعا
هيك أنا بميزهم أثناء بعض طبعا في طرق أخرى ممكن
تمر معانا في الشبات المتقدمة لكن خلّيني أقول هذه
الطريقة عملية كثير و efficient كثير ومافيش فيها
مشكلة وسهلة جدا تمام طيب الآن بس في شغلة مهمة إنه
أنا ايش بستفيد كمان من ال symbol table وهذا
هتكلمنا فيه قبل هيك لكن هي وأنا بعرضه كمان مرة
بقول أنا ال symbol table بعملي single
representation زي ما قلنا لل object كله يعني أنا
عند ال object مش في معلومات كثيرة ID مش عارف مين
مين مين مش فيه معلومات كثيرة أنا لما بروح بحط كل
المعلومات في symbol table وبس برجع عنه reference
واحد key واحد أنا بعمل single representation له
فهذا بريحني في نقل المعلومة باستمرار أنه أنا بعمله
تمثيل أحادي لكل الكلام الموجود مش بس كمان فائدة
فائدة جديدة اليوم تعلمناها اللي هي أن ال
reserved words اللي هي ال keywords بقدر أحجزها من
البداية جوا هذا ال symbol table وخلاص ك keywords
وبارتاح منها يعني عمللي ال symbol table حلول مهمة
بالإضافة إلى الكلام اللي كنا نقوله قبل اللي ال
history تبع ال identifier بين مابينش كم مرة شفته
ما شفتش يعني لكن احنا النقاط المهمة إنه بيصير في
single representation لهذا ال object تمام وبيصير
أنا ما عندي مشكلة في موضوع الكلمات المحجوزة أو ال
keywords لأن ببساطة ببدأ البرنامج أو ببدأ العملية
تبعي وهم موجودين في ال table ك initialization و
خلاص كل كلمة بتطلع معايا إذا مش موجودة في ال table
شو معناها؟ أن هذه identifier فبخزنها ك identifier
وبكمل إذا لاجيتها من الأول ما بدأت في ال Table ما
هي أنا مخزنها ال while keyword ونوعها keyword
فخلاص برجعها بنوعها أنا مالي ايش ما يكون مسجل
قدامها برجعها بشكل كامل وبهيك برتاح من المشكلة طيب
تعالوا الآن نشوف التفاصيل أكثر كيف ممكن نعمل هذا
ال code عشان أقدر أعمل هذا ال code بدي أذكرك بحاجة
اسمها hash table ايش ال hash table يا بنات؟ آه ايش
ال hash table؟ أخذتوا برمجتها اه ايش ال hash table؟
طيب
اوضح كمان بدنا أوضح إجابة أوضح كمان حاجة لها
key of value حاجة لها ايش؟ key of value طيب وايه
كمان؟ طيب قالوا أنتم يعني إجاباتكم كلها بتصب في
الاتجاه الصحيح خلّيني أقول ببساطة ال hash table
أخش باختصار الـ hash table خلّيني أقول عبارة عن
جزئتين رئيسيتين، الجزء الأول بنسميه key تمام أنا أي
object بده أخزنه جوا لازم أنا أقدر أوصله من خلال
key، على فرض أن ال key هو الحروف المكوّنة لهذا ال
object مثلا حروفه، فلما أجي أقول XXX هذا الـ key و
بحط كل تفاصيل ال object هنا، طبعا قد يكون من ضمن
التفاصيل تبعته الحروف المكونة له، مافيش تعارض يعني
ماعندي مشكلة يكون الحروف المكونة له هي ال key، وفي
نفس التوقيت هي معلومة مقترنة جوا في هذا ال object
ماعندي مشكلة، المهم أنه لازم يكون في أنا عندي key
إيش العبرة من ال key هذا؟ أنه وجدت ما بدي أنا أدور
جوه ال table على هذا ال object، كل اللي بسويه
بستخدم function جاهزة اسمها get وبحطله مين ال key
فبتريحني هذا ال function على طول بتروح تدور في ال
symbol table، هذا ان ان ان أنا مخزن جوه ال XX في أي
مكان في هذا ال symbol table، هذا ال function إيش
بتسوي؟ بترجعلي ال object كله، مش هنا فيه أنا مخزن
object في هذا المكان، أنت بس في ال function get بس
بتحط حاجة واحدة، إيش ال key اللي بيوصلك للمكان اللي
بيديك منه ال object، زي ال primary key في ال
database، شفتي كيف؟ فالآن أنا لما بقوله XXX بيروح
بفتش جوا الـ Symbol Table هل هذه الـ key تبعها XX
موجودة؟ أه موجودة، فبيروح بمسك كل هذا ال object و
برجعليه من ال function get، طب افترض أنا قلتله get
مثلا قلتله X تساوي get YYY مثلا، مش هيلاقي YYY
هيقوللي مش موجود، هيرجعلي null مافيش شيء، شوفتي
فعملية إني أعمل retrieve للمعلومة من جواته سهلة
جدا وجاهزة، بس أنا لجته خلاص في ال hash table هذا، و
أيضا عملية وضع البيانات فيه سهلة جدا من خلال
function اسمها bot، لكن في ال bot هنا أنا بدي أحطه
arguments، ال argument الأول ال key، ال argument
التاني ال object كله، فلما أنا أقول له جملة bot yyy
وأدّيله أنا object، هيروح جوا ال symbol table إيش
يعمل؟ هيعمل record لمين؟ ل yyy وكل المعلومة هاي
أو كل ال object هدا وين بيخزنه؟ هنا، فعندك
functionين رئيسيات، Bot إذا بدك تخزني إشي بس هنا بدك
تنتبه إنه لازم two arguments، لأن لازم أنا أحدد مين
هو ال key تبع هذا ال object، وبيخزن ال object على
جباله أو ال value على جباله، ال function التانية
الرئيسية get واللي هي بدها منك بس one parameter
اللي هو فقط إيش ال key، عشان هو يروح يجيبلك مين
يروح يجيبلك ال object بشكل كامل، هذه باختصار عشانك
بنقول دايما ال hashtag بالماله سهل خالص سواء في
وضع المعلومة أو في أن أسحب المعلومة، وكمان مرة يا
بنات، ما تستغربيش لو لاقينا الـ yyy اللي هي key مقطع
من ال object نفسه، ليش أنا بقول هذا الكلام؟ لأن ال
identifier هذا object مش جواته الaksim المكونة له
صح ولا لا؟ فأنا ماعندي مشكلة أمسك الaksim تبع ال
identifier هذا واعتبره كمان شو، وأعتبره key فأكون
أنا ماسك هنا ال key وأنا حاطه كمان مرة ضمن ال
object، مافي أي تعارض، فال object شيء، المعلومات شيء
وال key اللي بيوصلني لهذا ال object شيء آخر، و
احنا هنا في ال symbol table هنتعامل إن ال key اللي
يوصلني للكلمة عشان أخزنها أو أسحبها هي الحروف
المكونة لهذه الكلمة، يعني لو بدى أدور أنا مثلا على
كلمة while إيش بقوله؟ ال key تبعها while، شوفتي كيف؟
زي هيك، بدي أدور على كلمة position اللي هي معرفة ID
ومحطوطة جوا، بقوله get وبكتب كلمة position ليش؟
إنه يروح جوا ال table وين ما يلاجيها يرجعليها
معلوماتها كلها، طب ما لاجهاش، خلاص، بقولي null، ما
لاجيت، هاش واضحة كيف؟ طيب، الآن إيش تتوقعي بدنا
نسوي لو كان ال بيك واقف على letter، أنا بتوقع بدنا
نعمل التالي، وقولولي أنتو صح ولا غلط، ال beak واقف
على letter صح؟ معناه هذا بداية كلمة سواء كانت ID
ولا سواء كانت QR، الآن إيش هسوي أنا؟ هقوله امشي للي
وراطب اللي وراه letter أو digit، معناه عند ال
identifier أو الكلمة مسموح تكون حرف وراها حرف أو
رقم صح ولا لا؟ فنش، هقول لاجيت اللي وراه رقم أو
letter هقوله كمل هذا جزء من الكلمة تبعتي، رقم أو
letter كمل كمل كمل، لأمتى هتظن أكمل؟ لما ألاقي
character لا هو letter ولا هو digit، هوقف وأقول
هذه كلها على بعض الكلمة تبعتي اللي بديها، أول خطوة
ستفعلها هي تدوري على كلمتك character after
character بعد كلمتك بعد كلمتك بعد كلمتك بعد كلمتك
بعد كلمتك بعد كلمتك بعد كلمتك بعد كلمتك بعد كلمتك
بعد كلمتك
بقوله return للاستدعاء للـ parser، خلاص بقوله
اتفضل لجيت هذه، طبعا هذا ال object إيش بيكون جواته
إذا كان هو ID والحرف المكونة إله لأنه موجود من قبل
أنا مخزن وكنت أو كان مخزن في ال initialization أو
حتى إذا كان keyword while أنا ماتعرفش حالي، بقوله
لجيت لك هاي ال while بكل تفاصيلها فأنا لأ هقوله
keyword ولا هقوله identifier، أنا هرجع ال object
بما حمله بكل تفاصيله، والله إذا كان هو keyword ما هو
رجع ك keyword، إذا كان هو ID هو رجع ك ID تمام، هذا
لو كان موجود يعني هو موجود مسبقا، طب افرضيه ما
لاجيتوش يعني أنا عملت ال function get لهذه الكلمة
اللي جيتها ما لاجيتوش موجود هنا، هتعمل خطوطين زيادة
خطوة زيادة، الخطوة الأولى بدي أقوله بدي أخزن هذا ال
object في ال symbol table هذا أو في ال hash table
فهبعت key اللي هي حروف الكلمة هاي وهبعت ال object
كله، ويتخزن، وبعد ما يتخزن إيش هعمل؟ هعمل عملية ال
return للمكان اللي أنا خزنت فيه، شوفتي كيف؟ يعني هنا
في خطوة زيادة في حال أنا ما لاجيتهش، بخزنه وبحط
معلومته ك identifier، انتبهي لأن في الـJabber اللي
أنا بدي فيه مخزنين كإيش؟ ك keyword هذا لأنه جديد وما
كنش في ال initialization موجود، معناه بالنسبالي
identifier، فروح بخزنه ك identifier وبحطه ديوهار
ال symbol table وبروح بقوله return هاي باختصار
اللي هنسوي، تعالوا نشوف ال code كيف مكتوب وهناخده
اليوم إن شاء الله بال Java، كمان شوية أخر محاضرة
الآن بقولك بس خلنا نخلص الفكرة وبعدين بنسمع
الأسئلة، بيك holds a letter، أه إيش بده يصير؟ قالك
أول حاجة بدك تعمليها collect letters or digits
into a buffer، بيك يعني كل ال letters وال digit
اللي وراها خديهم وحطيهم في buffer، يعني هناك تعمل
زي for loop، أه letter or digit حطه في ال buffer
letter or digit حطه في ال buffer، letter or digit
حطه في ال buffer، يعني لغاية ما يبطل letter or
digit، الآن هذا ال buffer إيش بدنا نعمل فيه يا بنات
أنت إيش يعني buffer يعني جاعدوا ال characters فيه
انفرجين عن بعض، أنا بدي أجلبهم ككلمة ك string ففي
function جاهزة في الجاها، حاوليها ل string زي ما
هنشوف، تحول ل string، طب إيش أفرجات؟ قبل شوية ماكانوش
كلمة كانوا حروف مقطعين موجودين في buffer، أنا لازم
عشان أدور عليه في ال hashtag اللي موجود أو مش
موجود، لازم أحاوله ل string لازم أشوفه ككلمة عشان
هيك، ما نستغرب لو قلنا ال S هي عبارة عن ال string
المكونة من B من الحروف المقطعة هدول، يعني ال S الآن
لم لمتهم في كلمة، طبعا بالجابة هنلاقيه function
جاهزة to string، بعدين هشوفها كمان شوية، المهم أن
أصبحت الـ S إيش تمثل؟ الكلمة اللي أنا لجيتها، الآن
إيش هنعمل؟ بدنا ندور عليها، عشان هيك إيش قلتله؟
قلتله استخدم ال words، طبعا ال hashtag ال words
يعني ال symbol اللي هنسميها words اللي مخزن
الكلمات، dot get وإيش حطت من الجثين؟ الكلمة اللي
أنا شوفتها قبل شوية، لأنه يمكن أنا شوفت while، فلو
شفت Y ما هي keyword صح؟ هيروح يرجّه ليه؟ لقاها لإن
مخزّنها ك initialization أنا keyword مثلا، فبغض
النظر أنا الكلمة اللي شفتها بقوله اتفضل دور عليها
وإذا لقيتها رجعليها، الآن وين رجعها ليه؟ في W الآن
W واحدة من تنتين يا null يا object، إذا null إيش
يعني؟ يعني ما لقاهاش، طب إذا مش null معناها لجا
object ورجعه، فإذا كنت كاتب أنا while هيكون رجعلي
keyword في هذا المكان، إذا كنت أنا لأ كعمل
identifier ومخزنها هيرجعلي ك identifier لأنه لجأ
فأنا مايعنيش شيء اللي لجأ خلاص لجأ برجعلي ك
object إيش المطلوب مني أسوي أقوله يالا يا object
كلك على بعضك مع السلامة return للاستدعاء خلاص هاي
ال object كامل فعشان هيك إيش بيقول إذا الـ W مش
null خلاص return W يعني لمن رجع الـ W؟ للبرسر،
للاستدعاء خلاص، الآن الـ W إيش فيها؟ فيها الـ
token كامل إذا كانت while، حيكون while و keyword
إذا كانت identifier أنا مخزنها، هيرجعلي إياها
identifier وهاي الـ Xين تبعته، المهم ال object
هذا كله هيرجع هذا لو أنا إيش، لجيتوش في ال table طب
السؤال مالاجيتوش معناه مش هيفوت هنا مش هيطلع من ال
code هيكمل إيش بقوله عاد؟ إيش المفروض أقوله؟ الآن
هقوله خزنها بس هقوله خزنها ك ID ورجعها أه طب خلاص ال
keyword بلعبش فيه هو الآن كل كلمة بلاجيها طالما مش
keyword مش موجودة بتخزنها الآن ك identifier عشانكش
بقوله خلاص enter the key طلع شوف كيف خزنها بعدال
key اللي هو الحروف المكونة اللي هي S وخزن ال
object كامل لأن ال object حتى الآن ما نتعامل معه
أنه من نوع identifier وهي حروف المكونة له فهو بعت
مين كمان مع ال object كامل ماحدش يقول لي ليش بعت
ال S مرتين الـ S في أول مرة كـ Key فقط عشان يوصلني
لل location لكن شوف فعليا اللي اتخزن ال object
كامل بكل تفاصيله بال Lexeme تبعه بال type إيش ما
يكون فيه معلومات كلها موجودة فيه object لأنه لما
أنا هيرجعه هيرجعه لل object كامل بكل تفاصيله بال
Lexeme فمابديش أفصلهم عن بعض أنا بس بدي key فلا
مانع إنه يكون ال key أصلا معلومته موجودة هنا لا
مانع مافي مشكلة هذا key له طريقة استخدام وهنا له
طريقة استخدام هنا طريقة استخدامه كجزء من هذا ال
token للناس اللي بدهم إياه الحروف المكوّنة له هنا
طريقة استخدامه فقط للوصول إلى المعلومة بس إنها
موجودة أو مش موجودة فهذا زي primary key بس مش أكثر
إنه يوصلني تمام طيب الآن .. تمام
الآن إيش ساويت بعد ما أنا حطيت في ال symbol table
أو في ال hash table ال value إيش ده أقوله؟ return
ال token مين هو؟ أنا برجع الـ token الآن اللي هو
الـ token مكون من إيش؟ من جزء إثنين إنه identifier
وهي الـ Xيمت تبعته تفضل ها يوم عندك هي أني رجعتله
إيش؟ ال token تبعه باختصار واضحة ال code، هنا ال
code مش صعب جدا، مافيش فيه شيء فيه الآن أي سؤال
كيف اشتغلنا هنا؟ طبعا هشوف هذا الكلام كمان شوية
بالتفصيل ك Java بس في الأول لنفهم ال pseudocode
تبعه
IASA طيب الآن احنا لما كنا بنقول بدنا نبعت لل
بارثر ال object و ال object من نوع identifier أنت
إيش هتبعت لل بارثر؟ هتبعت لل بارثر معلومتين صح؟
هتقولولي يا بارثر هي ID والحروف المكوّنة فهذا
الحروف المكوّنة جزء من هذا ال object فكله على بعضه
object يبدو ينبعت بالكامل أو يجي بالكامل الآن أنا
هذا ال object عشان أخزنه الآن بدي key يوصلني إليه أو
يجيب لي فاحنا اخترنا الحروف المكونة اللي هي اسم
اختارتها ك key فما .. فبديش حد يفكر عشان اختارتها
ك key أنه ممكن ألغيها أقول بديش إياها لأ هذا شيء و
هذا شيء هذه جزء من object واختارتها ك key طيب أي
سؤال واضحة الأمور نكمل طيب الآن احنا السؤال متى
هيطلع من هذا ال function في حال إنه لاقى token من
نوع أو ID أو Keyword حسب مش أنا مخزن صح ولا لأ طب
السؤال لما يطلع من هنا ال break وين بيكون واقف؟
على أول character بعد هذه الكلمة، ليش؟ لأنه مش هو
ضال يمشي letter or digit letter or digit لما لاقى
حاجة لا letter ولا digit قال stop فأخد كل الكلمة
تبعته، لكن البيكسر واقف وين؟ على بداية الجديد، على
character جديد فمتى ببحث هذا ال character؟ في
اللفة الثانية، لما حد يستدعي ال lexical كمان مرة
بيبدأ من مطرح ما وقف، سواء كان واقف على فراغ ولا
واقف على character، إذا واقف على فراغ ما بيصير في
code يمشي عنه فهبدأ من جديد بس المهم الفكرة إنه
بيكون البيكوين ماشي خطوة زيادة عن ال token تبعه و
جاهز للفحص من مطرح ما وقف في المرة القادمة ماننساش
المعلومة يعني طيب الآن طيب .. اه .. البيتر الموجود
اللي اللي أتت فتشهد أكثر من البيتر اللي أتت
لحظة شوية اصبر معايا اصبر معايا الآن لو أنا كاتب
F99 هذا بالنسبة لك identifier ولا digits؟
identifier فهو لما لاقى ال F فات
مظبوط؟ الآن طول ما بشوف digits خلاص عارف أن هذا مش
number هذا جزء مقطع من ال identifier فعشان خلاص
هيعلق في الأرقام ويعلق في ال letters خلاص هذا جزء
من ال identifier لما ييجي حاجة لا هي number ولا هي
.. لا هي عفوا لا هي digit ولا هي letter بيعرف أن
هذا ال identifier كمل الآن خلاص في ال level HD ده
ببدأ من جديد شوفتي كيف؟ فخلاص بمشي طب لو كان بعدي
بتسعة مافيش letter ببدأ بتسعة عشانك عارف حاله بده
number فإفرضي له يساوي بعدين خلاص بوقف بعتبرهاش
التسعة وليه ساوي في number فبعتبر هذا كركتر جديد
وكذا شوفتي كيف تمام
طبعا يا بنات هم برضه في اللغات الجديدة مش اعتباطا
لما بيجي بشوّطوا بعض الشروط في ال languages الجديدة
عشان يسهل ال code و يصير efficient أكثر يعني ليش
هو قالك ما يبداش ال letter ال identifier ما يبداش
مثلا برقم؟ عشان ما يصيرش خربطة يصير أنا أعمل فحص
زيادة هل هذا زي ما قالت رقم ولا مقطع من من من
identifier فبقولك ممكن يصير إشكالية عشانك بيحاولوا
يبعدوا عن الحاجات اللي ممكن تشتت وتعمل إيش بطء أو
عدم قدرة يكون ال code سريع مش بس هيك تعالي تطلعي
مثلا لما يقولك ما تستخدميش إن ال keyword تكون نفسها
identifier ممنوع تستخدم ال F تكون .. في language
بتسمح أن ال F تكون identifier و ال F تكون keyword
لكن languages جديدة بتسمحش ليش؟ لأن لو سمح معناها
بيصير في process كثير كل ما يلاقي identifier طب ما
يمكن يكون هذا keyword فكيف بدنا نعرف؟ هذا هنتكلم
على تفصيل شغالة في محاضرات قادمة بس الفكرة يعني
بتلاحظ إنه دائما الأشياء اللي مالهاش داعي بيصير في
languages جديدة يقولك ممنوع تعملها زي إيه؟ يعني
ممنوع تسمي ال keyword ب identifier وهنأخد أمثل
نوضح الصعوبة هذه في حينه لما ندخل ال chapter
الجديد إن شاء الله لاحقا واضح كيف؟ طيب على كل حال
نرجع نخلّنا في مثلنا المهم الآن أنه كمان مرة طول ما
في spaces ال four اللي فوق الأولانية بتلف بنطلع
منها و احنا ال character حاجة غير ال space أو ال
new line أو ال tab قلنا هنفحص في الأول هذا ال
character digit ولا مش digit إذا ما كانش digit مش
هيفوت فوق صح؟ هيفوت هنا إذا كان letter طب إذا كمان
مش letter برضه مش هيفوت هنا بده يكمل الآن ال code
إيش تتوقعي اللي بنسويه؟ إيش ال assumption تبعنا؟
بدنا نعتبره إيش؟ بدنا نعتبره token قائم بذاته
فبتقوله أنت token اتفضل ارجع باختصار هي ال code
هيخلص الآن يعني الآن أنا مش هوصل وين؟ يعني أنا
الآن وين ال ..
تمام خلي نرجعلها بس تذكير هرجعلها أتكلم فيها لأن
بس اصبروا شوية الآن إيش بده يسوي؟ يحط ال code كامل
بتاع ال scan بتاع ال lexical إيش قال؟ قال أول ما
بنبدأ، بنبدأ بال code اللي شفناه تقع ال four in
أو ال four اللي فوق فهذا إيش بيسوي ال four اللي
فوق طول ما spaces, new lines و tabz بتلاقي بيعملهم
skip مش هيسيب السطور هاي إلا هو ماسك في character
غير ال space و ال new line و التابز هيشوف هل هذا
بداية number ولا لأ إذا بداية number هيفوت وين؟ في
ال code هذا، طب هو مش بداية number هل هو بداية
letter يعني هو letter يعني بداية word يعني بداية
identifier ولا keyword إذا آه هيفوت hand ويطلع ب
return لجد شيء طب إذا برضه لأ إيش قلنا هنفترض أن
هو token قائم بذاته فإيش قال؟ قال خلاص ال T هي
عبارة عن token اللي هو هذا ال character انسيلي هذه
مؤقتا، انسيليها شوية إيش في الآخر بيقول return؟ T
يعني باختصار هذا الـ token هو token T اللي هو الـ
Peak و Return لمن؟ لل بارسل إنه اتفضل هذه ال token
الزاد أو الناقص أو الدرب أو القسمة الآن هنا في
ملاحظتين الملاحظة الأولى أنه هنا ما عملش حساب ال
tokens الأخرى اللي ممكن تكون من أكثر من حرف زي
الأكبر أو يساوي أو أصغر أو يساوي أو يساوي أو يساوي
لو احنا مطلوب مننا نعدل على هذا الـ code عشان يعمل
يساوي يساوي هتصير تعدلي من قبل هذه المنطقة تصير
احنا إذا كان الـ number فوتنا في الـ number إذا كان
الـ letter فوتنا في الـ letter تصير بعدك إذا كان أكبر
فوتي في دائرة الأكبر إنه أجاوز وراها يساوي return
أكبر أو يساوي فبصير في تعديلات في الـ code إذا بدك
تعمل حساباتك الـ tokens الممكن تكون من أكثر من
character لكن هنا الـ assumption تبعنا في هذا الـ
code show أنه خلاص إذا مش number مش كلمة هو token
قائم بذاته عشانكي تلاحظي إيه هو خلص و ختم على طول
ما عملش فحص لإن أنا بعلمك لو بتعدلي بتعدلي من هنا
في المناطق هذه حسب طبيعة السؤال الآن أنا مش هنعدل
الآن خلاص و جال الـ token تي تسوي new token يعني
خلاص عرف هذا الـ character للحالة كـ token و راح
يشعمل return و نهى القصة بس الاشي الغريب اللي أنا
مستغرب و اللي بدي منه إجابة من حضراتكم ليش جال بيك
تساوي blank؟ آه ليش عمل .. يعني إيش وظيفة هذا
السطر؟ إيش أهمية هذا السطر؟
لأ
فراغ .. ليش يعني إيش بدي في السطر؟ مش بدي منه يعني
ليش وجع الراس يعني صح ولا غلط ولا بلزمش؟ بلزم؟ ليش
بلزم؟ بلزمش خلاص بيقول بلزمش و بنمشي؟ ما أعرفش أنا
بسألكم الآن أنتم الإجابة عندكم إيش رأيكم؟ هذا
السطر إله داعي ولا لأ؟ الآن هنا باختصار قالك خلاص
إذا كان الـ token هو الزائد أو الناقص ورجع الـ token
ويعطينا العافية ليش عمل الـ blank؟ كيف يعني؟ مش فاهم؟
وضحّي ورجعّي وكملي كيف؟ مش فاهم؟ طيب ..
طب كيف هنقول اللي بعده؟ أنا ما نطّطش عنه، اعتبرته
blank مش هو .. هو كان واقف على الزائد أنا ما قلتش
.. أنا اعتبرته .. قلته طب اعتبر الزائد هذا بعد ما
رجعته الفرق كيف بيبقى رحل؟ طيب
.. آه ..
طب هو أخد و خلص هنا ليش أنا حطه في السطر؟ هو أخد و
خلص يعني
عشان يمشي .. عشان يمشي .. طيب كويس خليني أنا عشان
الناس اللي .. اللي نايمين شوية يصحصحوا اعتبروا أنا
ما حطّتش هذا السطر، إيش بدي يصير؟ في اللفة الجديدة،
الآن مش هو كان واقف عند الزائد صح؟ رجع الزائد، لفّ من
اللفة الجديدة، واقف على الزائد، لفّ من اللفة
الجديدة، واقف على الزائد، فمش ماشي عشان يمشي خطوة
قدامي حالين، يا بقول الـ peak يساوي peak plus one
وخلصنا، عشان يكون ماشي على اللي بعده في اللفة
الجديدة، يا بقوله نعتبره فراغ، ليش أنا اعتبرته
فراغ؟ عشان لما لفّ اللفة الجديدة، الـ four اللي فوق،
بتشوفوا فرق، هتمشي عنه automatic فبتمشي على اللي
ورا فلما بحطه فراغ بضمن أن الـ four اللي جديد ده
اللي في بداية الـ lexical مشيت عنه مش أنا مجيب تمشي
على الفراغ فمشيت عنه ومشيت إلى اللي وراه فالفكرة
بس أنه بدنا نمشي الـ بيه خطوة فإنتي حرة إن حطيتي
فراغ بيظبط ليش؟ لأن مين اللي هيمشي خطوة عنه؟ مش
أنا لما يبدأ الـ lexical من جديد يشتغلفبمشي عن
الفرق فبضمن أنه ماشي خطوة عنه فبدي أبحثه ثاني يا
إما أنا إيش بسوي بيك تساوي بيك plus one طب واحدة
هتقول طب ليش أنا ما عملتش هذا الكلام هان ولا هان؟
لأنه الاتنين هدول كانوا already ماشيلما قدر يدور
على الـ number مش واقف عند أخر digit كان already
ما له ماشي عن الـ number و واقف على أول character
بعد الـ number مش هي اللي قلناها و لما تجينا فحصنا
الكلمة لقيناها برضه الـ peak وين واقف على أول
character بعد مين بعد الكلمة وبالتالي ما فيش داعي
أمشيهم لكن لما يكون الـ token هو قائم بذاته لحاله
طب مين بدي يمشي؟ لازم حد يمشي فيا إما بقول بشكل
واضح وصريح peak تساوي peak plus one وخلاص يا بقوله
اعتبرها .. خلاص أنا خلاص عرفت أنه token و هرجعه
اعتبره أن هذا كان فراغ عشان اللفة الجاية يمشي عنه
و يلطّ في اللي وراه طبعا إذا اللي وراه كان فراغات
بيصير يكمل بيشيلهم لغاية ما يمسك character جديد و
يبدأ يشتغل يعني بيبدأ الفحص من اللي وراه بس هي كل
الفكرة واضحة؟ في حد يسألني هنا أي سؤال؟ الآن
الكلام اللي حكيناه كـ pseudocode بنحاول أنه نعمله
كـ Java تمام؟ بدنا نفكر كيف نعمله كـ Java لكن زي ما
أنتوا شايفين الاشي الأساسي خلص ليش؟ لأن أنا
باختصار بدي function scan هي function scan هي اللي
بتعمل عملية الكشف عن الـ token و أني ألجيه و أني
أرجعه طالما الآن بتتكلم كـ Java بتوقع مش صعب عليك
أن تعملي class كبير تسميه lexical مثلا و تسيري و
تحطي هذا أساسي جوا الـ lexical زي ما عملنا قبل هيك
في الـ parser احنا كان الـ start symbol expression
كل هذه الـ function حطيناها في class parser فسهل
جدا أن تحطي هذا في هيكلية الـ class مثلا لكسر أو
سميه lexical زي ما بدك سميه الآن برضه في شغل مهم
لما أنا بدي أتكلم الآن على Java، بدي أتذكر دائما أن
لغة الـ Java هي object-oriented وبالتالي هي مكونة
من مجموعة من الـ objects اللي بدي أحاول أتعامل
معهم، باختصار ولكل object لازم يكون فيه NDH class،
تمام، أساسي عشان أني أعمل منه instance و أبدأ
أشتغل طيب، الآن تعالوا نفكر شوية أنا ما بتكلم الآن
كـ lexical كم class بيلزمني أو كم object بتلاقي
موجود عندك هنا في الـ code اللي كتبناه خليني نتكلم
مع بعض كم object تقريبا مرة عليكي آه يالا يا
مبرمجات الآن احنا عملنا function اسمها scan صح؟
جوّاتها ممكن نكون احتجنا نتعامل مع objects ممكن أنا
لسه مش عارف أنا بسأل لكن بالتأكيد إذا في عندي
objects لازم أعمل لهم classes في عندي objects هنا
إيش هما؟ أيوة الـ tokens ولو طلعتي شوية هتلاقي في
أنواع في token قائم بذاته ما فيش في إشي غير بس الـ
value تبعته نوعه وفي هتلاقي object زي الـ number الـ
number في قيمتين النوع اللي هو نوع number والقيمة
هتلاقي في object تالت اللي هو الـ word الكلمة اللي
فيها أنواع من نوع identifier أو من نوع keyword
والـ lexeme المكونة لها يبقى الواضح أن هنا في عندي
عبارة عن مجموعة من الـ objects وبالتالي أكيد بيكون
في عبارة عن مجموعة من الـ classes الآن الحلو برضه
في الـ object oriented أو في الـ java تحديدا أو في
C++ كمان أن في عندك مبادئ رئيسية ممكن تستفيدي منها
زي الـ inheritance والأمور هذه دائما موجودة للتسهيل
مش للتصعيب إيش نقصد بالـ inheritance؟ أنه والله
إذا في object بالضبط object ممكن يروح يورث object
ثاني أقل منه ويزيد عليه معلومات يعني باختصار ممكن
يكون الـ object ألف فيه معلومة A و الـ object فيه A
و فيه B و C فبيروح بيورث الـ object الأولاني وبيضيف
على معلومته معلومات أخرى وبيستفيد هيك من إيش من
المعلومات اللي كانت في الف في الشدا يروح يكررها
فإذا أنا في عندي نظام inheritance ممكن أستفيد منه
ليش لأ؟ ليش أقعد كل مرة أكرر في الـ values وأكرر في
الـ functions و أنا قادر أشيل شي common يكون موجود و
أورثه و أكمل عليه فدائما الـ inheritance هي سياسة
كويسة إذا بنقدر نستفيد منها نستفيد ليش لأ؟ الآن لو
جينا نتطلع هنا على الـ objects التلاتة اللي نتكلم
فيهم هل بتلاحظ في بيناتهم common things أو في
بيناتهم وراثة أو إشي اتكلمنا عن تلاتة اتكلمنا عن
الـ token class token جوّاته بس النوع اتكلمنا عن
class number جوّاته النوع والـ value اتكلمنا عن
class word جوّاته النوع والـ lexeme إيش من الكلام اللي
أنا قلته واضح أن النوع موجود في التلاتة طب مين بدي
يورث مين؟ أيوة
في الأول بدي أكون عندي الـ token القائم بذاته اللي
فيه بس نوعه هذا بدي أسميه مثلا class token الآن الـ
number مش هو فيه برضه النوع اللي كان موجود هناك بس
ضاف عليه value فالمفروض أنه أعمل class number
بيورث الـ token الأساسي فخلاص فصار already طالما
ورثه صار النوع داخل موجود فيه بس هيضيف عليه مين الـ
value اللي هي 256 و 256 مثلا طيب الـ identifier أو
الكلمة عفوا الـ word هتقولي هيورث أيضا الـ token صرت
أنا ماخذ منه النوع هضيف عليها الـ lexeme الحروف
المكونة لو في المستقبل أجينا object جديد فيه نوع
و فيه lexeme وفيه type وفيه scope وفيه ما أعرف إيش
ممكن يورث نفسه الـ word ويكمل عليه فدائما هيك مبدأ
الوراثة سهل جدا أن خلاص إشي موجود بأضيفه بأكمل
عليه طبعا تعالوا نشوف هذا الكلام كيف بنسويه احنا في
موضوعنا قال لك في عندي ثلاثة classes رئيسيات في عندي
class token في عندي number في عندي word بالنسبة ل
class token الأساسي ايش بنركن فيه value واحدة شو
هي الـ value النوع يعني لما أنا أقول زائد النوع
ناقص النوع اللي هي نوعها ناقص الضرب نوعها ضرب بس
السؤال ليش عرف نوعها integer في مشكلة أنه يعرف أن هو
integer مع أنه character هو في الآخر الـ token
بالظبط مش حتكون عندي مشكلة أنا في الآخر قلت له بدي
token زائد هو بدي أخزن قيمة integer ايش هياخد الـ
ASCII code بتاعة الزائد طب واحدة حتقول لي طب أنا بدي
أطبع الزائد كزائد بديش يطبع ليها كـ ASCII بقول له
casting char خلاص أطبع زائد أطبع على حاله كـ char tag
يعني بأطبعها كزائد فعملية ما فيش فيها أي تعارض ولا
أي تناقض فعلى طول ايش سماها integer value tag اللي
هي نوع طيب الآن الـ number بمجرد ما عمل وراثة للـ
token صار جواته .. طيب بناقت كمان مرة احنا قلنا أنا
لما بدي أعرف token قائم بذاته لازم الـ value تبعته
تكون معروفة عشان أميزه أنا في عندي كثير tokens
قائمة بذاتها زائد ناقص ضرب قسمة مش عارف مين فاصلة
الأخيرة كيف بدي أعرف أن هذا token قائم بذاته لازم
يكون فيه value جوا هذا الـ class تمسك هذا الـ token
تعملت هذا النوع طبعا واحدة ممكن تقول لي طب أنا لو
عملتها char في حدا اللي عندي صح ولا غلط بقول لك مش
غلط لكن كمان شوية حتيجي كي أنواع أخرى زي الـ number
و زي الـ ID و زي الـ keyword و من ناحية برمجية حيكون
أسهل و أسرع و أقوى تكون integer لكن الآن لو أنت
بتعمليها char مؤقتا لهذا الـ token بيمشي الحال لكن
احنا قاعدين نطلع لقدام مش بس لهذا الـ token أنا
بتطلع للـ tokens الأخرى الموجودة و الأنواع الأخرى
فعشان يكون code efficient قال لك الأفضل يكون هذا
integer وهنا ما في تضارب مع الـ character أساسا لأنه
حيصير أنا صح بكتب قاعد كـ character هضلني في شغلي
بدي زائد بدي ناقص الـ token ضرب لكن internally هو
بياخد بس قيمة الـ ASCII الـ integer و بيشتغل عليها و
خلاص يعني أنا مش حتضرر، أنا هضلني أستخدم زائد وناقص
وضرب وقسمة وكل شيء لكن هو الـ Internal هيحوله
وياخد بقيمتها ايش قيمة الـ ASCII وخلاصنا فأنا
مستفيد وهو مستفيد أنا ما غيرتش في كتابتي وفي شغلي
وهو ضال efficient وعمل حساباته لـ tokens اللي
جاية، هي باختصار يعني القصة فما تقلقي من الموضوع
أنه خلها integer تمام؟ المهم إنه لازم يكون في
variable يخزن قيمة الـ token الآن أحط هنا T وما أحطش
هنا T هذا اللي بيقرره لحظة الـ initialization للـ
token أنا لما آجي أعمل هيك يا بنات مثلا أفهمك حاجة
أقول T1 تساوي a new token بالله
شو استفدنا؟ شو T1؟ شو T1؟ token شو هو؟ شو هو؟ طب ليش
عملت creation مازال فاضي؟ ليش أعمل الحركة هذه؟ إذا
أنت مجبرة طالما بدك تعملي creation لـ class اسمه
token لـ object من نوع token لازم تعطيه قيمة
ابتدائية يكون هو فيها صح ولا لا؟ عشان ذلك أنا مش
بدي أقول مثلا الـ token بدي إيه زائد فطالما أنت
حطيتي parameter هنا في الـ constructor لازم تعبري
عنه بالتالي غصب صارت يا فراغ وفراغ لكن في حالة
فراغ وفراغ، ماذا سأضع الـ Token؟ هل رأيت كيف؟
لأنني لم أقل له إن الزائد هي التي هي التاج وهو هذا
الـ Token تبعي، هل رأيت؟ هذه من ناحية برمجية طيب،
واحدة تقول لي أنا لا أريد أن أعمل هكذا، أريد أن
أترك فراغ والله إذا كنت أفرض فرضية بيني وبينك
وأننا نتفج عليها، آجي أقول لك طول ما واحد يعمل لي
New Token فراغ، يجب أن نعتبره by default زائد by
default بيصير ايش أقول له؟ خلاص بيصير أقول له الـ tag
بتساوي و بحط له رقم الزائد هيك خلاص لأنه بيصير كل
ما يعمل initialization لحاجة ما قررهاش أنا ايش
حاططها له بس ايش المنطق يعني كل token اعتبره زائد
فأنا بقول له لأ خلاص أنت بدكش token أساسا ما تعملش
recreation بدك token زائد خلاص الزائد أنا
بخزن لك إياها في الـ tag تبعي بدك token ناقص الناقص أنا
بخزن لك إياها في الـ tag تبعي فهي باختصار القصة عشان هيك
أنا حبيت في الـ creation أن أضع parameter عشان أضعه
جوا الـ tag تبعي بقي باختصار واضحة تمام طيب الآن
هذا الـ token ايش المستقل
بذاته القائم بذاته تعالوا نشوف
أو قبل هذه .. ما أعرفش خلي اللي بدي أطلع عليها دي
الآن أنا بس ده أسأل السؤال في الأول لو كان الـ
lexical لجأ token من نوع number يعني لجأ رقم و بدي
أقول للـ parser لجأ token من نوع number صح؟ الآن
ايش بدي أقول له؟ بدي أقول له return num
تمام؟ بدو ييجي الـ parser كيف بدو يفهم number؟ يعني
كيف بدأ أقول له أنه لجيت number؟ كيف أبعت له إياها؟
أبعت له إياها ككلمة string N-U-M و أفهم الـ parser
أنه لما تشوف أنت الـ N-U-M يعني number و لا كيف ..
ايش رأيكم؟ ايش الحل؟ كيف أعمل .. يعني لما تعمل
أنت return number يا بنات هيك؟ لما تعمل return
number؟ هذه مش مقبولة، شو number؟ صح ولا لأ إلا إذا
أنت قلت له string من نوع نمب وعرفتيها مش هيك ولا
لأ الآن أنا سؤالي كيف أفهم الـ parser صار أنه لاجئتك
من نوع نمب لو كتبت الـ term نمب غلط ايش .. ايش ..
كيف بدنا نفهمه؟
ماشي بدنا نعمل object نمب ماشي عملنا object نمب
أنا سؤالي طب كيف بدنا نفهمه أنه نوعه نمب اعتبره
نوعه؟ كيف أنتج؟ ايش عمل؟ آه
type كيف أبعت الـ type تبعه الآن أنا تبري لجيت
number بدو يفهم اللي ورايا ديگ انه لجيت number ايش
أبعت له أبعت له كلمة string n-u-m و أقول له أنت إذا هي
الـ string أو الـ string compare إذا n-u-m معناها
number و إذا هيك لأ مش number ولا في حل ثاني أفضل
و أحسن
ماشي، مين كمان أوضح؟ أنا فهمت اللي قالت كويس، بس
مين أوضح؟ آه يا مبرمجات المستقبل، ما شاء الله
عليكم، رابع وخمسة، شاطرين في البرمجة كثير طيب،
الآن أنا في عندي أكثر من خيار خيارات منها مش
efficient وخيارات منها efficient باختصار لو أنا
جيت أتكلم بأسلوب أنه ابعت ليها كـ string إنه بعت لك
حروف N U M و هناك N U M مش إنه بيصيرش بيصير لكن
بيتعمل process و قارن الـ N U M مع الـ N U M اللي
عندك عشان تقول هي بعت كلمة N U M و ما بداش تشغل
فيها شغل لكن في ناس شاطرين ايش بيقولوا زي ما
قالت هي قبل شوية قالت إنه ليش ما أنا أعطي كلمة num
من خلال الـ enumerating الـ enum هذه أعطي كلمة num
code 500 مثلا كـ integer value وأسير بعد اليوم
أنا أكتب له return number و لا أبعت له number هو
internally بتعمل كأرقام الـ 500 اللي أنا ثبتها
على number ما أخذتش حاجة فيه زي هيك جبنا هيك؟ زي
الـ define هاي؟ ها دي ما أخذتش حاجة زي هيك؟ أخذتو
هيك زي هيك ولا لأ؟ آه ولا لا يا مبرمجات هاذي شو
معناها أنه بعد اليوم كلمة NUM هي نفسها كأنه رقم
256 فكانتها constant مظبوطة ولا لأ فبيصير بعد اليوم
لما أقول له return NUM أنا بقصد return number بس هو
حيحولها internally لرقم ويفهمها ويشتغل عليها زي
بالظبط الـ character لما بيروح بعوضه بالـ ASCII code
مش هو في الآخر جلبه لرقم عشان يفهم وصار يشتغل
كانتجار فأنا في الحالة هاي .. في الحالة هاي بقدر
جد ما بدي أعمل enough define زي هيك مثلا بدي كلمة
الـ ID بدي كلمة الـ true بدي كلمة الـ while كل واحد
ممكن أحط له ايش رقم وبعدين أسير أتعامل أنا كأسماء
لكن البرنامج بيتعامل كايش كأرقام واحنا أنا راضي هو
راضي والموضوع efficient باختصار طبعا في الجابة كيف
بيسويها الحركة هذه بشكل أفضل من اللي أنا كاتبه
وهذا زي الـ C بالـ C++ بالجواب هيك بعملها بالـ Java
بتختصر بيعمل class مثلا اسمه tag و بيحط فيه
definition جوا ايش بيجي بيقول؟ بيقول الـ num هيها الـ
ID هيها الـ true هيها الـ false هيها عارف هذا شو
معناته؟ معناته إنه أصبح قدرة لدي أقول له return true
إذا بدي true بالـ capital طبعا لإن هو internal
هيفهمها كرقم 258 ويتعامل مع 258 كـ true هو متعامل
معها كأرقام اللي متعامل معها ككلمات وأنا راضي هو
راضي في النهاية طبعا بتوقع أنه أنا مش بس على جد
القائمة هاي بتوقع كل الكلمات المحجوزة كما أنا
عملتها يعني الـ while أديها رقم الـ F أديها رقم الـ D
أديها رقم مش أنا كنت لما أنا ألاجي token من نوع
while اروح أقول ال parser لجيت while كيف نقول لـ
gate Y؟ لازم نديها إيش؟ رقم لـ gate F لديها رقم لـ
gate D لديها رقم فأي كلمة أنت بدك تستخدميها داخل
ال return أو داخل ال parameters أو ال functions زي
ما بدك لازم تعملي لها شو؟ رقم عشان يصير سهل الشخص
يشتغل والـ code سهل يشتغل طيب السؤال الثاني ما أعرفش
لازم أخد الخمس دقائق كاملات الضينات السؤال الثاني
ليش بدأ من أرقام عالية في الأول هل في مشكلة لو عملت
ثلاث مية ثلاث مية واحد ثلاث مية اثنين في مشاكل؟ لا مش
مشاكل طب هل في مشكلة لو عملت من خمسين واحد وخمسين
اثنين وخمسين؟ ليش؟ وهَيصير تداخل مع الـ ASCII code
احنا الـ ASCII code مثلاً خلّيني أعتبر ال range
تبعنا من 0 ل 255 وبالتالي بحط أرقامي من بعد هذا
الكلام ليش؟ لأن افترضي أنا ما اتبعتش هذا الجثة
وروح اتحطيت ال number 50 طب ما يمكن أزايد ال ASCII
code تبعه 50 فلما نقول 50 مش هيعرفني بنقصد زائد
ولا نقصد number فعشان ما يصيرش تداخل ما نحطش اسمين
لنفس الرقم بنروح نبدأ من بعد ال ASCII code من بعد ال
255 شوفتي كيف عشان ما يصيرش تداخل باختصار طيب
تعالوا الآن نشوف بس كيف نعمل الـ code تبع ال Lexar
تبع
ال number لحظة إيش قال ال number ال number extends
token يعني ورث ال token يعني صار خلاص already جوا
ال number حاجة اسمها tag
على طول طبعاً إذا أضيف عليها شو الـ tag ال value
قيمة الرقم الآن إيش هنا حاط parameter يعني وكأنه
بفهم منه إن ال number هيك بعمله creation كيف بعمله
creation ال number مثلاً
number one
يساوي new مثلاً وبحط له مثلاً خمسين مثلاً إيش معنى هذا
اللي أنا سويته تعالي تطلعي بس معاه شوية هذا
هيستدعي ال constructor، مظبوط؟ الـ V هتكون إيش؟
خمسين طبعاً ال value أخدت قيمة مين؟ ال V طبعاً شو
النوع هذا اللي أنا بعدته؟ نوع إيش؟ رقم مش هذا
number عشان إيش قال؟ قال super إيش يعني super؟
يعني حط اللي بين الجثين هنا وين؟ في ال tag تبعتي،
تبعت ال number ليش كتب tag.number؟ عشان ما يكتبش
أرقام؟ مش قولنا تقوى اتفاقنا إنه نعطي لكل رقم كل
اسم رقم مش تقوى حط نم جوا ال tag فأنت خلاص سيرى
tag.num automatic هو إيش هيحط جوا لما بيشتغل الرقم
بتاع ال num اللي يظن 256 لكن أنا مش بكتب ليش طبعاً
أعمل tag dot لأن حاطيتهم كلهم جوا class اسمه tag
ما خليتهمش برا عارف لو أنا ما عملتش class اسمه tag
وعملت إيه زي تحت define num define define define
خلاص ما يعملش لا tag بس برجع له num بس لأن حاطيتهم
جوا class اسمه tag عملت له tag .. ما أعرفش دقيقتين بس
tag dot num ماشي الحال طيب الآن تعالوا لأخر نقطة
هنا اللي هي إيش
الـ Word أو الـ Word الـ Word إيش استدعى؟ أو مين
أخذ؟ مين ورث؟ ال token يعني صار فيه ال tag معروف
تمام؟ وهيضيف عليه الحروف المكونة الآن كيف بعمل
ال creation لل word؟ بعملها زي هيك word مثلاً word
one تساوي new word إيش ببعت له؟ مثلاً إذا نوعه while
tag.y لو بكون معرف الـ while tag.f tag.true tag
.false وهنا إيش بحط الحروف المكونة سواء لل ID أو
لل while أو لل F أو للكلمة اللي عندي طيب اللي هان
إيش بيصير بياخد ال two parameters هدول اللي هي ال
tag النوع و mean والحروف المكونة إيش بيسوي عاد
super T إيش يعني super T يعني هذه ال T النوع اللي
هو tag.id ولا tag.war ولا tag.while ماله بيروح
بيكتبهم في ال tag اللي فوق وال Axiom هذي إيش
بيسوي فيها بيخزن فيها مين ال S سؤال الأخير الآن
عشان نخلص الآن ليش هنا في الـ constructor حط 2
parameter بينما في الـ constructor هنا حط
parameter 1 ليه ما حط ال 2 زي ذاك؟ ليه ما جاله ال
.. ليش ما جاله ال tag.nom 50 زي ما اشتغل هنا
ليش؟ أيوة بالظبط هنا كلهم number فال tag في الشفيه
مجال الخربطة فبدل كل مرة أكتب tag.num 50، tag.num
30، tag.num 20، جالك ارتحت من كلمة tag.num بس أنت
أكتب ال value اللي بتختلف وأنا automatic جوا بعمل
tag.num بينما هنا مش كلهم tag.id ممكن يكون tag
.while، tag.true، tag.false، أنا مش عارف، فبقدرش
هذا automatic يحط حاجة من عنده عشان أكثر والاتنين
لازم يعدوا في لحظة ال creation شو الكلمة وشو نوعها
فهناك لأنه أكثر من خيار اضطررنا نعمل اثنين
parameters، هاي باختصار كل القصة واضحت؟ طيب اليوم
إن شاء الله هنوقف هنا مع إنه عند الطلاب أنا خلصت
ال code كامل تاع الجابة المرة الجاية عشان نطول فيه
تكونوا دارسيني لحد هنا كويس عشان خمس دقائق نخلص
code الجابة وندخل في ال section لجديد