بسم الله الرحمن الرحيم الصلاة والسلام عليكم ورحمة
الله وبركاته اليوم إن شاء الله احنا بدنا نشوف
تطبيق المثال الثاني لتطبيق
الـ syntax directed definitions في بناء الـ syntax
trees كنا شوفنا قبل هيك مثال اللي هو باستخدام الـ S
attributed definition كيف تنبنى الـ syntax tree
باستخدام الـ S attributed definition المثال الثاني
برضه لـ Syntax Tree ولكن الـ Definition اختلف الـ
Attributed Definition الـ Attributed Definition
هذا مبني على الـ grammar هذه الـ grammar هذه قلنا
احنا قبل هيك انه بتعالج الـ left recursion اللي في
الـ grammar الأصلية الـ grammar الأصلية اللي انبنى
عليها الـ S attribute الـ definition اللي هي هذه هذه
فيها left recursion ولا لأ فإن عملت الـ grammar
الثانية هذه
بتتخلص من الـ left recursion وبالتالي صار أنا
مابقدر اعمل S-synthesized attributes فانعمل الـ
inherited attributes
بناء على الـ inherited attributes والغرامر هذه
لدينا الـ ill-attributed definition بالتالي بنشوف
كيف هذا الـ ill-attributed definition بيبني ..
بيعمل نفس الغرض الأولاني اللي هو بناء الـ syntax
tree الـ syntax tree نفس الـ example الأولاني اللي
هو كان عندنا احنا input .. كان عندنا input string
اللي هو الـ A ناقص 4 زائد C okay
الـ syntax tree لهذا الـ input هتكون ببساطة node
للـ plus تشير إلى node الثانية تبع الـ minus اللي
تشير من ناحية إلى الـ node تبع الـ identifier a و
node الثانية تبع الـ number 4
هذا الـ plus تشير إلى الـ minus ومن ناحية أخرى
تشير إلى الـ node تبع الـ identifier C نفس
الـ tree اللي عملتها في الـ example الأولاني بدا هي
نفس اللي عملتها بس الآن الطريقة الـ قليلة اختلفت الـ
grammar اختلفت و اترتب عليها .. الـ grammar اختلفت
و اترتب عليها rules أخرى فاحنا الآن بدنا نمشي step
by step بنزمنا نتخلى ال .. ايش .. الـ grammar هنا و
نعمل الـ tree هنا okay الـ tree طبعا بدنا نشتغل الـ
syntax tree مع الـ parse tree في آخر واحد هاي الـ
syntax tree okay فبدنا ندنيها تدريجيًا مع الـ
Pulsing الـ Pulsing للإكسبرشن هذا هيبدأ من الـ
start symbol اللي هو E مظبوط الـ E ما لوش إلا
production واحدة اللي هي T E prime مظبوط الآن الـ T
هذا بدأ نبدأ فيه الـ T هذا بتتاخد على إن واحد من
الثلاث productions هدولة طبعا هتكون الـ production
الوسطانية رقم 6 اللي هي identifier و الـ
identifier هنا هو عبارة عن الـ إيش عن الـ A okay
بصبوط الان الـ rule تبع هذا الـ production هي أنه
بدنا نعمل الـ leaf node الأولى الـ leaf node الأولى
بدنا نعمل أحطها على الجانب هذا أو تحت هنا الـ leaf
node الأولى اللي هو الـ identifier اللي الـ A
الـ A الـ
A الـ A الـ A الـ A الـ A الـ A الـ A الـ A الـ A
الـ A الـ A الـ A الـ A الـ A الـ A الـ A الـ A
الـ A الـ A الـ A في entry لحرف A رقم واحد في الـ
table نفترض رقم واحد في الـ table بعدها كالتالي لما
الـ lexical analyzer يشوف الـ C بطل هيعملها entry
وإذا في غيرهم هيعملهم entry مظبوط فـ dot entry
attribute تبعت الـ identifier تساوي one مظبوط one
تساوي one لكن احنا عشان لا نشرب حالنا الـ one هذا
يشير إلى إيش و كده نحط الـ a على طول dot entry تشير
إلى اللي هو الـ entry في الـ table فهذه attribute
entry dot entry هي أول attribute بتاخد الـ value
تبعها أنا حطيت الـ واحد فوق اليساوي لأن اليساوي هي
عملية الـ assignment فأول عملية أطاع value لـ
attribute هي اليسار هذا، مظبوط؟ بعد ذلك لما تبني الـ
node لما تبني الـ node لما
تخلص الـ leave method أو الـ leave function تبني الـ
node بتروح بالـ selling pointer لمن؟ لضبط node
attribute تبعت من؟ تبعت
الـ T صح؟ أصبحت الآن هذا كشير إلى هذا الـ node
هذه الـ attribute اللي بتاخد value بعد الـ
attribute لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ
لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ لأ
لأ لأ لأ لأ لأ لأ لأ
خلصت تنفيذ هذه القمرة والعملية تستأنف في عملية الـ
parsing تكمل عملية الـ parsing في عندي الـ E' هذا الـ
E' هذا اللي هو الشق هيك صح؟ بده نعمله parsing ببدأ
بالـ minus يبدو على طول الـ parsing هيجي على استنتاج
لهذا الـ rule
يوجد فيه minus و T و E' الـ E' هي الـ child الـ E' هذه
الـ T
هذه طبعا الـ minus اللي بدنا نعمله ماتش الـ T هذه
بدأ لنعمله parsing parsing على أساس من هذوله الـ ..
لأن عندي أربعة خاطر سنة هنا اجتزنا الـ minus سنة
على الاربعة يبقى هذي none و الـ none هذا ايه هو
attribute اسمه في ذلك؟
Okay هذه الـ attribute اسمها value بتاخد .. بتاخد
ايش؟ بتاخد .. بتاخد .. بتاخد اللي هو الـ value تبع
الـ number اللي هي 4 فأصبح ان هذا رقم تلاتة الـ
attribute الرقم الثالثة اللي بتاخد الـ value تبعه
الآن الـ leaf هذه الـ leaf هذه بتعمل الآن note أخرى
للـ number 4 الـ pointer تبقى هذه الـ note تبقى الـ
T تبقى الـ
T تبقى
الـ
T تبقى الـ T تبقى الـ T تبقى الـ T تبقى الـ T تبقى
الـ T تبقى الـ T تبقى الـ T تبقى الـ T تبقى الـ T
تبقى الـ T تبقى الـ T تبقى الـ T تبقى الـ T تبقى
الـ T تبقى الـ T تبقى الـ T تبقى الـ T تبقى الـ T
تبقى الآن خلاص الأمر هذا ايه ننتقل إلى ايه هو الـ E
prime هذه نعملها الـ parsing تبعها الـ parsing تبع
الـ E prime هذه هيخش على الشاشة إيش ما نسوي سم في
المصحف آه بدي اجيب هذا هيك اجيبه من هنا و هذه خلاص
هذه بنزيحها شوي هيك بصير none بطل سواء أربعة وهذا
اللي بنعملها الآن هذا الـ E' الآن احنا بنحكي عن
الـ مطبق هذه أو جزء هذا من الـ input زائد زائد و T و
E الآن ترتيب الـ value هاي واحد هاي اثنين هاي ثلاثة
هاي أربعة الآن
يفترض ان اكمل فلاش في هذا الاتجاه اجي هنا اعمل
natural plus و ابدأ parsing الـ T للـ T عبارة عن
identifier صح اللي هو enter في الـ symbol table
اللي هو الـ C الآن هذه كذلك الحالة هذه
ستصبح خمسة اللي هو قولنا إيش C اللي هي أعلاه اثنين
يعني بتعمله node يعني الآن بعدين بتتعمل الـ node ده
six صحيح بنعمل هذا rule leave node الـ node هذي
بنحطها هنا ابقى on identifier C اللي أنا اضغط node
تبع هذا بتتأشر عليه فهذا بيصير إيه ستة صبر على إيك
واحد الآن الإشكالية ان انثي هنا اناترتيب ماشي معاه
كويس لغاية هنا هنا هذا قبل ما يعمل الـ C راح اعطى
ال .. أو اللي عملتها هذول .. اللي هم اعطى الـ top
note لـ الـ top inherited تبع تمين تبع الـ E prime
وبالتالي
هذا واحد اثنين ثلاثة اربعة خمسة و بعدين الـ inherited
هذه برضه رحلها للـ inherited تبعت هذه ماشيها
وهذه أصبحت ستة و بعدها صار ان هذه سبعة وهذه ثمانية
بناء على الرسمية عمليًا هذا هو الصحيح هيك لأن أنا
الآن
لاحظ شغل انه حتى الآن هندي ثلاث notes متفارقة ماعي
pointers عليهم لسه ماربطهم مش أنا بالـ operations
بالـ minus و الـ plus وين بدي اعمل .. مين أول شيء بدي
اعمل الـ minus ولا الـ plus الـ plus ولا الـ minus
الـ minus مش عارف على كيف ليش لأنه أنا الآن اللي
أنا الآن بعد ما عملت هذه بعد ما عملت هذه بدي اعمل
الـ Note تبعت الـ minus لأنه احنا خشينا
هذا الـ identifier تلسي كنا وين كنا هنا كنا هنا لما
خشينا صح ولا لأ ولا كنا هنا اول
شيء minus خشينا هاي E بعدين خشينا T بعدين الـ E
prime بعدين الـ minus بعدين E لأن عملت الـ node هذه و
لأن عملت الـ node هذه مظبوط، و الآن خشينا التاني على
الـ plus و الـ T و بعدين E صح؟ مظبوط okay، و أنا الآن
بدنا نعمل الـ plus مظبوط، فالان الـ plus لما بدأنا ..
لما بدأنا نعمل على مستوى هذا، طيب بدا two pointers
pointer يشير إلى مين؟
صبر شوية صبر شوية، احنا الان بدنا نعمل الـ minus
اللي المفروض تعمل هو
عموما
طالع كيف احنا الان بدنا two nodes الـ plus و الـ
minus الـ plus بدتاخد pointer على الـ minus مظبوط هي
الـ tree مرة أخرى هي الـ tree صح، الـ plus لتأخذ الـ
pointer على الـ minus، الـ minus عندها بدا two
pointers واحد على الـ a و واحد على مين، على الرقم
أربعة صح؟ بغض النظر عن مين، بدوني أعمل الأول أنا
الآن لو بدأ أعمل الـ minus نفترض الـ minus هذه بدا
pointer على الـ a و بدا pointer تاني على الأربعة
طيب أنا في الـ level هذا من وين بدأ أجيب pointer على
الـ a، الـ a sibling الـ a الـ a الـ node هذه مين معاه
الـ pointer تبعها، الـ dot node و الـ dot node sibling
لي أنا، حتى لأ، مش sibling لي أنا في المستوى هذا
الآن صح؟ يعني أنا هنا child اللي لها هذه وهذه
sibling لليه، فلازم هذه الـ pointer اللي هنا يترحل
هنا، بعدين أنا أجيبه من الـ parent بظبط اللي هو برضه
الـ parent، لما بجيبه من الـ parent فانا قبل ما احكي
عن بناء الـ minus و الزائد لازم اتم عملية ترحيل الـ
pointer من هنا لهنا، ومثل ذلك لما أنا بدي احكي عن
الـ plus لما أنا بعمل plus معاه pointer، الـ plus بيه
ايش بده على يمينه، بده الـ C هاي pointer معاه على الـ
C من هنا صح؟ بس بدي pointer تاني على الـ minus من
هنا، جيبه بديها من فوق صح؟ فلازم الـ attributes هذه
اترحل، الـ values هذه اترحل، الـ inherited و هذا هو
السبب اللي اسمها inherited لأنها بتاخد من الـ
sibling، بعد ذلك هذه اترحل إلى مين، إلى الـ child و
لهذا السبب هذه اسمها inherited برضه، اترحل إلى الـ
child، هذا الان أنا و أنا هنا و أنا هنا في هذا
المستوى مدعم لـ plus، مدعم لـ plus، النود تبع الـ plus
باخد ها بدنا نعمل الـ plus باخد dot node تبع الـ T
الـ T اللي هي على هذا المستوى بدنا نعمل الـ plus
okay، باخد الـ dot T اللي هي أختها بالنسبالي لمين
على هذا المستوى child بعمل الـ dot .. بعمل الـ ..
باخد الـ dot node تبع الـ T اللي بتشارع على الأربعة
صح؟
لأ احنا هنا في المستوى هذا الـ dot node بتشوّر على
الـ C صح، الـ dot node تبع الـ T هذه بتشوّر على الـ C و
بالزمن ايش؟ بالزمن الـ pointer يوشير إلى مين؟ إلى
الـ minus، من وين بدأ اجيب الـ pointer يوشير إلى الـ
minus؟ مين في هذه اللحظة مع الـ pointer يوشير إلى
الـ minus؟ هيكون هنا هذا الـ pointer، هذا الـ pointer
الضبطي هادي أو على المستوى هادي، هادي مستوى الـ
minus على المستوى هادي، هنكون احنا ايش سوينا، عملنا
الـ node تبع الـ minus هتنعمل، الـ node تبع الـ minus هنا
هتنعمل
الـ minus على المستوى هادي، هتنعمل الـ minus، الـ minus
بدها two pointers واحد يشير إلى الـ A واحد تشير إلى
الاربعة، الـ A هذا الموضوع هتجيبه من الـ E prime
dot inherited الـ E prime dot inherited اللي هي هذه
اللي تحت الفيروس صح، هذا الموضوع يأتي من هنا فهذا
الان انتسخ إلى هنا، صارت هذه تشير إلى الـ A صح الآن
باخد هذا الـ pointer و بسجله هنا، طب تقول انا جاية
انتسخ عشان الـ simple examples يعني الـ pointer تبع
الـ T لما راح نال A الـ
pointer تبع الـ T لما راح نال A الـ pointer تبع الـ T
لما راح نال A تبع الـ T لما راح نال A تبع الـ T لما
راح نال A تبع الـ T لما راح نال A تبع الـ T لما راح
نال A تبع الـ T لما راح نال A تبع الـ T لما راح نال
A تبع الـ T لما راح نال A تبع الـ T لما راح نال A
تبع الـ T لما راح نال A تبع الـ T لما راح نال A تبع
الـ T لما راح نال A تبع الـ T لما راح نال A تبع الـ T
لما راح نال A
تبع الـ T
أجتني .. أجتني الـ dot الـ pointer تبع هذه هي مخزن
هنا اترحل هنا، صارت هذه اشتغلت اترحل
لأن هي عندي أنا هذه بتقولي الـ dot
node تبع الـ T بتروح على الـ inherited تبع الـ E
prime بس هو السؤال .. السؤال الأهم أن هذا الأمر ..
هذا الـ assignment بتحدث على هذا المستوى مش على هذا
المستوى .. اه المفروض هي .. المفروض هي تكون شوفت
هنا و هنا هذه الـ .. هذه الـ function اللي بتعمل الـ
node لحظة ما .. قبل ما تعمل .. يعني هذه المفروض
تكون موجودة على كخطوة سابقة لـ creation .. creating
الـ node لأن لو بدأنا نعمل على هذا المستوى لسه هذه
ماتكونش أخدت الـ value تبعها لأن هذا الأمر كان مطبق
بعد ما اكتمل فاحنا الآن بنجي نعتبرها أن هذا موجود
كسطر سابق لهذه هنا سابق لهذه، فانت تخيل أنه قبل ما
نعمل الـ note تبع الـ plus أو قبل ما نعمل الـ note
تبع الـ minus، احنا الآن في الـ minus قبل ما نعمل الـ
note تبع الـ minus بدون ايه اترحلها، اترحلها ده هنا
صار هالي معانا pointer على الـ a الآن، ده تنعمل الـ
note تبع الـ minus معانا pointer على الـ a موجود هنا
تمام، هيا تبقى نحطه هنا قبل ان أنا اعلى الـ code
بتقولي خد بال inherited تبع الـ E و الـ node التالي
تبعت الـ T هذه انعملت اللي هي الأربعة هي تموجد هنا
باخدها أبوكي لي خدها لدّه node تبعت الـ T خدها
فبصارت هذه الـ node بتشير إليها الـ pointers هذه
لازالت بتشير، بس خلاص أنا هذا اللي مهمنيش الآن
مهمني أنه أخدت منهم وخزنت على ال نفس الأشي الآن
بدي أن أعمل على مستوى الـ plus على مستوى هذيبس قبل
ان أنا اعمل الـ plus بتكون انعملت مين الـ leaf node
هذه الـ C الان بتنعمل اللي هو الـ plus تنساش برضه
كمان ان الـ inherited هذه رحلت له هنا ليش عشان أنا
هنا في هذا المستوى ربما احتاجها بل أني فعلا
هحتاجها أنا على هذا المستوى بعد ما اعمل الـ plus الـ
plus هتحتاج تربط مع الـ minus فبدل ما أنا و أنا هنا
اروح لسه ادور عليه فوق هي بتترحل تلقائيًا، الخمسة
اترحلت على طول الـ inherited، اترحلت على طول الـ
inherited تبع الـ tribe، صار الآن هذا يشير إلى مين
الـ minus يشير إلى الـ minus بالظبط يبقى أنا الآن
معايا إشارة pointer على الـ minus، هاخش هعمل الـ node
هذه بعد 6 هتنعمل 7 8 هتنعمل مين؟ هتنعمل الـ
node هذه، بصار معايا pointer عليها الآن، ضايل أعمل
الـ plus هاي اللي عملت الـ plus بس بدها pointer على
الـ minus، من وين بتجيبه هاي اللي يقول خد من الـ
inherited تبع الـ E prime، أنا هاي الـ E prime مش الـ
child، E prime هيته، صار هذا الان يشير إلى هذا
و التانية الـ pointer التاني اللي هو T ضبط نوت نجي
هذه تشير إلى هنا و هذا يشير إلى هنا لأن برضه كذلك
الحالة بدي الآن الـ inherited تبعت هذه، هذه
الـ node اللي تتوان عاملة مين معاه pointer تبعها
اضطط node method لرمى العاملتها اضطط الـ pointer
لمين
عندما قمت بعملها اعطي الـ pointer لمن؟ لـ heritage
لـ heritage وهذا الـ payment هو heritage ليش؟ علشان
إذا بدنا نرحله لسه كمان لتحت يعني نفترض انه فيها
دي okay اه الآن مافيش شيء لسه نفترض ان الـ string
لسه فيه كمان operation فلو في عندي كمان operation
هتنعمل إليها node، الـ node هذهبدأ تشير إلى الـ plus
يعني بدأ تركب فوق الـ plus هي زي ما الـ plus ركبة
على كتف الـ minus، إذا في عملية تانية بدأ تركب على
كتف اللي هو الـ plus و يبدأ يكون فيها طبعا upper
hand آخر هينعمل جوا هناك، فالغرض من التسليم الـ
pointer إلى الـ child هو عشان الـ child يسلمه
للمستوى اللي عنده اللي بتاعته، الان هنا الـ inherited
الـ E هذه خلاص احنا بعد ما شوفنا الـ C مافيش يظلش
ايش فيها هذي قد تكون Epsilon، Epsilon معناه ذلك ان
هذي الـ production
بالتالي معناه هذا الـ rule، هذا الـ rule بتقول انه
سلم الـ inherited تبع الـ E prime ومافيش اللي هو E
prime مافيش الـ children يعطي الـ parents لا مافيش
children ولا parents، هذا هو نفسه بس إله two
attributes واحد ال synthesizer واحد ال inherited
فبقول لي أعطي ال inherited لل synthesizer نبعته
تمام؟ إيش؟ لنفسه أيوة هو بيسلم من يد ليد بداخل
نفس ال symbol ال E prime الآن ال inherited تبعته
إيش اللي هو اللي احنا قلناه؟ هي عبارة عن إيش؟ هذا
الآن بعد ما عملنا سبعة ثمانية آه بعد ما عملنا سبعة
ثمانية إيش عشان التسعة؟ بعد ما عملنا سبعة ثمانية 9
هذه رحلتها هي تسعة هي سبعة ثمانية هذه تسعة هي تسعة
هذه تسعة اللي ارتدت أخذت أوي بالظبط بالظبط اللي هي
هذا ال pointer بتبع ال plus نزل على هنا صح فهذه
تسعة سبعة ثمانية انعملت ال plus ال pointer بتبعها
مع ال inherited نزل على .. مع ال E هذه بس نزل على
.. مع ال E prime هذه نزل على ال E prime هذه بعدك
عشرة إنه يشوف ياخذ يدي ال inherited ل ال
synthesized عشرة إنه إيه بالظبط عشرة إن ال
inherited أخده ل ال synthesized okay
الـ inherited للـ synthesizer الآن بعد هي كان و
احنا في الرجعة ال synthesizer بتسلم لل synthesizer
إن هنا اسمه synthesizer لأنه بطل لفوق ال
synthesizer هذه بتسلم لل synthesizer تبع ال parent
تبعه هيته هنا بعد ما اكتمل ال parsing تبع ال minus
أو تبع ال plus
E1 يعني بتسلم لـSynthesized تبعت ال parent ثم نفسي
بيجي على مستوى ال minus ال synthesized هذه بتسلم
لـSynthesized تبعت ال parent في الآخر في الآخر هذه
ال dot node تبعها بيأخذ
من ال synthesized تبع ال
dot node تبع ال root symbol بيأخذ من الـSynthesis
تبع مين؟ الـRain Child يجي رأس الـ Tree أو ال
Root تبع الـSyntax Tree كان بترحل down لغاية ما
وصلنا لل dead end بعدين بدأ يرجع عشان يرجع الـRoot
فالـRoot تبع الـSyntax Tree رجع للـRoot تبع الـتبع
.. تبع ال parse tree ال root تبع ال syntax tree
كان بترحل لتحت إلى أن وصلنا ال dead end بعد كده
رجع يترحل لفوق ليصير .. يصل إلى اللي هو ال root تبع
ال parse tree
طبعًا نحصل حظ احنا بس في الامتحان بنحل .. بنعمل
المثال هذا، إنما في الواقع العملي ال compiler
generator هو اللي بيتولى الأمر هذا okay فهذا الآن
تطبيق لقولتنا اللي هو كيف تستخدم ال semantic rules
في بناء syntax tree شفناها في حالتين حالة اللي هو
synthesized attributes اللي جاء كجزء من S
-attributed definition مبني على Grammar Grammar
هذه معاها جزء من ال L-attributed definition فهي
طريقة أخرى لبناء ال syntax tree نفس ال syntax tree
في القرآن مثل آخر اللي هو ال type ال types أو ال
type declarations لما .. طبعًا كل ال grammar اللي ..
ال grammar هذه اللي شفناها احنا هذه ال
expressions ال E هدول expressions لكن لو البرنامج
بيحتوي على .. بيحتوي على type declaration type
declaration احنا لما بنحكي عن type declaration
يعني بنعرف variable متغير ونقيله type okay ف ال
type declaration عادة مثلًا في ال C ديش بنقول
integer X صح؟ فال declaration نفسها هي عبارة عن
type و identifier صح؟ يعني ال declaration can have
the format type مطبوعة بإيش؟ identifier مظبوط و
طبعًا في الدراسين الفورية ال type هذا بهمني إذا هو
complex type يعني إيش complex type؟ يعني هنا basic
مثلًا integer float أو كده هو في Complex اللي هو
array أو structure أو record أو ما يعني بهمني إذا
هو Complex أحسب شكليته أول شيء أحسب ال size اللازم
يعني إذا هو array array of integer ال integer طوله
مثلًا 4 byte وبالتالي 4 طيب ال array قداش عشر أو
اثناش element أربعة في اثناش هي ال size اللي في ال
memory محتاجه صح؟ 840 byte أربعة اثناش هذا يهمني
الشيء اللي هو ال size طبعًا إذا كان ال array one
dimensional ولا two لا three لازم أحسب بالظبط كده
ال size في ال frame برضه كذلك حال بدي أحسب إيش بدي
أحسب ال type تبع هذا ال complex type إيش ال type
تبع ال complex type لما أنا بقول شيء زي هيكة integer
اثنين في ثلاثة شو ال type ما هو مش integer بس يعني لو
أنا معرف
X هذا X، تمام؟ الـ X هذا، شو نوعه؟ هل هي integer؟
لا، هي array of اثنين of array of ثلاثة في إيش؟
ثلاثة إيش؟ of integer، صحيح؟ تمام؟ هذا القرار مهم،
لأن أنا وأنا لما أبدأ أقول مثلًا X زائد Y Z يساوي X
زائد Y هل ال operation هذه تجبل متغير من هذا
النوع؟ لا، صح؟ فأنا عملية ال type-checking فحص ال
type عشان ال compiler يعترض أو ما يعترضش بلزم
أصلًا تعريف ال type أصلًا تحديد ال type عشان أقدر
أقارن هل هذا ال type هل ال type تبع X مقارنة
بال type تبع Y؟ مظبوط ولا لا؟ فأنا بالزمني من ال
declaration .. من ال declaration بالذني ال
compiler يبقى قادر على شغل ثاني قادر على حساب ال
size تبع ال type و حساب ال type نفسه تبع ال type
على أساس يقدر يقارن هل ال two variables هدول are
of the same type ولا لا بالظبط فاحنا بنعبر عن ال
type على شكل شيء زي يعني أنا لما يكون في عندي
variable identifier أبدأ أقول ال type تبعه إيش
بالعبر عنه هل هو والله يعني ال variable هذا ال
identifier ال type تبعه ممكن يكون عبارة بس مجرد
integer ممكن يكون float هدول basic صح ممكن يكون
array of اثنين integer أو array of كذا integer
يعني هنا مثلًا اثنين هذا أحط مدالها in أو array of
in of array of كذا و
some basic type يعني المهم احنا يكون عندي ال
compile قادر على إنه يوصف ال type عشان يقدر يقارن
types فأنا الآن لو عندي declaration
لو عندي declaration بدي grammar أول شيء grammar
عشان فحص ال declaration من ناحية syntax هل هي
صحيحة ولا لا و بدي معاها rules أتمكني من أحسب ال
size و rules أتمكني من أحسب ال type و هذا هو مفعول
ال grammar هذه ال grammar هذه بس لل type مش لل
size يعني ال dot T attribute
ل type وجودها بنشوف حكاية ال size أنا عندي هنا
ال grammar لتحديد ال syntax عشان يستخدم ال parser
في ال syntax analysis في ال parsing يعني ومعانا
rules عشان يقدر يعطي ال dot T attribute قيمته فلو
أنا عندي اللي هي نفس هذه ال .. قلنا إيش .. قلنا ..
integer 2x3 some variable x احنا الآن مش معنين
بذا و ال parsing تبقى معنين نأخذ هذه احنا
متفقين إن ال declaration تنهي برقم T و identifier
و Synchrony هذه الآن افترض إن أنا عندي ال input
هذا وأنا الآن بعمله parsing فهي D can have a form T
و إيش identifier ويقسم a colon طبعًا ال T هذا الآن
بتعمله parsing على أساس هذا ال grammar فواضح إن هو
عبارة عن إيش أولًا تقلع ال grammar ال grammar هذه
بتقول إن ال type هو عبارة عن basic متواجد ب
complex بس مش دائمًا فيه complex صح مش دائمًا فيه
complex يعني ممكن يبقى بس integer أو float بس عشان
هي كده ال complex هي دي فيها rule بتقول آه can
have the form epsilon okay فأنا الآن عندي ال .. في
عندي basic O C ال basic عبارة عن N T and و ال
complex عبارة عن إيش في عندي هنا rule بتقولي can
have the form إيش goose بعدين number بعدين goose
بعدين complex و ال complex أنا فعلاً فيه عندي هذا ال
number الآن هو ال two عندي gross و num و gross و
عندي كمان ال c بس ال c هذه epsilon النم هذا هو
ثلاثة هذا ال parse ال three تبع هات نعم كيف؟
هذا ال parse ال three لا خلاص احنا ال ID هنا X هذا
الـ parse tree تبع الـ declaration الكل احنا ما
يعنينا هو الشق هذا اللي هو تبع الـ T نشوف إنه كيف
ال rules بتحسب بتشكل تبع الـ T attribute تبع ال
type يعني
عمليًا أنا بدك تتخيل شيء آخر اللي هي إنه في
production ال production هذه هي rule بتقول لي إن ال
ID dot type يساوي ال T dot type صح ولا لا؟ لما أنا
أبدأ أسأل عن ال type تبع X آخذ ال type تبع X من ال
type تبع ال declaration .. ال type .. ال type
declaration اللي قبل صح؟ فهذه تحصيل حاصل فالسؤال هو
كيف هذه تأخذ الـ value تبعها من الـ rules هذه اللي
بيصير إن احنا طبعا بمجرد إن تضبط الـ parsing تبع الـ
P خلاص الـ P ضبطت ضبطي
بيساوي integer
خشنا هنا الآن الـ C الـ C الـ C.T بسوء ايش بسوء
array of اتنين من أين جبناها الاتنين من هذا هذا
خلاص هذا معروف النم إن هو الاتنين فصح اتنين of
ايش افتح دول الـ C.T بس هو جداش نعرف لما ندخل
هنا الـ C هذه طبعاً C1 يعني child هذه الـ C parent
وهذه الـ C child الـ C1 تبحر تبحر تبحر تبحر
تبحر تبحر تبحر
الـ c.t بيساوي الـ c.b بيساوي الـ c.b بيساوي الـ c
.b بيساوي الـ c.b بيساوي الـ c.b بيساوي الـ c.b
بيساوي الـ c.b بيساوي الـ c.b بيساوي الـ c.b
بيساوي الـ c.جالي هذا برضه إنه أعمل الـ child تبعتك
الـ c.b تبعته يساوي ايش الـ c.b تبعت الـ parent ليش
الـ c.b تبعت الـ parent تبعت الـ parent اللي فوق برضه
جاي من الـ c.b تبعت الـ parent اللي فوق طب هذا الـ c
.b تبعته وين أجده من الـ T اللي ورا بمجرد إن أنا
خشيت هنا هذه أترحلت ليه هيته هنا الـ B.T أترحلت
من الـ sibling إلى هنا فهذه integer صح الـ .B
أخذت .T اللي هي integer وهذه أترحلت إلى هنا وهذه
أترحلت إلى هنا الآن بما إنه خلاص مافيش تشعر فهذه
ستترحل هنا صح ستصبح integer الآن في العودة الـ T هذه
بينها وين تروح؟ مظبوط؟ بيصير هذا of integer،
مظبوط؟ صح؟ لأن هذا الـ T بيروح حال هنا اللي هو ايش؟
كله الـ rate of تلاتة integer هذا
هيكل كله بيترحّى فوق الآن هذا كله الـ .T هذا كله
هيك بيترحى لوين صح هي في الـ C.T بيترحى لـ الـ T
.T خلاص ما انديش أنا أساعدك مرة أخرى بس هذا
الكلام ده كله طبعا فيه جثث هنا مظبوط okay
ديبكي أنا الآن صار عندي آلية
لتحديد الـ type attribute تبع الـ declaration تبع أي
declaration complex ولا basic إذا هي basic ستبقى
على طول هذا على طول إذا هي complex سنتشعب إلى أن
ننتهي ننتهي لهذا وبعدين نرجع نشكل الـ .T من
التحت لأن هذا الـ .T تلقائياً في الـ rule هذه في
الـ production هذه بتحط الـ rule إن اتسلم له الـ .
T تبع الـ identifier عشان يتحدد الـ type تبعه هذا الـ
.T الآن تلقاه برضه لازم يتسجل في مين؟ في الـ
single table الـ lexical analyzer اللي اكتشف الـ
identifier اكتشفه بس ما لوش علاقة بالـ type تبعه الـ
parser لما بيعمل parsing وبيطبق الـ rule هو بيكتشف
الـ type بروح له برمي الـ أو بسجل هذه المعلومة في الـ
symbol table علشان جدام تستخدم في ايش في الـ
semantic analysis الـ semantic اللي هو واحد من الـ
semantic analysis actions اللي هي type checking
لنفحص مطابقة الـ operands للـ operations إذا عندي
plus operation هل الـ operations الـ type سبق منهم
equivalent ولا لأ هل إذا operations ولا إذا
function أنت عارف ما هي الـ function أصلا ممكن
تخيلها الـ function لما أنا بعمل function call الـ
parameters تبعونها بقدر أنا أتخيل الـ function هذا
عبارة عن ك في syntax tree ك note وإلى تلاتة
children كل واحد من الـ parameters دولة child okay
فأنت بدك تتأكد إن الـ function هذا أخذ upper head
كأنها function ودولها upper ends إليها okay أخذت
هذه الـ Apparence اللي تنوعها مطابق للنوع اللي في
الـ declaration تبعها هي هذا برضه الـ f عبارة عن
function و لها type لها type output و لها type
input okay
and هنا احنا بنكون وصلنا لنهاية من الـ section خمسة
تلاتة اللي هو موضوع الـ syntax directed definitions
وشوفنا مقامة اللي عليها تطبيق اللي هو الـ syntax
definitions الـ syntax directed definitions في بناء
الـ syntax tree وفي الـ structure of a type في تحديد
الـ structure of a type okay الـ section خمسة أربعة
عشان مشابه لهذا الكلام في الآخر هو ده حكي عن
translation بس و syntax directed بس باستخدام Syntax
Directed Translation Schemes