8
-1 - ﻣﺨﺒﺮ اﻵﻻت اﻟﺤﺎﺳﺒﺔ اﻟﺴﻨﺔ اﻟﺮاﺑﻌﺔ ﺣﺎﺳﺒﺎت- ﻋﻤﻠﻲ ﻣﺎدة اﻟﻤﺘﺮﺟﻤﺎت إﻋﺪاد اﻟﻤﮭﻨﺪﺳﺔ: ﺟﯿﮭﺎن ﺑﺮﻛﺎت ﻋﺒﺪو اﻟﺠﻠﺴﺔ اﻟ ﺜﺎﻟﺜﺔ+ اﻟﺠﻠﺴﺔ اﻟﺮاﺑﻌﺔ ﺍﻟﻤﺤﻠﹼل ﺍﻟﻠﻔﻅﻲLexical Analyzer ﺇﻥLEX ﺘﻪ ﺍﻟﺘﻭﻟﻴﺩ ﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﺒﺭﻨﺎﻤﺞ ﻤﻬﻤ، ﺔ ﻟﺴﻼﺴـل ﻤﺤـﺎﺭﻑ ﻡ ﻟﻠﻤﻌﺎﻟﺠﺔ ﺍﻟﻠﻔﻅﻴ ﻓﻬﻭ ﻤﺼﻤ ﺍﻟﺩﺨل. ﺤﻴﺙﻨـﺘﺞ ﺔ ﻭ ﻴ ﺔ ﻭ ﺍﻟﻤﺤﺭﻓﻴ ﺃﻨﹼﻪ ﻴﺴﺘﻘﺒل ﻋﻠﻰ ﺩﺨﻠﻪ ﺘﻭﺼﻴﻔﺎﹰ ﻋﺎﻟﻲ ﺍﻟﻤﺴﺘﻭﻯ ﻟﻠﺴﻼﺴل ﺍﻟﻨﺼﻴ ﹰ ﺒﻠﻐﺔ ﺫﺍﺕ ﺃﻏﺭﺍﺽ ﻋﺎﻤ ﺒﺭﻨﺎﻤﺠﺎ ﻫﺫﻩ ﺍﻟﺘﻌﺎﺒﻴﺭ ﻴﺘﻡ ﻑ ﻋﻠﻰ ﺍﻟﺘﻌﺎﺒﻴﺭ ﺍﻟﻨﻅﺎﻤﻴﺔ ﺤﻴﺙ ﺃﻥ ﻤﻜﺎﻨﻬﺎ ﺍﻟﺘﻌﺭﻤﻬﺎ ﺍﻟﻤﺴﺘﺨﺩﻡ ﻜﺩﺨل ﻟـ ﺒل ﺍﻟﻤﺴﺘﺨﺩﻡ ﻋﻥ ﻁﺭﻴﻕ ﺍﻟﺘﻭﺼﻴﻔﺎﺕ ﺍﻟﺘﻲ ﻴﻘﺩ ﺘﺤﺩﻴﺩﻫﺎ ﻤﻥ ﻗLEX . ﺍﻟﺒﺭﺍﻤﺞ ﺃﻭ ﺍﻟﺸﻴﻔﺭﺓ ﺍﻟﺘﻲ ﻴﻭﻟﺩﻫﺎ ﺇﻥLEX ﺔ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓـﻲ ﻑ ﻋﻠﻰ ﺍﻟﺘﻌﺎﺒﻴﺭ ﺍﻟﻨﻅﺎﻤﻴ ﺘﺴﺘﻁﻴﻊ ﺍﻟﺘﻌﺭ ﺴﻼﺴل ﻤﺤﺎﺭﻑ ﺍﻟﺩﺨل، ﺔ ﺘﻁﺎﺒﻕ ﺍﻟﺘﻌﺎﺒﻴﺭ ﺍﻟﻨﻅﺎﻤﻴ ﺘﻘﻭﻡ ﺒﺘﻘﺴﻴﻡ ﺴﻼﺴل ﺍﻟﺩﺨل ﺇﻟﻰ ﺴﻼﺴل ﻨﺼﻴ ﻜﻤﺎﻓﺔ ﺍﻟﻤﻌﺭ. ﻤﻠﻑ ﺃﻱ ﺇﻥLEX ﻓـﺔ ﻭ ﺒـﻴﻥ ﺔ ﺍﻟﻤﻌﺭ ﺍﻟﻤﺼﺩﺭﻱ ﻴﺭﺒﻁ ﺒﻴﻥ ﺍﻟﺘﻌﺎﺒﻴﺭ ﺍﻟﻨﻅﺎﻤﻴ ﺍﻟﻤﻘـﺎﻁﻊ ﺔ ﺍﻟﻭﺍﺭﺩﺓ ﻜﺴﻼﺴل ﻨﺼﻴ ﺍﻟﺒﺭﻤﺠﻴ، ﺭﺩ ﻅﻬﻭﺭ ﺘﻌﺒﻴﺭ ﻨﻅﺎﻤﻲ ﻋﻠـﻰ ﺩﺨـل ﺍﻟﺒﺭﻨـﺎﻤﺞ ﺒﺤﻴﺙ ﺃﻨﹼﻪ ﺒﻤﺠ) ﺍﻟﻤﻭﻟﹼﺩ ﺒﺎﺴﺘﺨﺩﺍﻡLEX ( ﺔ ﺍﻟﻤﻘﺎﺒﻠﺔ ﻟﻬﺫﺍ ﺍﻟﺘﻌﺒﻴﺭ ﺍﻟﻨﻅﺎﻤﻲ ﻓﺈﻨﹼﻪ ﺴﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺍﻟﺘﻌﻠﻴﻤﺎﺕ ﺍﻟﺒﺭﻤﺠﻴ. ﺇﻥLEX ﻟﻴﺱ ﻟﻐﺔ ﻜﺎﻤﻠﺔ ﻤﺘﻜﺎﻤﻠﺔ، ﹼﺩ ﻭ ﺇﻨﹼﻤﺎ ﻫﻭ ﻤﻭﻟGenerator ﺯﺓ ﺠﺩ ﻴﻤﺜﹼل ﻤﻴ ﻴﺩﺓ ﻴﻤﻜﻥ ﺇﻀﺎﻓﺘﻬﺎ ﺇﻟﻰ ﻟﻐﺎﺕ ﺒﺭﻤﺠﺔ ﻤﺨﺘﻠﻔﺔ ﻭ ﻟﺩﻯ ﺇﻀﺎﻓﺔ ﻫﺫﻩ ﺍﻟﻤﻴﺯﺓ ﻷﻱ ﻟﻐﺔ ﺒﺭﻤﺠﺔ ﻓﺴﻨﺤﺼل ﻋﻠﻰ ﻤﺎ ﻴﻌﺭﻑ ﺒﺎﻟﻠﻐﺔ ﺍﻟﻤﻀﻴﻔﺔHost Language . ﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻠﻐﺎﺕ ﺍﻟﻤﻀﻴﻔﺔ ﻤﻥ ﺃﺠل ﺍﻟﺸﻴﻔﺭﺓCode ﹼﺩﺓ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﻭﻟLEX ﻭ ﻜﺫﺍ ﻤـﻥ ﺃﺠـلﺒل ﺍﻟﻤﺴﺘﺨﺩﻡ ﺔ ﺍﻟﻤﻜﺘﻭﺒﺔ ﻤﻥ ﻗ ﺍﻟﻤﻘﺎﻁﻊ ﺍﻟﺒﺭﻤﺠﻴ. ﻜﻤﺎ ﻴﻤﻜﻥ ﺇﻀﺎﻓﺔ ﺍﻟﻤﻜﺘﺒﺎﺕ ﺍﻟﻤﺘﻭﺍﻓﻘﺔ ﻤـﻊ ﺍﻟﻠﻐـﺎﺕ

compiler 02

Embed Size (px)

DESCRIPTION

compiler structure

Citation preview

- 1 -

مخبر اآلالت الحاسبة عملي مادة المترجمات -السنة الرابعة حاسبات

جیھان بركات عبدو: إعداد المھندسة الجلسة الرابعة+ثالثةالجلسة ال

Lexical Analyzerالمحلّل اللفظي

فهو مصمم للمعالجة اللفظية لسالسـل محـارف ، هو عبارة عن برنامج مهمته التوليدLEXإن

أنّه يستقبل على دخله توصيفاً عالي المستوى للسالسل النصية و المحرفية و ينـتج حيث. الدخل

مكانها التعرف على التعابير النظامية حيث أن هذه التعابير يتم إبرنامجاً بلغة ذات أغراض عامة ب

. LEXتحديدها من قبل المستخدم عن طريق التوصيفات التي يقدمها المستخدم كدخل لـ

تستطيع التعرف على التعابير النظامية الموجودة فـي LEXإن البرامج أو الشيفرة التي يولدها

كما تقوم بتقسيم سالسل الدخل إلى سالسل نصية تطابق التعابير النظامية ، سالسل محارف الدخل

المقـاطع المصدري يربط بين التعابير النظامية المعرفـة و بـين LEXأي إن ملف . المعرفة

بحيث أنّه بمجرد ظهور تعبير نظامي علـى دخـل البرنـامج ، البرمجية الواردة كسالسل نصية

.فإنّه سيتم تنفيذ التعليمات البرمجية المقابلة لهذا التعبير النظامي) LEXالمولّد باستخدام(

إنLEX و إنّما هو مولّد ، ليس لغة كاملة متكاملةGenerator زة جديدة يمكن إضافتها يمثّل مي

إلى لغات برمجة مختلفة و لدى إضافة هذه الميزة ألي لغة برمجة فسنحصل على ما يعرف باللغة

.Host Languageالمضيفة

و كذا مـن أجـل LEXالمولّدة باستخدام Codeيتم استخدام اللغات المضيفة من أجل الشيفرة

يمكن إضافة المكتبات المتوافقة مـع اللغـات كما . المقاطع البرمجية المكتوبة من قبل المستخدم

- 2 -

هـذه المزايـا . المضيفة الستخدام التوابع التي تقدمها هذه المكتبات في إضافة األفعال المرغوبة

.من قبل بيئات و مستخدمين مختلفين LEXتفسر التبنّي الواسع لـ

.Cفي الوقت الحاضر فإن اللغة المضيفة الوحيدة المدعومة هي لغة

إلى لغة مضـيفة ذات ) Sourceالمسماة المصدر(بتحويل تعابير و أفعال المستخدم LEXم يقو

.yylexو نسمي البرنامج المولّد ، أغراض أو أهداف عامة

الموجودة في تدفّق الدخل و ينجز Expressionsيتعرف على التعابير yylexحيث أن البرنامج

يلقي نظـرة علـى )١(الشكل. يتم كشفه و التعرف عليه مجموعة من األفعال المحددة لكل تعبير

:LEXعمل

+-------+Source -> | Lex | -> yylex

+-------+

+-------+Input -> | yylex | -> Output

+-------+

LEXنظرة عامة على عمل )١(الشكل

أو لتحقيـق التحليـل و التجميـع ، امج التحويل البسيطةبمفرده النجاز بر LEXيمكن استخدام

مـع مولّـد المحلّـل LEXو يمكن أيضاً استخدام ، Lexicalعلى المستوى اللفظي اإلحصائي

- 3 -

Parser لتشكيل مرحلة التحليل اللفظيLexical Analysis Phase ، تحقيق مع اإلشارة إلى أن

تتعرف على التعابير LEXحيث أن برامج . تحديداً يكون سهالً YACCو LEXالمالءمة بين

يولّد محلالت تتعامل مع مجموعة كبيرة لكنّها محددة من القواعـد YACCبينما ، النظامية فقط

لكنّه يبقى بحاجة إلى تحليل منخفض المسـتوى Context Free Grammarالخالية من السياق

.مالئماً YACCمع LEXلذا يكون تجميع، Tokensللتعرف على الوحدات اللفظية

فإنّه يقوم بتقسيم تسلسل الدخل و Parserكمرحلة مبكّرة لتوليد المحلّل LEXاستخدامعندما يتم

.من ثم يقوم المحلّل بتشكيل البنية المطلوبة من القطع الناتجة

:LEXملف المصدر الخاص بـ -

:المصدري هي كاآلتي LEXإن الصيغة العامة لملف

{Definitions}

%%

{Rules}

%%

{User subroutines}

المستخدم الفرعية غالباً ال يتم استخدامها و بناءاً إجراءاتو Definitionsحيث أن التصريحات

أما األول فهو ضروري لإلشارة إلى بداية القواعد ، األخير ليس إلزامياً %%على ذلك فإن الرمز

ــامج ــر برنـ ــإن أقصـ ــذا فـ ــى هـ ــو LEXو علـ ــالق هـ ــى اإلطـ : علـ

%%

و هذا ينتج عنه برنامج يقوم بنسخ الدخل إلـى الخـرج دون أي ، أي ال تصريحات و ال قواعد

.تغيير

- 4 -

ـ Rulesتُظهر أن القواعـد LEXإن نظرة تجريدية على شكل ملف المصدر الخاص بـ ل تمثّ

هذه القرارات تكون بما يشبه جدول عموده األيسـر يحتـوي التعـابير . قرارات تحكّم المستخدم

أما عموده األيسر فيحوي األفعال الواجب تنفيـذها عنـدما يـتم ، )التي سنبينها ال حقا(النظامية

.التعرف على التعابير

:إن القاعدة اآلتية، و كمثال على ذلك

integer printf("found keyword INT");

" تعني البحث عن السلسلة النصية integer" في سلسلة الدخل و من ثـم طباعـة الرسـالة"

found keyword INT "دة بالطرف األيسر للقاعدةة المحدف إلى السلسلة النصيد التعربمجر.

فإذا كان الفعل المطلوب انجازه عبارة عـن . Cالمضيفة هي اإلجرائيةفي هذا المثال فإن اللغة

فيكفي وضعه على الطرف األيمن أما إذا كان الفعل مركّباً من عـدة تعـابير Cتعبير مفرد بلغة

.فيجب وضعه بين أقواس مجموعة

لنفرض أنّنا نريد تحويل بعض الكلمات من التهجئة البريطانية إلى األمريكية ، و لنعطي مثال آخر

:لقواعد كما يأتيفستكون ا

colour printf("color");

mechanise printf("mechanize");

petrol printf("gas");

- 5 -

LEXالتعابير النظامية في -

و ...) ،عمليـات ،أحـرف ،أرقام(Charactersإن التعابير النظامية تحدد مجموعة من المحارف

على العديد من التعابير النظامية التي تغطّي LEXيشتمل . معهاالتي ستتم مطابقة تسلسل الدخل

:لكنّنا سنكتفي بذكر بعض القواعد و هي ، احتماالت كبيرة لسالسل لغة المصدر

ة التي يتعامل معهاالعمليات المحرفي إنLEX هي :

" \ [ ] ^ - ? . * + | ( ) $ / { } % < >

تحدد أن كل ما يأتي بين زوج منها ستتم معاملته كـنص " حيث أن عالمة التنصيص

كما أنها ++xyzتعني المطابقة مع السلسلة النصية "++"xyzلذا فإن ، محرفي

."++xyz"يمكن أن تُعرف

فمثالً ، []لتحديد صفوف من المحارف نستخدم األقواس[abc] مطابقة مع محرف تقوم بال

و []و هنالك ثالثة عمليات فقط لها تأثير داخل القوسين . cأو a ،bواحد فقط قد يكون

.، ^-، \: هي

بـين ) -( أي إن اسـتخدام ، و األرقام، zحتى aتعني األحرف من [a-z0-9]فمثال

أمـا cو أ bأو aتعني جميع األحرف ماعـدا [abc^]بينما .محرفين يعني مجال بينهما

[^a-zA-Z] ًاة . فتعني المطابقة مع أي محرف ليس حرفاً أبجديا العمليفتقـوم ) \( أم

.Escapeبعمل

ab?c تطابقac أوabc.

a* تعني أي تكرار من الحرفa ضمناً السلسلة الفارغة.

a+ تعني أي تكرار من الحرفa ما عدا السلسلة الفارغة.

- 6 -

[a-z]+ ألحرف األبجدية الصغيرة ما عدا السلسلة الفارغةتعني أي تسلسل من ا.

[A-Za-z][A-Za-z0-9] ة أو األحرف و األرقامتعني أي تسلسل من األحرف األبجدي

.بشرط أن يبدأ هذا التسلسل بحرف

(ab|cd) اتعني إمab أوcd.

{digit} ةتعني البحث عن السلسلة النصيdigit فة مسبقاً و تقوم بادخالهـافـي المعر

.المصدري قبل وضع القواعد LEXهذا التعريف يتم وضعه في بداية ملف . التعبير

YACCالـ المحلل القواعدي باستخدام

هو برنامج مهمته تحديد ما إذا كان الدخل صحيحاً قواعدياً و بالتالي Parserإن المحلّل القواعدي

بشكل آلي عن ممكن يدوياً كما أن توليدها المحلّالت يمكن أن تكتب. فهو يحدد شكل و بنية الدخل

التي تنطلق من توصـيفات البنـى المسـموحة Parser Generatorsطريق مولّدات المحلّالت

Context Freeحيث ان هذه التوصيفات مكتوبة على شكل قواعد خالية من السـياق . قواعدياً

Grammar.

Bisonنظرة عامة على عمل

- 7 -

YACC قواعد خالية من السياق و بناءاً عليه فهو ينشئ برنامج بلغة عن نامج دخله عبارةهو بر

C ،مةهذا البرنامج سيقوم بتحليل الدخل اعتماداً على القواعد المقد. مع اإلشارة إلى أنYACC

.Bellو آخرين في مختبرات S.C.Johnsonهو من تطوير

:YACCالــملف المصدر الخاص بـ-

:هو بالصيغة YACCف الدخل الذي يتعامل معه إن شكل مل

C and parser declarations

%%

Grammar rules and actions

%%

C subroutines

التـي Tokensيتألف من ال ئحة من الوحدات اللفظية YACCحيث أن القسم األول من ملف

القواعد الخاص ب Start Symbolإلى جانب توصيف رمز البدء .يتوقّع المحلّل القواعدي رؤيتها

.المستخدمة

%start program

على توصيف ألولويات و اتجاه ارتبـاط YACCمن الممكن أن يحتوي هذا الجزء من ملف

.و هذه الخاصة تعطي مرونة في القواعد الخالية من السياق. العمليات

خاصـة باللغـة غـرض من السياق ال ةالخاليمن القواعد YACCيتألّف القسم الثاني من ملف

إن .باستخدام فواصـل منقوطـة Productionsحيث يتم الفصل بين قواعد االشتقاق . الدراسة

طرفها األيسر و الذي هو عبارة عن رمز غير نهائي ، قواعد االشتقاق كما هو معلوم لها طرفان

Non-Terminal Symbolا الطرف ، يتم كتابته بأحرف صغيرةجموعة األيمن الذي هو مأم

- 8 -

من الرموز النهائية أو من الرموز النهائية و غير النهائية فسيتم كتابة رموزه النهائية بـأحرف

(:).و يتم الفصل بين الطرف األيمن و األيسر بالرمز ، كبيرة

و يجب أن يكون هنالـك ، Cيتألف من شيفرة برمجية بلغة فYACCالقسم الثالث من ملف أما

حيث أن هذا التابع هو الـذي ، ()yyparseيتم من خاللها استدعاء التابع ()mainطريقة اسمها

و الذي يستخدم لالعـالم عـن ()yyerrorهنالك أيضاً تابع ضروري هو . سيقود عملية التحليل

.األخطاء التي تقع خالل التحليل

لـة التحليـل إذا إن شجرة التحليل يتم بناؤها ضـمن مرح ، المحلّل كما ذكر أعاله ليس له خرج

حيـث أن هـذا ، ه سيبني تمثيالً داخليا لبنية و هيكلية البرنامجحلّل فإنّو عند تنفيذ الم، القواعدي

.التمثيل يستند إلى الطرف األيمن لقواعد االشتقاق