CompilerLesson

Size: px
Start display at page:

Download "CompilerLesson"

Transcription

1 2010 مترجما... تبرمج كي فيف فهم برمجة الكومبايلر ( Compiler )خطوة بخطوة ياسين الجزاي ري khatibe_30@hotmail.fr هذا الكتاب مجاني و لا يحق لا ي بيعه أو المتاجرة به

2 الحمد الله رب العالمين والصلاة و السلام على المبعوث الا مين رحمة للعالمين محمد إبن عبد االله و على ا له و صحبه و سلم تسليما آثيرا. على الرغم من أن المكتبة العربية غنية جدا بعديد المصادر في شتى المواضيع لدرجة أن الطالب يضيع بين رفوف الكتب محاولا إيجاد الكتاب المناسب إلا أن الكتب التي تتناول موضوع الترجمة compilation) (La معدومة تقريبا, و في محاولة لتدعيم المكتبة العربية نقدم لكم هذا الكتاب الذي يشرح بطريقة سهلة و مفهومة الخطوات الا ساسية لكيفية برمجة مترجم (Compilateur) خاص بك, لا يهم أن تكون مهمة هذا المترجم ترجمة أآواد لغة متقدمة إلى لغة الا لة بل يمكن إستعمال الكتاب لبرمجة برامج تحول الا آواد من لغة إلى أخرى, و لعل من أبرز الا مثلة البرامج المنتشرة التي تحول من اللغة C إلى PASCAL أو إلى JAVA و غيرها. سنستهل آتابنا بمقدمة سريعة عن الترجمة و أصولها و من ثم عرض للا دوات اللازمة مع روابط تحميلها و آيفية تنصيبها, بعد ذلك نتطرق إلى مثال بسيط الهدف منه شرح الا دوات المستعملة في هذا الكتاب لنكمل بقية الكتاب في شرح آيفية برمجة مترجم خطوة بخطوة و سطرا بسطر. من الضروري جدا أن تحيط علما با ساسيات لغة البرمجة ++C لا نها ما سنعتمد عليه في هذا الكتاب بالا ضافة إلى معرفة و إن آانت سطحية بلغة التجميع أو ما تعرف بالا سمبلي. 2

3 4 الفهرس 1. مقدمة... 4 (1 المحلل المعجمي lexicale)...(l analyse 6 (2 المحلل النحوي syntaxique)...(l analyse 7 (3 المحلل المعنوي sémantique)...(l analyse 7 (4 توليد الكود ) code...(génération de LEX و BISON و متطلبات العمل برمجة المترجم

4 المترجم... هل فكرت يوما في برمجة مترجم ما آمترجم السي أو الباسكال أو غيرهما من اللغات هل تعتقد أن الا مر صعب أجل هو ليس باليسير و أيضا ليس بالمستحيل, و سنحاول في هذا الكتاب با ذن االله أن نوضح خطوات برمجة مترجم صغير. 1. مقدمة لدينا برنامج مكتوب بلفة ما, إذا آانت هذه اللغة مفهومة من طرف الحاسوب فا نه يقوم بتنفيذ البرنامج مباشرة, أما إذا آانت لغة البرنامج غير مفهومة من طرف الحاسوب فيجب تحويل الكود المصدر source) (texte إلى آود مفهوم من طرف الحاسوب, cible),(code هذه العملية تسمى الترجمة, المترجم هو برنامج مكتوب بلغة ما يقوم بترجمة آود من لغة مصدر إلى لغة الا لة. - مراحل ترجمة برنامج لنلقي نظرة سريعة على مراحل الترجمة. :L analyse lexicale (1 المرحلة الا ولى من التحليل, يقوم المترجم هنا باستخراج الكلمات و التي تسمى tokens انطلاقا من سلسلة من الحروف, مثلا, لاحظ هذا السطر من الكود المصدر: for i := 1 to vmax do a := a+i 4

5 : نستخرج هذه السلسة من ال tokens for i := 1 to vmax do a := a + 1 آلمة محجوزة( clé (mot معرف (identificateur) إسناد (affectation) صحيح (entier) آلمة محجوزة clé) (mot معرف (identificateur) آلمة محجوزة clé) (mot معرف (identificateur) إسناد (affectation) معرف (identificateur) عملية رياضية arithmétique) (opérateur معرف (identificateur) فاصل (séparateur) مباشرة و بعد تحليل الكود نقوم ببناء جدول الرموز symboles) (table des عن قاي مة من مجموعة ترآيبات تحمل خصاي ص آل token و يكون آالا تي: وهو عبارة Numéro de symbole Token for to do Type de token mot clé mot clé mot clé séparateur Type de variable بهذه الطريقة يقوم المحلل المعجمي lexicale) (L analyseur بتحليل الكود المصدر و بناء جدول الرموز إن صحت ترجمة المصطلحات و إن آنت قد لاحظت, فا ن المحلل المعجمي لا يهتم بترتيب ال tokens و لذلك فا ن السطر التالي صحيح تماما بالنسبة لل :analyseur lexical for for for i := := 10 do for a a هنا يا تي دور التحليل النحوي أو.l analyse syntaxique 5

6 :L analyse syntaxique (2 في هذه المرحلة نتحقق أن ترتيب ال tokens موافق لتعريف اللغة التي نريد برمجة مترجم لها, نستطيع أن نقول أننا نتحقق من النحو الخاص باللفة و يكون هذا إنطلاقا من مجموعة من القواعد أو ما يسمى,grammaire يقوم المحلل النحوي ببناء شجرة (arbre) باستخدام ال tokens التي يوفرها المحلل المعجمي: for i := 1 to vmax do a := a+i - الشجرة النحوية المستخرجة بعد التحليل النحوي - أما القواعد المحدد للنحو فا نها تكون معرفة على الشكل التالي: prog -> debut inst fin point inst -> ident affectaion expression expression -> ident entier reel 6

7 :L analyse sémantique (3 أثناء التحليل المعنوي sémantique) (L analyse نتا آد مثلا أن القيمة التي سنسندها لا حد المتغيرات تكون من نفس نوع المتغير, إذ لا يجب إسناد قسمة حقيقية لمتغير صحيح و هكذا. :Génération de code (4 نقوم هنا با نتاج آود بلغة الا لة أو لغة التجميع و هذا مثال لكود بلغة قريبة من لغة الا لة: var_a A0000 les étiquettes des variables var_i A0001 var_vmax A0002 le code du programme mov var_i,1 loop : mov A0, (var_i) comparaison i >= vmax jge A0, (var_vmax), finfor si vrai aller en finfor mov A0, (var_a) calcul de a+i add A0, A0, (var_i) mov var_a,a0 a := a+i mov A0, (var_i) on incrémente i add A0, A0, 1 mov var_i, 1 jmp loop et on continue la boucle finfor :... 7

8 LEX و BISON و متطلبات العمل.2 آانت تلك مقدمة سريعة جدا و مختصرة جدا عن مراحل الترجمة, ماذا بعد, قبل نحدد قواعد اللغة التي سنستخدمها و نبدأ برمجت المحلل المعجمي و النحوي و المعنوي سنلقي نظرة على أداتين مهمتين و هما LEX و.BISON Scanner أو ما يسمى ب (Analyseur lexicale) هي أداة تقوم بتوليد محلل معجمي LEX مكتوب باللغة C, يستعمل LEX قوالب (patterns) لمطابقة السلاسل الحرفية الموجودة في الكود المصدر و تحويلها إلى tokens و من ثم إرسالها إلى المحلل النحوي, ال tokens تكون عبارة عن معرفات عددية ثابتة, أي أن ال scanner عندما يجد مثلا المتغير x فا نه يرسل للمحلل النحوي ال token الممثلة للمتغيرات و لتكن IDENT و أيضا يرسل له إسم المتغير و يقوم با دخاله إلى جدول الرموز table des symboles و تعيين خصاي صه آنوعه و غيرها من الخصاي ص. BISON أو YACC يولد لنا شفرة باللغة C لمحلل نحوي syntaxique) (Analyseur و يعرف أيضا بال,parser يستعمل Bison قواعد اللغة لتحليل ال tokens القادمة من ال scanner و يبني عليها شجرة نحوية, تمثل هذه الصورة آيفية التعاون بين ال LEX و :YACC إذا و حسب الشكل السابق الملف bas.y يحمل وصف لل parser وصف لل,scanner الملف y.tab.h يولده ال YACC و يحوي تعريف ال أحد ال tokens في الملف :y.tab.h أما الملف bas.l فيحمل tokens وهذا تصريح عن #define IDENT 102 بعد ذلك يولد لنا آل من LEX و YACC (سنستعمل BISON و هو مشابه لل lex.yy.c (YACC و y.tab.c و هما على الترتيب المحلل المعجمي (scanner) و المحلل النحوي.(parser) 8

9 y.tab.c وباستعمال أحد مترجمات اللغة C نترجم آل من lex.yy.c النهاي ي bas.exe و هو المترجم الجديد... تهانينا. و لنحصل على البرنامج ماذا سنحتاج من أدوات لفعل ذلك : أولا قم بتحميل ++C 3.0 TURBO من هذا أحد هذه الروابط قم بتثبيته في القرص \:D بحيث يكون مسار المجلد bin آالا تي:,D:\TC\BIN طبعا أنت حر في تثبيته في أي مكان و لكن الشرح سيكون على أساس أنه مثيت في المسار السابق لا ننا سنستعمل البرنامج D:\TC\BIN\TC.EXE لترجمة أآواد C. و,BISON حملهما من أحد هذه الروابط: LEX قم بفك الضغط عن الملف Lex_Yacc.zip وانسخ المجلد Lex_Yacc في القرص \:D, لديك المجلد D:\Lex_Yacc\exemples والذي سيكون مسرح الا حداث. ليصبح أنسخ محتويات آل من المجلد D:\Lex_Yacc\Bison\bin و المجلد D:\Lex_Yacc\Lex\bin إلى المسار C:\WINDOWS طبعا هذا إذا آانت الويندوز مثبتة في القرص \:C, المهم أن تنسخه إلى المجلد WINDOWS الخاص بالنظام, أخيرا أنسخ المجلد D:\Lex_Yacc\Bison\share با آمله إلى القرص \:C ليصبح لديك المسار C:\share في جهازك, هنا نكون قد ثبتنا الا دوات اللازمة للعمل, لنبدأ على برآة االله. TURBO =5+5 و قبل البدء في برمجة المترجم سنقوم ببرمجة برنامج صغير باستخدام LEX و BISON و ++c بحيث يقوم بقراءة ملف يحتوي على عمليات حسابية من عدة سطور, مثلا =3+3*100^ *10 و يقوم بحسابها. سنعمل على مستوى المجلد,D:\Lex_Yacc\exemples.scanner أو L analyseur lexicale لنبدأ بكتابة المحلل المعجمي أو 9

10 ,scanner C سنقدم لل LEX الشكل التالي: وصفا معينا ليولد لنا هو آود لل آيف يكون ذلك الوصف يكون من...تعريفات إذا احتجناها -... %%... قواعد... %%... دوال فرعية إذا احتجناها -....C الدوال الفرعية عبارة عن آود بلغة C, التعريفات و أما القواعد فلها نحو خاص + بعض أآواد إفتح المفكرة واآتب الكود التالي: % #include<stdlib.h> #include"d:\lex_yacc\exemples\expy2.h" % blanc [ \t]+ chiffre [0-9] entier chiffre+ قمنا بكتابة التعريفات, لقد احتجنا إلى إضافة آود بلغة Cو لذلك آتبناه بين العلامتين % و %, سنحتاج إلى دالة من المكتبة,stdlib.h أما استعمالنا للملف expy.2h فهو لا نه الملف الذي سيحوي تعريفات ال tokens فيما بعد, لا تقلق فذلك الملف يولده BISON فيما بعد لذلك لا تعره اهتماما الا ن, ذلك الجزء الا ول من التعريفات, الجزء الثاني - 3 سطور الا خيرة- قمنا فيه بالتصريح عن بعض القوالب التي سنستعملها لتصفية ال tokens من الكود المصدر, ماذا تعني لدينا ثلاث قوالب, blanc و chiffre و :entier blanc chiffre entier [ \t]+ [0-9] chiffre+ آل الفراغات, فراغ أو أآثر آل الا عداد من 0 إلى 9 سلسلة من عدد واحد أو أآثر هذا جدول للحروف التي نستعملها لا نشاء القوالب و معانيها:. \n * آل الا حرف باستثناء n\ سطر جديد صفر نسخة أو أآثر من العبارة السابقة لها 10

11 +? ^ $ a b (ab)+ "a+b" [] z نسخة واحدة أو أآثر من العبارة السابقة لها نسخة واحدة أو لا شيء من العبارة السابقة لها بداية السطر نهاية السطر b أو a نسخة أو أآثر من السلسلة ab السلسلة a+b حرفيا في ة من الا حرف, [a-z] تعني آل الا حرف من a إلى وآمثال عن بعض الا قنعة لاحظ هذا الجدول: التطابقات abc ab,abc,abcc,abccc, abc,abcc,abccc, abc,abcbc,abcbcbc, a,abc a,b,c أي حرف بين aو z a,-,z -,a,z حرف أو أآثر(بما في ذلك الا عداد) الفراغات أي شيء باستثناء a و b a,^,b a,,b b أو a العبارة abc abc* abc+ a(bc)+ a(bc)? [abc] [a-z] [a\-z] [-az] [A-Za-z0-9]+ [ \t\n]+ [^ab] [a^b] [a b] a b بهذا يصبح الكود الذي آتبته في المفكرة سابقا أآثر وضوحا و سيتضح آلما تقدمت في قراءة هذا الكتاب, أضف هذا الكود إلى الكود السابق ليصبح: % #include<stdlib.h< #include"d:\lex_yacc\exemples\expy2.h" % blanc [ \t]+ chiffre [0-9] entier chiffre+ %% 11

12 blanc entier yylval=atoi(yytext) return(nombre) "+" return(plus) "*" return(mult) "-" return(moin) "/" return(divs) "^" return(puis) "(" return(parg) ")" return(pard) "=" return(fin) \n %% أضفنا الجزء الخاص بالقواعد و هو بين العلامتين %% و %%, هناك 11 ال LEX بكل بساطة نلخص القواعد في : إذا وجدت... إفعل... قاعدة, ماذا سيفعل مثلا القاعدة الا ولى, إذا وجدت blanc إفعل (لا شيء), أي أن ال scanner الفراغات الموجودة في الملف الذي سنقوم بترجمته و حساب ما فيه. سيفوت yylval = atoi(yytext) return(nombre) القاعدة الثانية, entier إذا وجدت إفعل: السطر الثاني return(nombre) نعيد فيه ال token التي حصلنا عليها وهي رقم صحيح حسب القالب المستخدم( entier ) إلى المحلل النحوي أو,parser مثلا إذا وجدنا في الملف الذي سنحسب ما بداخله العملية =5+5 فا ن أول token نعيدها هي NOMBRE ولكن, سنحتاج إلى قيمة ال NOMBRE الذي عثر عليه ال scanner ولنمررها إلى ال parser نقوم باسنادها إلى المتغير yylval وهو عبارة عن همزة وصل بين ال scanner و ال,parser ولفعل ذلك نحول القيمة الحرفية الموجودة في المتغير yytext الذي يحمل سلسلة الحروف المشكلة لا خر تطابق إلى عدد صحيح باستعمال الدالة atoi الموجودة داخل المكتبة.stdlib.h القاعدة الثالثة, إذا وجدت + إفعل (أعد ال token التالية:,(PLUS قاعدة سهلة وواضحة, إذ سنكتفي بالقول لل parser أننا وجدنا PLUS ولن نحتاج طبعا إلى قيمتها أو شيء من هذا, فقط نعيد ال token و نذهب إلى القاعدة التالية. القاعدة الا خيرة, n\ إذا وجدت (سطر جديد) إفعل (لا شيء). 12

13 أنهيانا الا ن وصف ال,scanner ماذا بعد خزن الكود في المسار D:\Lex_Yacc\exemples باسم,expl2.l وباستعمال الا مر FLEX expl2.l يولد LEX آود C لل,scanner حتى لا نبقى في آل مرة نفتح نافذة الدوس و نكتب الا مر قم بفتح المفكرة و اآتب الا وامر التالية: FLEX expl2.l Pause ثم أحفظ الملف باسم FLEX_2.bat في المجلد,D:\Lex_Yacc\exemples الملف الدفعي flex_2.bat لتحصل على النتيجة التالية: دوبل آليك على لا يوجد أخطاء, في حالة وجود أخطاء سيعرض لك LEX رسالة بالا خطاء و مكان آل خطا و وصفه, لقد قام LEX للتو بتوليد الملف lex.yy.c في المسار D:\Lex_Yacc\exemples والذي يمثل آود C لل scanner أو.L analyseur lexicale ذلك النصف الا ول من البرنامج النهاي ي, لنكمل. :(grammaire) قبل أن نبدأ آتابة وصف YACC سنحدد القواعد Input -> Input Line Line -> FIN Exp FIN Exp -> NOMBRE Exp PLUS Exp Exp MOIN Exp Exp MULT Exp Exp DIVS Exp MOIN Exp Exp PUIS Exp PARG Exp PARD ما هذا 13

14 الرمز يعني فراغ أو لاشيء, الكلمات المكتوبة بحروف آبيرة تمثل ال tokens التي سيعيدها الscanner, أما باقي الكلمات فهي رموز غير نهاي ية non-terminaux).(symboles أحسن طريقة لفهم القواعد السابقة هي تتبع مثال, مثلا هل السلسلة =9*5+5 تحقق شروط ال grammaire السابق Input -> Input Line -> Input -> Exp FIN -> Exp PLUS Exp FIN -> Exp PLUS Exp MULT Exp FIN -> NOMBRE PLUS NOMBRE MULT NOMBRE FIN -> * 9 = إذا وصلنا إلى العبارة =9*5+5 إنطلاقا من,Input هذا سيعطيك فكرة مبدي ية عن ماهية القواعد التي سنستخدمها لاحقا. نعود, إفتح المفكرة و اآتب الكود التالي: % #include<conio.h> #include<stdio.h> #include<stdlib.h> #include<math.h> #include "d:\lex_yacc\exemples\expl2.c" % %token NOMBRE PLUS MOIN MULT DIVS PUIS PARG PARD FIN %left PLUS MOIN %left MULT DIVS %left NEG %right PUIS %start Input بدأنا آتابة الوصف الذي سيولد منه YACC ال,parser أول ما بدأنا به هو آتابة تعاريف نحتاجها أثناء آتابة القواعد, هناك قسمين من التعاريف, قسم مكتوب باللغة C وهو بين العلامتين % و %, واضح الكود المكتوب باللغة C, إذا آنت تتساءل عن الملف expl2.c فهو نفسه الملف lex.yy.c الذي يحمل آود ال scanner السابق, فقط سنغير اسمه فيما بعد. القسم الثاني من الكود هو وصف خاص, باستعمال الكلمة المحجوزة %token قمنا بالتصريح عن ال tokens التي سيستعملها آل من الscanner و ال,parser و لدينا :tokens 9. NOMBRE, PLUS, MOIN, MULT, DIVS, PUIS, PARG, PARD, FIN هناك أولوية أثناء إجراء عمليات الحساب, فالقسمة أقوى من الضرب الذي هو أقوى من الجمع و الطرح, وأقصد بكلمة أقوى أولوية الحساب, مثلا عند حساب 6*5+5 فا ننا نحسب 6*5 ثم نضيف إلى النتيجة العدد 5, ولهذا أضفنا السطور : 14

15 %left PLUS MOIN %left MULT DIVS %left NEG %right PUIS أقل أولوية للجمع و الطرح معا, العمليات تجرى على اليسار القسمة و الضرب أقوى, نبدأ باليسار أثناء الحساب النفي أقوى من ما يسبقه الرفع إلى قوة أقوى من ما سبقه, ولكن نبدأ باليمين السطر الا خير %start Input نحدد فيه القاعدة التي نبدأ منها أثناء التحقق من ترتيب ال.scanner القادمة من ال tokens المرحلة الثانية هي آتابة القواعد اللازمة, نغير الكود السابق ليصبح: % #include<conio.h> #include<stdio.h> #include<stdlib.h> #include<math.h> #include "d:\lex_yacc\exemples\expl2.c" % %token NOMBRE PLUS MOIN MULT DIVS PUIS PARG PARD FIN %left PLUS MOIN %left MULT DIVS %left NEG %right PUIS %start Input %% Input: Input Line Line :FIN Exp FIN printf("=%d\n",$1) Exp :NOMBRE $$=$1 Exp PLUS Exp $$=$1+$3 Exp MOIN Exp $$=$1-$3 Exp MULT Exp $$=$1*$3 Exp DIVS Exp $$=$1/$3 MOIN Exp %prec NEG $$=-$2 Exp PUIS Exp $$=pow($1,$3) PARG Exp PARD $$=$2 %% 15

16 آل ما فعلناه هو آتابة القواعد و إخبار ال parser ماذا يفعل عند تحقق آل قاعدة, القاعدة الا ولى هي Line,Input : Input وهي نقطة البداية, Input ستعطي شيي ين, إما فراغ أو,Input Line سهلة وواضحة. القاعدة الثانية,,Line إما تعطينا FIN (وهي الحرف "=" آما هو معرف على مستوى وصف (LEX أو,Exp FIN وهنا نكتب نتيجة العملية الحسابية باستعمال,printf("=%d\n",$1) ماذا يعني الرمز $1 أثناء التحقق يمكننا أن نعطي و نا خذ قيم الرموز و ال tokens التي نجدها في طريقنا, وهنا سنكتب على الشاشة قيمة Exp وهي معرفة ب $1, أما قيمة FIN إذا أردنا إستعمالها فهي $2 وهكذا. في آل قاعدة هناك نصف أيمن و نصف أيسر, و لا سناد قيم أو قراءة قيم الرموز المكونة للقاعدة فا ننا نستعمل x$: Exp -> Exp PLUS Exp $$ $1 $2 $3 طبعا استعمال قيم الرموز باستخدام x$ أو $$ هو تابع للتحليل المعنوي( L analyse (sémantique فالمحلل النحوي أو L analyseur syntaxique لا يهتم بالقيم. ننتقل إلى القاعدة الثالثة الخاصة ب Exp,Exp تعطينا أحد ثمانية خيارات: في حالة Exp <- NOMBRE فالا مر بسيط, نعطي قيمة الرقم إلى Exp $1=$$, و تسمى هذه الحرآة الا خيرةب Action sémantique آما أذآر. باستعمال في حالة Exp <- Exp PLUS Exp فالا مر بسيك أيضا, Exp التي عى يسار القاعدة تا خذ قيمة مجموع Exp التي على يمين القاعدة و نفعل هذا باستعمال $2+$1=$$, وهكذا نفس الشيء بالنسبة لباقي القواعد المماثلة في حالة Exp <- MOINS Exp هناك شيء جديد, طبعا نقصد من هذه القاعدة حالة النفي مثلا 112-, ولكن تلك الناقص ليست هي نفسها عملية الطرح فهي لها أولوية قصوى, مثلا إذا وجدنا 5/6- فا ننا نحسب 5- أولا, ولهذا نعطيها أولوية NEG باستعمال التعليمة NEG%,prec أما الباقي واضح وهو إعطاء القيمة Exp إلى Exp التي على اليسار باستعمال $2 = $$. Exp <- Exp PUIS Exp فنقصد بها الرفع إلى القوة( 3^2=9 ) و بالنسبة للحالة آما يلي math.h الموجودة في المكتبة pow سنحسبها باستعمال الدالة.$$=pow($1, $3) 16

17 إلى هنا ننهي قسم القواعد الخاصة بال,parser بقي لنا أن نصرح عن الدالة الري يسية main() وهذا في قسم الدوال الفرعية: % #include<conio.h> #include<stdio.h> #include<stdlib.h> #include<math.h> #include "d:\lex_yacc\exemples\expl2.c" % %token NOMBRE PLUS MOIN MULT DIVS PUIS PARG PARD FIN %left PLUS MOIN %left MULT DIVS %left NEG %right PUIS %start Input %% Input: Input Line Line :FIN Exp FIN printf("=%d\n",$1) Exp :NOMBRE $$=$1 Exp PLUS Exp $$=$1+$3 Exp MOIN Exp $$=$1-$3 Exp MULT Exp $$=$1*$3 Exp DIVS Exp $$=$1/$3 MOIN Exp %prec NEG $$=-$2 Exp PUIS Exp $$=pow($1,$3) PARG Exp PARD $$=$2 %% int yyerror (char *s) printf("%s\n",s) int yywrap() return 1 main() clrscr() if((yyin=fopen("d:\\lex_yacc\\exemples\\input.txt","r"))==null) 17

18 printf("input.txt not found!\n") getch() return yyparse() getchar() قمنا بتعريف أجسام الدالتين yyerror() التي تستدعى من طرف ال parser عند وقوع خطا أو عدم تطابق ترتيب ال tokens المرسلة من طرف ال scanner مع القواعد المحددة, الدالة الثانية هي yywrap() وتستدعى عند نفاذ المدخلات وفي حالتنا هذه عند نفاذ العمليات المراد حسابها. الدالة,main() ماذا بها أولا نقوم بفتح الملف input.txt -الذي سيحتوي على العمليات المراد حسابها- باستعمال fopen() التي تعيد إلينا مو شر للملف, نسند ذلك المو شر إلى المتغير yyin و هو متغير معرف مسبقا من طرف YACC و يمثل ملف المدخلات, و في حالت وجود خطا أثناء فتح الملف input.txt نعرض رسالة خطا و نتوقف. بعد ذلك نستدعي الدالة yyparse() والتي تمثل هنا الparser وتقوم بكل العمل الذي وصفناه سابقا. الا ن أحفظ ما آتبناه من وصف في المفكرة إلى الملف,D:\Lex_Yacc\exemples\expy2.y وبنفس الطريقة التي استعملنا بها LEX سنستعمل,BISON عوضا عن آتابة أوامر في نافذة الدوس أنشي ملف دفعي جديد باسم BISON_2.bat داخل المجلد D:\Lex_Yacc\exemples\ واآتب به ما يلي: BISON -d expy2.y Pause دوبل آليك على الملف الدفعي الجديد و ستحصل على هذه النتيجة: أيضا سيولد BISON ملفين و هما expy2.tab.c و,expy2.tab.h الملف expy2.tab.c هو الملف الذي به الدالة main() وبالتالي هو الملف الذي سنترجمه باستخدام.++C,TURBO أما الملف expy2.tab.h فهو يحتوي على تعريفات ال tokens من أجل استعماله داخل 18

19 الscanner و إذا آنت تذآر ففي ملف وصف السكانر expl2.l هناك هذا السطر لاستعمال ملف تعريفات ال :tokens % #include<stdlib.h> #include"d:\lex_yacc\exemples\expy2.h" % ولكن اسمه expy2.tab.h و ليس!! expy2.h ليست مشكلة, سنغير اسمه إلى expy2.h وانتهى الا مر. نفس الشيء بالنسبة لملف وصف البارسر expy2.y لدينا: % #include<conio.h> #include<stdio.h> #include<stdlib.h> #include<math.h> #include "d:\lex_yacc\exemples\expl2.c" % أيضا ملف السكانر الناتج عن LEX اسمه lex.yy.c وليس!!! expl2.c نفس الشيء, سنغير الا سماء فقط و لفعل هذا أضف ملف دفعي جديد باسم rename.bat وليكن محتواه : ren lex.yy.c expl2.c ren expy2.tab.c expy2.c ren expy2.tab.h expy2.h دوبل آليك على الملف الدفعي rename.bat لتتغير أسماء الملفات lex.yy.c و expy2.tab.c و expy2.tab.h إلى expl2.c و expy2.c و expy2.h على الترتيب. إذا و في آل مرة نغير من وصف الملف expl2.l أو expy2.y فا ننا نحذف ملفات الكود القديمة expl2.c) و expy2.c و (expy2.h و نعيد تنفيذ آل من FLEX_2.bat و BISON_2.bat و.rename.bat بعد حصولنا على آود سورس السكانر و البارسر نترجمهما باستعمال TURBO C 4.5 وتحديد باستعمال البرنامج D:\TC\BIN\TC.EXE وآي نتجنب فتح TC في آل فا ننا نفعل ذلك من سطر الا وامر, أنشي ملف دفعي جديد با سم compile.bat واآتب فيه هذا الا مر الذي يترجم الكود: D:\TC\BIN\TC.EXE D:\Lex_Yacc\exemples\expy2.c /b pause compile.bat و ستتم ترجمة الكود و ستحصل على ملف تنفيذي باسم وهو البرنامج النهاي ي و لكي نرى نتيجة عملنا أضف ملف جديد طبعا نحن لا زلنا نفذ الملف EXPY2.EXE 19

20 input.txt و سنبقى نعمل على مستوى المجلد -D:\Lex_Yacc\exemples المدخلات و لنضف اليه بعض العمليات التي نريد حسابها, مثلا: باسم ليحمل 5+5= 10*55= 3+2^2= -5+(11*8)-16= نفذ الا ن برنامجنا الجديد EXPY2.EXE و ستحصل على هذه النتيجة: لقد قام بحساب آل العمليات الموجودة في الملف,input.txt لا تعتقد أن هذا شيء لا أهمية له فهذه أول خطوة لبرمجة المترجم الخاص بنا, يجب أن تكون الرؤيا قد اتضحت الا ن عن آيف سنعمل منذ الا ن فصاعدا, لنكتب عملية خاطي ة -أو بالا حرى لا تتوافق مع القواعد المحددة- لنرى النتيجة, غير الملف input.txt ليصبح: 5+5= 10*55= 3+2^2= -5++(11*8)-16= أآيد لقد لاحظت أين الخطا, بعد تنفيذ EXPY2.EXE سنحصل على هذه النتيجة: 20

21 و تظهر نتيجة الخطا في السطر الرابع, لاحقا سنرى آيف نعرض رسالة بالخطا المحدد و رقم السطر الذي وقع فيه الخطا إن شاء االله. لتحميل المجلد الذي يحتوي على هذا المثال استخدم أحد هذه الروابط: exemples

22 3. برمجة المترجم من هنا نبدأ برمجة المترجم, أول ما يجب تحديده هو اللغة التي سنستخدمها, سنستخدم نفس النحو المستعمل لكتابة ال,Algorithmes وآمثال عن لغتنا: algorithme alg entier resultat,a debut ecrire "Entrer a = " lire a resultat<-5 a<-resultat*10 ecrire!,"a = ",a lire a fin. الرمز (!) نتفق أنه يعني سطر جديد, أي أآتب الجملة الموالية في سطر جديد, مبدي يا لغتنا الجديدة لا تحتوي على حلقات, فقط إسناد و آتابة و قراءة. سنسمي هذا المترجم compalg اختصارا ل,Compilateur d algorithmes هذه اللغة تحتاج إلى grammaire أو مجموعة القواعد التي تحددها و لنبدأ بهذا ال grammaire و سنغيره آلما أردنا إضافة قاعدة جديدة: prog -> ALGO IDENT declaration debut declaration -> decl_type ident POINT_VER declaration decl_type -> DEC_ENTIER DEC_REEL DEC_CARA DEC_CHAINE ident -> IDENT IDENT VER ident debut -> DEBUT command_seq command_seq -> command_seq FIN POINT affect POINT_VER command_seq READ read POINT_VER command_seq WRITE write POINT_VER command_seq Affect -> IDENT AFFECT fexpr IDENT AFFECT sexpr read -> IDENT IDENT VER read write -> writed_expr writed_expr VER write writed_expr -> NEW_LINE fexpr sexpr fexpr -> REEL ENTIER IDENT fexpr PLUS fexpr fexpr MOIN fexpr fexpr MULT fexpr 22

23 fexpr DIVS fexpr MOIN fexpr fexpr PUIS fexpr PARG fexpr PARD sexpr -> CHAINE CARA تذآر أن الرمز ( ) يعني اللاشيء, الرموز بالحروف الكبيرة هي ال tokens التي يرسلها البارسر أو L analyseur lexicale لذلك هي رموز نهاي ية( terminaux.(symboles عد إلى المجلد D:\Lex_Yacc\exemples واحذف منه الملفات التي استخدمناها في المثال السابق و لنبدأ على برآة االله, افتح المفكرة و نبدأ آتابة الكود الذي يمثل وصف السكانر: % #include<stdlib.h> #include<string.h> #include<math.h> #include"d:\lex_yacc\exemples\compalg.h" int line=1 % سنحتاج آل من تلك المكاتب, الملف compalg.h هو الذي سيولده BISON فيما بعد و الذي يحوي التصريح عن ال tokens اللازمة, المتغير line يمثل السطر الحالي الذي نحن بصدد تحليله و استخراج ال tokens منه و سنزيد من قيمتخ عند نهاية آل سطر و هذا لنعرف موقعنا إذا صادفنا خطا ما, واضح. لنعرف الا ن القوالب اللازمة لاستخراج ال tokens من الكودسورس: blanc [ \t]+ nbr [0-9]+ entier nbr reel entier\.nbr ident [a-za-z_]([0-9a-za-z_])* a [aa] b [bb] c [cc] d [dd] e [ee] f [ff] g [gg] h [hh] i [ii] j [jj] k [kk] 23

24 l [ll] m [mm] n [nn] o [oo] p [pp] q [qq] r [rr] s [ss] t [tt] u [uu] v [vv] w [ww] x [xx] y [yy] z [zz] أعتقد أن القوالب السابقة تشرح نفسها, مثلا nbr يمثل آل الا عداد من 1 إلى 9 مرة واحدة على الا قل أو أآثر, أي أنه مثلا تنتمي إلى ذلك القالب. القالب entier هو نفسه,nbr أما القالب reel فيختلف قليلا, إذ أنه عبارة عن nbr.nbr مثلا و غيرها من الا عداد الحقيقية التي تندرج تحت هذا القالب. القالب ident الذي يمثل المتغيرات مثل x أو 10_y- فتكون بدايته عبارة عن أحد الحروف التي تنتمي إلى المجال[ a-z ] أو [A-Z] أو الحرف (-) و هذا حسب [a-za-z_], ثم تليه مجموعة أخرى من الحروف التي تكون ضمن [a-z] أو [A-Z] أو [0-9] أو (_), النصف الثاني من المتغير يمكن أن يكون أو لا يكون و حددنا هذا ب.([0-9a-zA-Z_])* أما بقية القوالب من a إلى z فقد استعملناها فقط حتى تكون الحروف الكبيرة في لغتنا مثلها مثل الحروف الصغيرة, تماما آلغة باسكال التي لا تفرق بين الحروف الكبيرة و الصغيرة, مثلا القالب a يمكن أن يكون a أو A. لننتقل إلى الجزء الثاني و هو تعريف القواعد التي من الشكل إذا وجدت... إفعل... %% "\""."\"" return(cara) "\""(.)+"\"" return(chaine) algorithme return(algo) debut return(debut) fin return(fin) entier return(dec_entier) reel return(dec_reel) caractere return(dec_cara) chaine return(dec_chaine) lire return(read) ecrire return(write) 24

25 "!" return(new_line) \. return(point) return(point_ver), return(ver) \n line++ "<-" return(affect) "(" return(parg) ")" return(pard) "+" return(plus) "-" return(moin) "*" return(mult) "/" return(divs) "^" return(puis) ident return(ident) reel return(reel) entier return(entier) blanc %% لن أشرحها لبساطتها, الا ن أنهينا وصف السكانر, خزن الملف الجديد باسم lcompalg.l طبعا و داي ما داخل المجلد,D:\Lex_Yacc\exemples و أيضا أضف ملفا دفعيا جديدا باسم FLEX_2.bat و اآتب به الا مر : FLEX lcompalg.l lex.yy.c دوبل آليك على FLEX_2.bat تحصل على الملف آنتيجة. لننتقل إلى بناء النصف الثاني من البرنامج وهو البارسر أو,L analyseur syntaxique المفكرة و أآتب : افتح % #include<conio.h> #include<math.h> #include "d:\lex_yacc\exemples\lcompalg.c" int errors=0 % آالمعتاد, سنحتاج إلى دوال من تلك المكاتب أما بالنسبة للملف lcompalg.c فهو نفسه الملف lex.yy.c سنغير تسميته لاحقا-, سنستعمل المتغير errors لحساب عدد الا خطاء الموجودة في الملف الذي يحوي ال,Algorithm بعد ذلك نضيف مزيدا من التعريفات: %token IDENT 25

26 %token ENTIER %token REEL %token CHAINE %token CARA %token ALGO DEBUT FIN POINT POINT_VER VER %token DEC_ENTIER DEC_REEL DEC_CARA DEC_CHAINE %token AFFECT READ WRITE REEL PARG PARD %token PLUS MOIN MULT DIVS PUIS NEW_LINE %left PLUS MOIN %left MULT DIVS %right PUIS %left NEG %start prog في التسع سطور الا ولى قمنا بالتصريح عن ال tokens اللازمة, في الا ربع سطور التالية عرفنا أولوية آل عملية حسابية, السطر الا خير فيه القاعدة التي تمثل نقطة الانطلاق, يا للوضوح... الخطوة التالية هي التصريح عن القواعد المتبعة في هذه اللغة: %% prog:algo IDENT declaration debut declaration: decl_type ident POINT_VER declaration decl_type:dec_entier DEC_REEL DEC_CARA DEC_CHAINE ident:ident IDENT VER ident debut:debut command_seq command_seq: command_seq FIN POINT affect POINT_VER command_seq READ read POINT_VER command_seq WRITE write POINT_VER command_seq affect: IDENT AFFECT fexpr 26

27 IDENT AFFECT sexpr read:ident IDENT VER read write:writed_expr writed_expr VER write writed_expr:new_line fexpr sexpr fexpr:reel ENTIER IDENT fexpr PLUS fexpr fexpr MOIN fexpr fexpr MULT fexpr fexpr DIVS fexpr MOIN fexpr %prec NEG fexpr PUIS fexpr PARG fexpr PARD sexpr:chaine CARA %% نحن نحقق تقدما سريعا هنا, الكود السابق هو نفسه ال grammaire الذي اتفقنا على استعماله سابقا إلا أن شكله تغير قليلا, لا تلمني لكن ألق اللوم على BISON لا نه هو من يريد هذا الشكل لل. grammaire لم نستعمل Les actions sémantiques وهذا لا ننا حاليا نحن بصدد إنجاز السكانر و البارسر فقط أو L analyseur lexicale و L analyseur syntaxique فقط, لكل أوانه. القطعة الباقية من الكود اللازم هي التصريح عن الدالة الري يسية و غيرها في الشطر الثالث من ملف وصف البارسر, أضف هذا الكود إلى المفكرة: int yyerror (char *s) errors++ 27

28 printf("erreur :syntaxe erreur: ligne %d\n",line) int yywrap()return 1 main(int argc,char *argv[]) clrscr() if((yyin=fopen("d:\\lex_yacc\\exemples\\test.alg","r"))==null) printf("test.alg not found!\n") getch() return yyparse() if(!errors) printf("ok") getch() return ما الجديد عن المثال السابق عند وقوع خطا ما يقوم البارسر باستدعاء الدالة yyerror() وهنا نعرض نحن رسالة الخطا, السطر الذي وقع فيه الخطا هو ذو الرقم line وهذا المتغير معرف في الملف lcompalg.c و قد صرحنا عليه في,lcompalg.l و عند وقوع آل خطا نزيد من قيمة المتغير.errors الدالة yywrap() تبقى آما هي, أما الدالة main() فنقوم فيها بفتح الملف test.alg الذي يحوي ال Algorithme الذي نريد ترجمته, وبعد تحليل الملف سنعرض الرسالة Ok إذا آانت قيمة المتغير errors مساوية للصفر. الا ن خزن الكود السابق في ملف باسم compalg.y BISON_2.bat و أآتب فيه هذا الا مر: و أضف ملفا دفعيا جديدا باسم BISON -d compalg.y نفذ الملف BISON_2.bat لتحصل على ملفين اثنين, compalg.tab.c و,compalg.tab.h قبل أن نترجم الكود المولد من طرف LEX و BISON سنغير أسماء الملفات lex.yy.c و compalg.tab.c و compalg.tab.h إلى lcompalg.c و compalg.c و compalg.h على الترتيب لا تسا ل لماذا, فقط تروق لي الا سماء الجديدة وهذا باستعمال هذه الا وامر: ren lex.yy.c lcompalg.c ren compalg.tab.c compalg.c ren compalg.tab.h compalg.h 28

29 الا وامر السابقة هي أوامر DOS وعندما نريد تنفيذها لن نفتح موجه أوامر دوس و ننفذها فقط نضيف ملف دفعي باسم rename.bat و نكتب فيه الا وامر السابقة, دوبل آليك عليه و انتهى الا مر. نفس الشيء بالنسبة لعملية ترجمة الكود النهاي ي, أضف ملف دفعي باسم compile.bat و اآتب فيه هذا الا مر: D:\TC\BIN\TC.EXE D:\Lex_Yacc\exemples\compalg.c /b pause لقد قمنا بترجمة آود C باستعمال سطر الا وامر فا نا أآره فتح ++C TURBO و ترجمة الكود بتلك الطريقة, دوبل آليك على compile.bat وانتهى الا مر. إذن, بعد تنفيذ الملف compile.bat سنحصل على البرنامج النهاي ي وهو,COMPALG.EXE و أثناء آتابة وصف البارسر قمنا باستعمال الملف test.alg آمدخلات للمترجم عن طريق هذا السطر: // if((yyin=fopen("d:\\lex_yacc\\exemples\\test.alg","r"))==null) // ذلك و قبل تنفيذ المترجم, أنشي ملف باسم test.alg و اآتب فيه نص ال Algorithme الذي نحن بصدد ترجمته, وهذا هو الكود: algorithme alg entier resultat,a debut ecrire "Entrer a = " lire a resultat<-5 a<-resultat*10 ecrire!,"a = ",a lire a fin. بعد ذلك نفذ برنامج المترجم COMPALG.EXE حتى يتفحص المترجم, هذه هي نتيجة التنفيذ: 29

30 لقد قام المترجم بتفحص الكود و وجد أنه مطابق للقواعد المحدد أثناء وصف البارسر و لذلك عرض رسالة,(Ok) لنجرب آتابة Algorithme خاطي, مثلا غير السطر الخامس ليصبح : algorithme alg entier resultat,a debut ecrire "Entrer a = " lire a, resultat<-5 a<-resultat*10 ecrire!,"a = ",a lire a fin. هناك فاصلة إضافية, النتيجة: و بما أن هذا لا ينطبق مع قواعد اللغة التي حددناها سابقا ستكون...!!! لقد اآتشف الخطا!!! والسطر الذي وقع فيه الخطا عجيب (وآا ننا نعتمد على الحظ هنا). من المو آد أنه قد تكونت لديك فكرة واضحة جدا عن مبدأ عمل L analyseur lexicale.(scanner & Parser) L analyseur syntaxique و 30

31 ننتقل الا ن إلى المرحلة التالية, ألا وهي برمجة L analyseur sémantique أو عملية التحليل المعنوي, نغير ال Algorithme المراد ترجمته - محتوى الملف -test.alg إلى : algorithme alg entier resultat,a reel r caractere c chaine s, r debut ecrire "Entrer a = " lire a lire r c<-"a" s<-"chaine s" c<-s c<-"hhhh" resultat<-5 a<-resultat*10 ecrire!,"a = ",a a<-r a<-0.5 x<-150 lire a fin. أضفنا بعض التصريحات و التعليمات, طبعا لا معنى لها فنحن فقط نجر و لسنا نكتب في برنامج ذو هدف, أضفنا المتغير الحقيقي r والمتغير c من نوع حرف, أما المتغير s فهو سلسلة حرفية, ما رأيك هل يوجد أخطاء في باقي الكود أجل هناك أخطاء معنوية sémantiques),(des erreurs مثلا في السطر 5 المتغير r معرف مسبقا عل أنه reel و في السطر 12 و 13 لا يمكننا إسناد سلسلة حرفية إلى متغير من نوع,caractere أيضا في السطر 16 و 17 لا يمكننا وضع قسمة حقيقية في متغير صحيح, وفي السطر 18 إذ قمنا با سناد قيمة للمتغير x مع أننا لم نصرح عنه من قبل, لكن, إلى حد الا ن المترجم لا يستطيع الكشف عن هذه الا خطاء, خزن الملف test.alg و شغل البرنامج.L analyseur sémantique و سيقول لك: لا يوجد أخطاء, هنا يا تي دور COMPALG.EXE هنا يجب علينا بناء la table des symboles أو جدول الرموز, سنخزن فيها آل المتغيرات و أنواعها, قيمها لن تهمنا, أضف ملف جديد باسم SYMB_TAB.H داخل المجلد D:\Lex_Yacc\exemples و افتحه و لنبدأ بكتابة الكود اللازم. 31

32 هل تذآر المتغير yylval من المثال الا ول لكيفية استعمال LEX و YACC لقد قلنا عنه أنه حلقة وصل بين LEX و YACC إذ أن LEX إذا وجد مثلا رقما صحيحا فا ننا نستطيع تمرير قيمة ذلك المتغير لل YACC مع ال,token نحن هنا سنحتاج إلى تمرير السلسلة الحرفية التي تمثل المتغير حتى نتمكن من تخزينها في قاي مة المتغيرات و التعامل معها, حاليا LEX و حسب الوصف الذي آتبناه و تحديدا في هذا السطر : ident return(ident) token yylval لا يمرر لل YACC إلا ال طريق المتغير المحجوز نوعه. التي تمثل المتغير و هي,IDENT سنمرر المتغير نفسه عن و لكن نوعه int وليس char[]! لا يهم, بامكاننا التحكم في لن نغير نوع yylval من int إلى char أو غيره فنحن سنمرر لل YACC عدة أنواع, الحل هو في استخدام,union أآيد أنت تعرفها, و إذا لم تكن تعرفها فهي شبيهة بال struct ولكن الفرق يكمن في أن مكونات ال union تشغل نفس المساحة من الذاآرة, مثلا لاحظ هذه ال :union typedef union char Tstr[128] int Tint float Tfloat new_type new_type t إذا قمنا باسناد قيمة ل t.tstr ثم بعد ذلك أسندنا قيمة ل t.tint فا ن قيمة t.tstr ستضيع لا ن المتغيرات الثلاث يتشارآون في الذاآرة المحجوزة لهم وهي الذاآرة اللازمة لتخزين أآبر متغير و هنا هي مساوية ل 128 بايت. آيف نجعل yylval ينتمي إلى ذلك النوع افتح الملف compalg.y و أضف إليه هذا المقطع في المكان المبين: % #include<conio.h> #include<math.h> #include "d:\lex_yacc\exemples\lcompalg.c" % %union char Tstr[128] int Tint float Tfloat %token IDENT // طبعا الجزء المضلل هو الجديد في الكود, أغلق الملف و أحفظه طبعا. 32

33 وبهذا نكون قد غيرنا نوع yylval إلى النوع الذي نحتاجه, بقي لنا أن نمرر اسم المتغير إلى :lcompalg.l آلما وجدناه وهذا على مستوى الملف YACC "^" return(puis) ident strcpy(yylval.tstr,yytext) return(ident) reel return(reel) إذن و قبل أن نعيد IDENT على شكل token إلى YACC قمنا بتمرير قيمة المتغير إلى YACC و هذا بنسخها في,yylval.Tstr طبعا قلنا سابقا أن قيمة آل تطابق نجدها في المتغير المحجوز,yytext أحفظ و أغلق lcompalg.l ولننتقل إلى الخطوة الموالية. سنبدأ بمعالجة الخطا المعنوي الا ول و هو تكرار التصريح عن المتغيرات آما حدث مع المتغير r في المثال السابق, افتح الملف SYMB_TAB.H و لنبدأ با ضافة هذا الكود: #include<stdlib.h> #include<stdio.h> #include<string.h> typedef struct sym_node_ char name[56] struct sym_node *next sym_node sym_node *sym_table=null عرفنا الترآيبة sym_node المتكونة من اسم المتغير و مو شر لترآيبة من نفس النوع, و هنا أردنا إنشاء قاي مة ديناميكية من المتغيرات, حاليا يهمنا فقط اسم المتغير, بعد ذلك صرحنا عن sym_table وهي القاي مة التي تمثل جدول المتغيرات هنا و هي مو شر لترآيبة من نوع,sym_node طبعا هذا من أساسيات البرمجة بلغة C ولو آنت تجهل ماذا يعني ذلك الكود لما آنت تقرأ في هذا الكتاب. لنكمل, سنضيف دالتين, الا ولى put_sym والتي تثبت متغير جديد في القاي مة, أما الثانية get_sym ومن اسمها نستنتج أنها ستعيد إما مو شر للترآيبة التي تحوي المتغير المحدد على شكل بارامتر أو ستعيد NULL إذا آان المتغير غير مثبت من قبل: 33

34 sym_node *put_sym(char *sym_name) sym_node *ptr ptr=(sym_node*)malloc(sizeof(sym_node)) strcpy(ptr->name,sym_name) ptr->next=(sym_node*)sym_table sym_table=ptr return ptr sym_node *get_sym(char *sym_name) sym_node *ptr for(ptr=sym_tableptr!=nullptr=(sym_node*)ptr->next) if(!strcmp(ptr->name,sym_name))return ptr return NULL آود واضح, آيف نستعمله أغلق و أحفظ تغيرات الملف SYMB_TAB.H البارسر,compalg.y افتحه ولنبدأ با ضافة بعض الا آواد: ولنعد إلى ملف وصف % #include<conio.h> #include<math.h> #include "d:\lex_yacc\exemples\lcompalg.c" #include "d:\lex_yacc\exemples\symb_tab.h" int errors=0 void setup_sym(char* sym_name) sym_node *sym sym=get_sym(sym_name) if(sym==null) put_sym(sym_name) else errors++ printf("erreur: %s est deja definie : ligne %d.\n",sym_name,line) int sym_check(char* sym_name) if(get_sym(sym_name)==null) errors++ 34

35 printf("erreur: %s est inconnu : ligne %d.\n",sym_name,line) return 0 return 1 % // بسيطة, الدالة setup_sym تقوم بتثبيت متغير داخل جدول المتغيرات و هذا باستعمال الدوال المعرفة داخل الملف,d:\lex_yacc\exemples\SYMB_TAB.H قبل أن نضيف متغيرا جديدا يجب أن نتا آد من أنه لم يضاف من قبل بواسطة الدالة,get_sym إذا أعادة الدالة get_sym قيمة غير NULL فا ننا نعرض رسالة خطا تفيد أن المتغير معرف من قبل و في أي سطر وقع الخطا, المتغير line عرفناه من قبل داخل الملف lcompalg.l الذي يحمل وصف السكانر و بالتالي هو معرف في الملف lcompalg.c المولد من طرف,LEX أما إذا أعادت الدالة get_sym القيمة NULL فا ننا نثبت المتغير الجديد والسلام. أما الدالة sym_check فنستدعيها لنتا آد أن المتغير المعطى لها على شكل بارامتر مثبت مسبقا في قاي مة المتغيرات, و هذا لتجنب استعمال متغيرات غير مصرح بها من قبل, إذا لم يكن المتغير مثبتا من قبل فا ننا نعرض رسالة خطا. الا ن سنرى أين نستدعي الدوال, الا ضافات على الملف :compalg.y نستدعيها آلما وجدنا متغيرا أثناء تحليل الكود, لاحظ هذه %token <Tstr> IDENT $x,tstr حددنا نوع القيمة التي ستا تي مع ال token الخاص بالمتغيرات,IDENT الموافقة لل token عبارة عن سلسلة حرفية, لنواصل: وهي أي أنه declaration: decl_type ident POINT_VER declaration ident:ident setup_sym($1) IDENT VER ident setup_sym($1) آما ترون فا ن القاعدة <- declaration هي التي نحدد بها شكل التصريح عن المتغيرات, ولدينا ident تعطينا إما متغير أو متغير متبوع بفاصلة للتصريح عن المتغير, هناك يجب أن 35

36 نستدعي الدالة setup_sym() التي تقوم بتثبيت المتغير في جدول المتغيرات و في حالة تكرار التصريح عن نفس المتغير ستعرض خطا, إسم المتغير القادم من LEX سيكون محفوظ في yylval.tstr بالنسبة لل LEX و في $1 بالنسبة لل.BISON يبقى الا ن التحقق من المتغيرات قبل إسناد قيم لها أو استعمالها حتى, إذا و في آل قاعدة نجد فيها ال token الخاصة بالمتغير (IDENT) نقوم باستدعاء الدالة sym_check() للتحقق من المتغير, لاحظ أين يتم هذا: affect:ident AFFECT fexpr sym_check($1) IDENT AFFECT sexpr sym_check($1) read:ident sym_check($1) IDENT VER read sym_check($1) fexpr:reel ENTIER IDENT sym_check($1) fexpr PLUS fexpr fexpr MOIN fexpr fexpr MULT fexpr fexpr DIVS fexpr MOIN fexpr %prec NEG fexpr PUIS fexpr PARG fexpr PARD sym_check الا مر واضح, أضفنا des actions sémantiques اسم المتغير على شكل بارامتر. نستدعي خلالها الدالة با عطاي ها خزن محتوى الملف compalg.y لنرى نتيجة عملنا, احذف الملفات القديمة compalg.c) و compalg.h و (lcompalg.c و قم بتوليد آود المترجم الجديد و هذا بتشغيل الملفات الدفعية BISON_2.bat ثم FLEX_2.bat ثم rename.bat ثم compile.bat لنتحصل على البرنامج COMPALG.EXE النهاي ي, سنسمي هذه العملية بعملية توليد المترجم. 36

37 شغل المترجم COMPALG.EXE ليحلل و يكتشف الا خطاء الموجودة على مستوى الملف test.alg و هذه صورة لراسلة الا خطاء: أجل, لقد اآتشف الخطا ين الواردين في ال Algorithme المتغيرات و استعمال متغيرات لم يتم التصريح عنها من قبل المتعلقين بتكرار التصريح عن بقي لنا أن نكشف عن بقية الا خطاء وهي إسناد قيمة حقيقية لمتغير صحيح أو إسناد سلسلة حرفية لمتغير من نوع,char أآيد هناك المزيد من الا خطاء المعنوية و لكن سنكتفي فقط بما سبق ذآره. بما أن نوع المتغيرات يهمنا من الا ن فصاعدا فا ننا سنغير من بنية جدول المتغيرات, SYMB_TAB.H وغير الترآيبة التي تمثل المتغير إلى: إفتح الملف #include<stdlib.h> #include<stdio.h> #include<string.h> #define _int 1 #define _float 2 #define _str 3 #define _chr 4 typedef struct sym_node_ char name[56] int type struct sym_node *next sym_node حددنا أربع ثوابت int_ و float_ و str_ و chr_ تمثل آل من النوع الصحيح و الحقيقي و سلاسل الحروف و الحروف الوحيدة على التوالي, آما قمنا با ضافة حقل ا خر للترآيبة التي تحمل معلومات المتغير و هو type و الذي يمثل نوع المتغير. 37

38 سنغير أيضا في الدالة put_sym التي تثبت المتغير في الجدول لتصبح: sym_node *put_sym(char *sym_name, int sym_type) sym_node *ptr ptr=(sym_node*)malloc(sizeof(sym_node)) strcpy(ptr->name,sym_name) ptr->type=sym_type ptr->next=(sym_node*)sym_table sym_table=ptr return ptr واضح ما قمنا به من تغييرات, سنخزن نوع المتغير إضافة إلى اسمه من الا ن فصاعدا, سنضيف أيضا دالة جديدة تعيد لنا نوع المتغير المحدد و هي: int get_sym_type(char *sym_name) sym_node *ptr for(ptr=sym_tableptr!=nullptr=(sym_node*)ptr->next) if(!strcmp(ptr->name,sym_name)) return ptr->type return 0 خزن و أغلق الملف SYMB_TAB.H و لننتقل إلى الملف.compalg.y بما أننا غيرنا في الدالة put_sym الموجودة في الملف SYMB_TAB.H إذ أضفنا إليها نوع المتغير فا نه يجب التغيير في الدالة setup_sym الموجودة في compalg.y لتصبح: void setup_sym(char* sym_name, int type) sym_node *sym sym=get_sym(sym_name) if(sym==null) put_sym(sym_name, type) else errors++printf("erreur: %s est deja definie : ligne %d.\n",sym_name,line) 38

39 عند التصريح عن متغير جديد يجب أن نخزن نوعه إضافة إلى اسمه حتى نتمكن لاحقا من التحقق من توافق الا نواع أثنا إجراء عمليات الا سناد, سنضيف متغير جديد current_type نخزن فيه مو قتا نوع ا خر تصريح عن المتغيرات: int errors=0 int current_type ولنغير في آل الا ستدعاءات للدالة :setup_sym declaration: decl_type ident POINT_VER declaration ident:ident setup_sym($1, current_type) IDENT VER ident setup_sym($1, current_type) إذا أصبحا نخزن نوع المتغير مع اسمه, لكن يجب علينا تحديث قيمة current_type مرة يتم التصريح عن نوع جديد, هذا يتم على مستوى هذه القاعدة: في آل decl_type:dec_entier DEC_REEL DEC_CARA DEC_CHAINE current_type = _int current_type = _float current_type = _chr current_type = _str بعد هذا نستطيع التا آد من الا نواع أثناء القيام التي تحدد النحو الخاص بالا سناد: بالا سناد و هذا يتم على مستوى هذه القاعدة affect:ident AFFECT fexpr IDENT AFFECT sexpr fexpr:reel ENTIER IDENT fexpr PLUS fexpr fexpr MOIN fexpr 39

40 fexpr MULT fexpr fexpr DIVS fexpr MOIN fexpr %prec NEG fexpr PUIS fexpr PARG fexpr PARD sexpr:chaine CARA affect : IDENT AFFECT fexpr نحن لم نغير أي شيء في الكود السابق, لنا خذ مثلا هذه القاعدة: آيف نتحقق أثناء إسناد fexpr إلى IDENT يجب التحقق من أن نوع fexpr متوافق مع نوع IDENT وإلا نعرض رسالة خطا, IDENT هو متغير و لذلك نستطيع الحصول على نوعه من جدول المتغيرات باستعمال الدالة,get_sym_type أما بالنسبة إلى نوع fexpr فيجب علينا الحصول عليه من القاعدة التالية: fexpr : REEL ENTIER IDENT في الحالة الا ولى, أي عند fexpr <- reel نرجع النوع float_ إلى,fexpr في الحالة الثانية نرجع int_ إلى fexpr و في الحالة الثالثة نرجع إلى fexpr نفس نوع المتغير المرفق مع int قيمة النوع إذا نوعها يجب أن يكون fexpr و هكذا نكمل مع بقية القواعد.. وبما أن IDENT و آذلك نفس الشيء بالنسبة ل sexpr و نحدد ذلك بهذه الا ضافة إلى الكود: %union char Tstr[128] int Tint float Tfloat %type <Tint> fexpr %type <Tint> sexpr %token <Tstr> IDENT 40

41 sexpr إذا أول ما نفعله الا ن هو تحديد نوع fexpr آل من قواعدهما: و وهذا با ضافة هذا الكود المفهوم جدا إلى writed_expr:new_line /*لن نفعل شيي ا هنا*/ fexpr /* لن نفعل شيي ا هنا*/ sexpr fexpr:reel $$=_float ENTIER $$=_int IDENT if(sym_check($1)) $$ = get_sym_type($1) fexpr PLUS fexpr if(($1 == _int) && ($3 == _int)) $$ = _int else $$ = _float fexpr MOIN fexpr if(($1 == _int) && ($3 == _int)) $$ = _int else $$ = _float fexpr MULT fexpr if(($1 == _int) && ($3 == _int)) $$ = _int else $$ = _float fexpr DIVS fexpr $$ = _float MOIN fexpr %prec NEG $$=$2 fexpr PUIS fexpr $$=$1 PARG fexpr PARD $$=$2 sexpr:chaine $$=_str CARA $$=_chr $$=_float : fexpr float_ في القاعدة fexpr -> REEL أعدن القيمة إلى باستخدام الكود 41

42 في القاعدة fexpr <- IDENT أعدا نفس نوع المتغير IDENT بعد التا طد من أنه مثبت مسبقا في جدول المتغيرات إلى :fexpr if(sym_check($1)) $$ = get_sym_type($1) fexpr _int في القاعدة fexpr -> fexpr PLUS fexpr على اليمين من النوع :_int فا ننا نعيد النوع إذا آان آل من اللذان if(($1 == _int) && ($3 == _int)) $$ = _int else $$ = _float sexpr وهكذا نكمل باقي القواعد, الا ن استطعنا الحصول على آل من نوع fexpr لاستخدامهما في القاعدة المسو ولة عن تصريح المتغيرات, لنفعل ذلك: و affect:ident AFFECT fexpr if(sym_check($1)) int sym_type = get_sym_type($1) if((sym_type==_int) && ($3==_float)) printf("erreur:imposible de converter (reel a entier) : ligne %d.\n",line) errors++ else if((sym_type==_str) && ($3==_float)) printf("erreur:imposible de converter (reel a chaine) : ligne %d.\n",line) errors++ else if((sym_type==_chr) && ($3==_float)) printf("erreur:imposible de converter (reel a caractere) : ligne %d.\n",line) errors++ else if((sym_type==_chr) && ($3==_str)) printf("erreur:imposible de converter (chaine a caractere) : ligne %d.\n",line) errors++ 42

43 IDENT AFFECT sexpr if(sym_check($1)) int sym_type = get_sym_type($1) if((sym_type==_chr) && ($3==_str)) printf("erreur:imposible de converter (chaine a caractere) : ligne %d.\n",line) errors++ else if((sym_type==_int) && ($3==_str)) printf("erreur:imposible de converter (chaine a entier) : ligne %d.\n",line) errors++ else if((sym_type==_float) && ($3==_str)) printf("erreur:imposible de converter (chaine a reel) : ligne %d.\n",line) errors++ مثلا, في القاعدة affect <- IDENT AFFECT fexpr تحققنا أولا من وجود المتغير IDENT باستخدام,(sym_check($1 إذا آان موجودا نصرح عن متغير جديد باسم sym_type و نخزن فيه نوع المتغير IDENT باستخدام الدالة get_sym_type و بعد ذلك نبدأ عميلية التحقق من توافق نوع IDENT و fexpr,و آمثال إذا آان نوع IDENT هو _int و نوع fexpr هو _float فا ننا نعرض رسالة خطا تقول (لا يمكن التحويل من حقيقي إلى صحيح) و هكذا البقية. 43

44 أعد الا ن توليد المترجم آما تعلمت سابقا و نفذ برنامج المترجم الجديد COMPALG.EXE لتحصل على هذه النتيجة: لقد تمكننا الا ن من الكشف عن بقية الا خطاء المعنوية و هذا يكفي الا ن بالنسبة لمرحلة التحليل المعنوي أو,L analyse sémantique المرحلة التالية هي توليد الكود ) du Génération.(code 44

45 توليد الكود, هي عملية صعبة نوعا ما مقارنة مع ما سبقها, سنحاول هنا أن نولد آود assembleur فقط وهو الا قرب إلى لغة الا لة و أيضا سنعتمد طريقة بسيطة في توليد الكود و لن يكون هناك (édition de liens) linking لا ننا لن نستورد أي دوال من أي مكاتب. سنتعامل مع ال Assembleur 16 bit فقط, لن نحتاج إلى Assembleur 32 bit و هذا لا ننا نولد الكود النهاي ي هنا و سنحاول فيه أن نعتمد فقط على المقاطعات interruptions) (les و لن نتعامل مع الدوال الجاهزة أو les appels système إذ أن الكود يجب أن يكون على أبسط شكل و أقرب شكل إلى لغة الا لة, هذا مثال لكود assembleur يقوم بطباعة الجملة hello world على الشاشة:.MODEL small.stack 100h.data.code start: msg mov mov db " Hello, World!",13,10,"$" ds,ax mov dx,offset msg mov ah,9 int 21h المقاطعة التي ستعرض محتوى العنوان الموجود في دي اآس على الشاشة mov ax,0c07h int 21h الانتظار إلى أن يتم ضغط مفتاح من لوحة المفاتيح mov int end start ax, 4C00h 21h إذا أردت ترجمته استعمل أي Assembleur آ WinAsm Studio أن تكون على إطلاع و لو قليل بلغة التجميع مثلي. مثلا, لتفهم بقية الكتاب يجب 45

46 أنشي ملف جديد باسم CODE_GEN.H المولد في ملف من نوع :*.asm لنكتب فيه بعض الدوال التي تمكننا من آتابة الكود #include<stdio.h> قسم التصريحات// data_section[1024] char قسم الكود// code_section[8192] char FILE *fcode مقبض للملف الذي سيحمل الكود الناتج// دالة تمكننا من إنشاء ملف جديد ليكون // *file) void Init_Code(char بمثابة نتيجة لترجمة الا لغوريتم fcode = fopen(file, "wb") strcpy(data_section, "") strcpy(code_section, "") إضافة تصريح// *data) void Add_Data(char strcat(data_section, data) إضافة تعليمة// *code) void Add_Code(char strcat(code_section, code) تقوم با غلاق الملف وإتمام العملية حين ننهي توليد // Dispose_Code() void الكود fprintf(fcode, ".MODEL small\r\n.stack 100h\r\n.DATA\r\n") fprintf(fcode, "%s", data_section) fprintf(fcode, ".CODE\r\nstart:\r\n") fprintf(fcode, "mov ax,@data\r\n") fprintf(fcode, "mov ds,ax\r\n") fprintf(fcode, "%s", code_section) fprintf(fcode, "end start\r\n") fclose(fcode) أغلق الملف CODE_GEN.H مع حفظ التغييرات. 46

47 إذا إفتح الملف compalg.y و لنبدأ بهذا التغيير بما أننا سنستعمل دوال الملف :CODE_GEN.H #include "d:\lex_yacc\exemples\symb_tab.h" #include "d:\lex_yacc\exemples\code_gen.h" يجب علينا تهيي ة الملف الذي سنكتب فيه الكود المولد و هذا على مستوى الدالة الري يسية: main(int argc,char *argv[]) clrscr() if((yyin=fopen("d:\\lex_yacc\\exemples\\test.alg","r"))==null) printf("test.alg not found!\n") getch() return Init_Code("d:\\lex_yacc\\exemples\\test.asm") yyparse() Dispose_Code() if(!errors) printf("ok") getch() return ا ه, تذآرت, الملف test.alg آنا قد آتبنا فيه أآواد خاطي ة معنويا أثناء برمجة المحلل المعنوي, عد إلى الملف test.alg و أآتب فيه هذا الكود الصحيح ليكون فا ر التجربة: algorithme alg entier resultat,a reel r caractere car chaine s debut ecrire "Entrer a = " lire a lire r lire s s<-s s<-" " ecrire "c" 47

48 car<-"a" resultat<-5 a<-resultat*10+5 ecrire!,"a = ",a lire a fin. الا ن, أعد توليد المترجم COMPALG.EXE و شغله ليقوم بترجمة test.alg و ستلاحظ أنه سيولد لنا الملف الجديد TEST.ASM الذي يحمل آود التجميع, و بما أن آل ما ولدناه إلى الا ن هو رأس الكود فسيكون محتواه آالا تي:.MODEL small.stack 100h.DATA.CODE start: mov ax,@data mov ds,ax end start الا ن اتضحت لك الفكرة ماي ة في الماي ة, لنواصل توليد بقية الكود. في حالة التصريح عن المتغيرات فا ن ذلك يندرج تحت القاعدة التالية: ident:ident IDENT VER ident setup_sym($1, current_type) setup_sym($1, current_type) بدأنا نقترب من إآمال هذه المرحلة, طبعا لا, مازلنا بعيدين آل البعد و لكن الفكرة تتضح أآثر فا آثر و لهذا أنهي هذا الكتاب هنا و لتكمل البقية بنفسك...أمزح فقط(أردت الهروب قبل أن تزداد المسا لة صعوبة..), لا يهم, لنكمل. التصريح عن المتغيرات, بما أنني مبتدأ جدا في البرمجة بلغة التجميع فسا تعامل مع النوع الحقيقي على أنه صحيح أما سلاسل الحروف و الحروف فسهل التعامل معها, لزيادة الفهم لاحظ هذا التصريح وإلى ماذا سنحوله: entier a reel r caractere car chaine s a dw 6 dup(?) r dw 6 dup(?) car db? s db 56 dup( ) 48

49 قد لا يكون ذلك التصريح المثالي بالنسبة للغة التجميع و لكن تلك حدودي حاليا, تستطيع فعل ما هو أفضل من ذلك فافعل, نتجه الا ن إلى compalg.y لنفعل ذلك: إذا آنت ident:ident setup_sym($1, current_type) if((current_type == _int) (current_type == _float)) Add_Data($1) Add_Data("\tdw\t6 dup(?)\r\n") else if(current_type == _chr) Add_Data($1) Add_Data("\tdb\t?\r\n") else if(current_type == _str) Add_Data($1) Add_Data("\tdb\t56 dup( )\r\n") IDENT VER ident setup_sym($1, current_type) if((current_type == _int) (current_type == _float)) Add_Data($1) Add_Data("\tdw\t6 dup(?)\r\n") else if(current_type == _chr) Add_Data($1) Add_Data("\tdb\t?\r\n") else if(current_type == _str) Add_Data($1) Add_Data("\tdb\t56 dup( )\r\n") 49

50 TEST.ASM جميل, أعد توليد المترجم ثم شغل البرنامج COMPALG.EXE بالمحتوى التالي: لينتج لنا الملف.MODEL small.stack 100h.DATA a dw 6 dup(?) resultat dw 6 dup(?) r dw 6 dup(?) car db? s db 56 dup( ).CODE start: mov ax,@data mov ds,ax end start التصريح عن المتغيرات آان سهلا, أرجو أن يكون الباقي سهلا أيضا أو أسهل. لنبدأ بتوليد الكود الخاص ب lire و,ecrire سنبدأ ب ecrire لا نها تبدو أسهل و بما أنها تخرج نصوص على الشاشة فا ننا سنستخدم المقاطعة,int 21h لنرى. الدالة ecrire قد تا خذ على شكل بارامتر إما متغير أو سلسلة حرفية, إذا آانت سلسلة حرفية فيجب أن نصرح عنها أولا في قسم البيانات ثم نخرجها إلى الشاشة, مثلا: ecrire "Entrer a = " ecrire "c".data _msg_1 db "Entrer a = ","$".CODE mov dx,offset msg mov ah,9 int 21h.CODE mov mov int dl, "c" ah,2 21h CHAINE لنثبت هذا قبل أن ننتقل إلى غيره, ولكن, عندما يرجع LEX التوآن CARA يرفق معهما قيمة السلسة الحرفية و لهذا إفتح الملف :lcompalg.l أو يجب أن "\""."\"" strcpy(yylval.tstr,yytext) return(cara) 50

51 "\""(.)+"\"" strcpy(yylval.tstr,yytext) return(chaine) إذا آان بارامتر الدالة ecrire عبارة عن سلسلة حرفية فا ننا سنحتاج إلى التصريح عنه و آا نه متغير عادي, لذلك, سنعطي لتلك السلسلة من المتغيرات هذا الشكل _msgx_ حيث سيتغير X من 0 إلى 9, لذلك نعود إلى الملف CODE_GEN.H و لنصرح عن المتغير data_counter ليكون بمثابة عداد لقيمة X و آذلك سنصرح عن متغير مو قت strtemp وهو عبارة عن مو شر لسلسة حرفية قد نحتاجها لحفظ بعض العناوين بشكل مو قت, آذلك سنحتاج إلى متغير نحدد فيه ما إذا آانت التعليمة الا خيرة أهي ecrire إو إسناد لا نهما يتقاطعان في نفس القاعدة fexpr و :sexpr #include<stdlib.h> #define _WRITE 2 #define _AFFECT 3 char data_section[1024] char code_section[8192] FILE *fcode int data_counter = 0 char *strtemp int current_op الا ن لنعرف دالة جديدة تقوم با رجاع قيمة جديدة للمتغير :_msgx_ char* GenStrIdent() char *temp = (char*)malloc(sizeof(char)*8) char string[3] itoa(data_counter++, string, 10) sprintf(temp, "_msg%s_", string) return temp 51

52 compalg.y أغلق و احفظ الملف CODE_GEN.H المحدد لشكل الدالة :ecrire و نعد إلى الملف و بالتحديد إلى القاعدة %token <Tstr> CHAINE %token <Tstr> CARA write:writed_expr writed_expr VER write writed_expr:new_line current_op = _WRITEfexpr current_op = _WRITEsexpr sexpr:chaine $$=_str if(current_op == _WRITE) strtemp = GenStrIdent() Add_Data(strtemp) Add_Data("\tdb\t") Add_Data($1) Add_Data(",\"$\"\r\n") Add_Code("\r\necrire ") Add_Code($1) Add_Code("\r\n") Add_Code("mov dx, offset ") Add_Code(strtemp) Add_Code("\r\n") Add_Code("mov ah, 9\r\n") Add_Code("int 21h\r\n") CARA $$=_chr if(current_op == _WRITE) Add_Code("\r\necrire ") Add_Code($1) Add_Code("\r\n") Add_Code("mov dl, ") Add_Code($1 ) Add_Code("\r\n") 52

Microsoft Word - Bac SM Juin 2008ىثئ

Microsoft Word - Bac SM Juin 2008ىثئ ÉK[ JCbKTj J UJiJicRkaKj Ja [ MT J KV J a[ Jr JÉK[T J\[nT 8 Kc K R aku J ca J pkc Kc K R KV J a b M ab ab b a (, / (, ( ab, / A M ( ab, ( ab, / B M ( cd, αa βb إذن نقطة (,5 C JÉhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc

More information

Microsoft Word - cexajuil08.doc

Microsoft Word - cexajuil08.doc ثانوية محمد الخامس القنيطرة - الا ستاذ محمد غريز تصحيح الامتحان الوطني الموحد للباآلوريا الدورة - الاستدراآية - 8 الثانية علوم رياضية أ و ب http://arabmaths.ft.fr ( + )(+ ) ω= = 4 z = + z+ + التمرين الا

More information

Voc Mowashahat

Voc Mowashahat الموشحات و الارتجال المستوى : متوسط ومتقدم عدد الفيديوهات : 20 المدرس : ريبال الخضري المدرس : ريبال الخضري الموشحات و الارتجال موضوعان متعل قان ببعضهما البعض. في هذه السلسة يقوم ا ستاذ ريبال الخضري باستعراض

More information

ßá ÔÆ Úä æä

ßá ÔÆ Úä æä *بسم االله الرحمن الرحيم * * * ) ( صدق االله العظيم (اللهم لا سهل إلا ما جعلته سهلا و أنت تجعل الحزن إن شي ت سهلا ( 1 * * أهدي هذا الكتاب إلى آل من تعلم لغة الكمبيوتر و استفاد منها في دنياه و أفاد بها

More information

بسم الله الرحمن الرحيم

بسم الله الرحمن الرحيم بسم الرحيم الرحمن االلهاللهاللهالله Internet Explorer تحكم في 40 خاصية من خصاي ص اعداد العضو: TSH1 منتدى الجيش العربي http://www.arab-army.com www.arab-army.com - 1 - مقدمة: الهدف من هذا الكتاب هو Internet

More information

勤 學 * 卓 越 * 快 樂 成 長 本 校 在 老 師 群 策 群 力 共 同 討 論 下, 型 塑 了 學 校 願 景 : 勤 學 卓 越 快 樂 成 長 ( 一 ) 勤 學 運 用 真 的 力 量 培 養 勤 學, 以 語 文 教 為 基 礎 紮 根 ( 二 ) 卓 越 利 用 美 的 感

勤 學 * 卓 越 * 快 樂 成 長 本 校 在 老 師 群 策 群 力 共 同 討 論 下, 型 塑 了 學 校 願 景 : 勤 學 卓 越 快 樂 成 長 ( 一 ) 勤 學 運 用 真 的 力 量 培 養 勤 學, 以 語 文 教 為 基 礎 紮 根 ( 二 ) 卓 越 利 用 美 的 感 桃 園 市 復 旦 國 民 小 學 104 學 年 度 學 校 課 程 計 畫 壹 依 據 貳 目 的 一 教 基 本 法 第 13 條, 國 民 教 法 第 4 條 二 教 部 92 公 佈 之 國 民 中 小 學 九 年 一 貫 課 程 綱 要 三 桃 園 市 政 府 推 動 國 民 中 小 學 九 年 一 貫 課 程 實 施 計 畫 四 桃 園 市 政 府 97.5.29 府 教 數 字 第

More information

Microsoft Word - معادلــة مستقيــم

Microsoft Word - معادلــة مستقيــم اﻟﻤﻜﺘﺴﺒﺎت اﻟﻘﺒﻠﯿﺔ اﻟﺪاﻟﺔ ﻟﺘﺂﻟﻔﯿﺔ ﺗﻤﺜﯿﻠﮭﺎ اﻟﻤﺒﯿﺎﻧﻲ إﺣﺪاﺛﯿﺘﺎ ﻣﻨﺘﺼﻒ ﻗﻄﻌﺔ ﻣﺘﻮازي أﺿﻼع ﻣﺒﺮھﺔ ﻓﯿﺘﺎﻏﻮرس اﻟﻤﺴﺎﻓﺔ ﺑﻦ ﻧﻘﻄﯿﻦ اﻟﻘﺪرات اﻟﻤﻨﺘﻈﺮة ﺗﺤﺪﻳﺪ اﻟﻤﻌﺎدﻟﺔ اﻟﻤﺨﺘﺼﺮة ﻟﻤﺴﺘﻘﯿﻢ اﻟﺘﻌﺮف ﻋﻠﻰ ﺗﻮازي ﻣﺴﺘﻘﯿﻤﯿﻦ ﻣﻦ ﺧﻼل ﻣﯿﻠﯿﮫﻤﺎ

More information

Multiboot CD's & CD Shell

Multiboot CD's & CD Shell السلام علیكم ورحمة االله وبركاته هل تود الحصول على نسخة من CD یحتوي على الا تي وتكون أنت من قام بعملها: Windows XP Professional Normal Windows XP Professional SIF Windows XP HomeEdition Windows ME Hirens

More information

Cos I II Sin Sin - ENS - I IV 2 Cos 2017

Cos I II Sin Sin - ENS - I IV 2 Cos 2017 os I II Si 3 Si ENS I IV os 017 017 x iy كل عدد يكتب بصورة وحيدة على الشكل: عددان حقيقيان و1 i حيث x و y تسمى الكتابة: x iy الشكل الجبري للعدد المركب Re( ) Im( ) يسمى x الجزء الحقيقي ل ونرمز له ب: x يسمى

More information

١ اختبارات الفروض حول الفرق بين متوسطي مجتمعين أولا: إذا آانت العينتان مستقلتان بافتراض أن آل مجتمع من المجتمعين له توزيع طبيعي خصاي ص آل منهما آمايلي

١ اختبارات الفروض حول الفرق بين متوسطي مجتمعين أولا: إذا آانت العينتان مستقلتان بافتراض أن آل مجتمع من المجتمعين له توزيع طبيعي خصاي ص آل منهما آمايلي ١ اختبارات الفروض حول الفرق بين متوسطي مجتمعين أولا: إذا آانت العينتان مستقلتان بافتراض أن آل مجتمع من المجتمعين له توزيع طبيعي خصاي ص آل منهما آمايلي: المجتمع الثاني المجتمع الا ول خصاي ص المجتمع المتوسط

More information

<4D F736F F D20DDCAC7E6EC20D4D1DAEDC920DDED20C8DAD620E4E6C7D2E120C7E1E3D3E1E3EDE420C7E1CCCFCF20E4D3CEC920E3DACFE1C9>

<4D F736F F D20DDCAC7E6EC20D4D1DAEDC920DDED20C8DAD620E4E6C7D2E120C7E1E3D3E1E3EDE420C7E1CCCFCF20E4D3CEC920E3DACFE1C9> bøíšßdi@òèíš Ûa@õbèÔÏ@Éà مو تمر الا ي مة الرابع عشر شيكاغو - ا مريكا @òîç @ôëbnï في بعض نوازل المسلمين الجدد ا عداد الا ستاذ الدكتور صلاح الصاوي فهرس المحتويات : : : Nation of Islam : : : : : : : :,?

More information

桃園縣南美國民小學102學年度學校課程計畫

桃園縣南美國民小學102學年度學校課程計畫 桃 園 縣 南 美 國 民 小 學 02 學 年 度 學 校 課 程 計 畫 壹 依 據 一 教 部 國 民 中 小 學 九 年 一 貫 課 程 綱 要 (92.0.5 台 國 字 第 092006026 號 函 ) 二 95.05.24 台 國 ( 二 ) 字 第 0950075748B 號 令 修 正 第 伍 點 ( 學 習 領 域 ) 第 陸 點 ( 實 施 要 點 ) 三 教 部 97 年

More information

الإقتصاد خلال أسبوع

الإقتصاد خلال أسبوع א א א א א א א א א אE ٧ F ٢٧ هيي ة التحرير K K א א K K K تقارير معلوماتية א א א K א א א K א א א א K K K א א א א א א א א א א א א א א א א א. א א א א א א א א א א א א א א א א א. א א א א א אE ٧ F ٢٧ א א א א

More information

<4D6963726F736F667420576F7264202D20313034A67EB14DAD78B14DA468A6D2BFEFC2B2B3B95FAFF3AED75F2DA965ADFBB77CABE1ADD7A5BFAAA92DA64CBB73AAA9322E646F63>

<4D6963726F736F667420576F7264202D20313034A67EB14DAD78B14DA468A6D2BFEFC2B2B3B95FAFF3AED75F2DA965ADFBB77CABE1ADD7A5BFAAA92DA64CBB73AAA9322E646F63> 民 國 104 年 國 軍 志 願 役 專 業 預 備 軍 官 預 備 士 官 班 考 選 簡 章 目 錄 壹 考 選 對 象 及 資 格 :... 1 貳 考 選 員 額 :... 3 參 報 名 程 序 :... 4 肆 考 試 日 期 及 地 點 :... 7 伍 考 試 科 目 配 分 及 命 題 範 圍 :... 7 陸 測 驗 一 般 規 定 :... 8 柒 成 績 評 定 與 錄 取

More information

Microsoft Word - V c.doc

Microsoft Word - V c.doc 2006 UNITED NATIONS PUBLICATION Sales No. C.05.V.10 ISBN 92-1-730044-6 1999 1999 12-1 2000 12 2001 7 2004 3 36 2004 6 14 21 2004 6 25 2004 12 2 59/40 () 1 17 (A/55/17) 400-409 iii ........ 1 A.... 1 B....

More information

完成正副朝的形式

完成正副朝的形式 奉 普 慈 特 慈 的 真 主 之 名 آيفية أداء الحج والعمرة وبعض الا دعية فيهما 怎 样 进 行 正 朝 和 副 朝 及 部 分 祈 求 词 于 圣 城 麦 地 那 بسم االله الرحمن الرحيم 奉 普 慈 特 慈 的 真 主 之 名 怎 样 进 行 正 朝 和 副 朝 及 部 分 祈 求 词 آيفية أداء الحج والعمرة

More information

@fiî ñ Ïv ä a 1 = ( sr ) h s حيث (۱ قيمة الثابت h)

@fiî ñ Ïv ä a  1 = ( sr ) h s حيث (۱ قيمة الثابت h) 1 = h حيث (۱ قيمة الثابت h) ( @Z@fibñm aî@pbìbë a@z@µî a@òüyï a @Z@HQI@fibrfl 0= f حيث (۲ قيمة الثابت f) ( اعتمادا على الش كل ال ذي يمث ل منحن ى الاقت ران ) ( فجد قيمة كل مما يا تي : ) ( غير موجودة [ حيث

More information

桃園縣北勢國民小學103學年度學校課程計畫

桃園縣北勢國民小學103學年度學校課程計畫 桃 園 市 北 勢 國 民 小 104 度 校 課 程 計 畫 1-1 校 課 程 計 畫 壹 依 據 目 的 一 依 據 1. 教 育 部 92.01.15 台 國 字 第 092006026 號 公 佈 之 國 民 中 小 九 一 貫 課 程 綱 要 2. 教 育 部 97 國 民 中 小 九 一 貫 課 程 綱 要. 本 校 校 務 發 展 計 畫 二 目 的 1. 透 過 課 程 發 展 委

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

Ctpu

Ctpu 二 委 任 出 席 安 全 理 事 会 的 代 表 副 代 表 候 补 代 表 和 代 理 代 表 2010 年 8 月 1 日 至 2011 年 7 月 31 日 期 间 委 任 出 席 安 全 理 事 会 的 代 表 副 代 表 候 补 代 表 和 代 理 代 表 如 下 : * 奥 地 利 海 因 茨 菲 舍 尔 先 生 ( 奥 地 利 联 邦 总 统 ) 米 夏 埃 尔 施 平 德 埃 格

More information

0000Book_D10YB.indb

0000Book_D10YB.indb Angle Drill D 10YB Handling instructions Read through carefully and understand these instructions before use. 1 2 3 1 2 3 4 5 4 7 6 5 6 8 9 0 2 العربية English قلب ذراع المفتاح 1 Reversing switch lever

More information

Microsoft Word - 烘焙食品乙級第二部份 doc

Microsoft Word - 烘焙食品乙級第二部份 doc 烘 焙 食 品 乙 級 技 術 士 技 能 檢 定 術 科 參 考 資 料 試 題 編 號 :077-900201-3 審 定 日 期 : 年 月 日 修 訂 日 期 :96 年 7 月 1 日 97 年 1 月 30 日 97 年 10 月 27 日 98 年 6 月 20 日 98 年 12 月 17 日 99 年 08 月 20 日 烘 焙 食 品 乙 級 技 術 士 技 能 檢 定 術 科

More information

i

i GOLDEN EAGLE RETAIL GROUP LIMITED 3308 18 30 89 2 1206 111 24 183 17 1712 1716 ... 1... 18... 31... 33... 65... 86... 111 i C E 1 2 D F 1 14,556 1 5 1 5 1 GEICO 16 1-8 52,976.24 99 GEICO 2 1 1 2,755 B

More information

HADA4 01 March 2018

HADA4 01 March 2018 GALAXY Note 8 GALAXY S8+ GALAXY J7 2017 + Samsung Tick Tok Case 620 984 181 3,569 2,949 3,823 2,299 1,070 889 العروض ساریة حتى 10 مارس 2018 أو حتى نفاذ الكمیة المخصصة للعرض جمیع الا سعار تشمل ضریبة القیمة

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

{ي ا ا ي ه ا ال ناس ات ق وا ر ب ك م ال ذ ي خ ل ق ك م م ن ن ف س و اح د ة و خ ل ق م ن ه ا ز و ج ه ا و ب ث م ن ه م ا ر ج الا ك ث يرا و ن س اء و ات ق وا ا

{ي ا ا ي ه ا ال ناس ات ق وا ر ب ك م ال ذ ي خ ل ق ك م م ن ن ف س و اح د ة و خ ل ق م ن ه ا ز و ج ه ا و ب ث م ن ه م ا ر ج الا ك ث يرا و ن س اء و ات ق وا ا ( 阿 汉 双 语 第 42 讲 ) 一 卅 柯 韩 文 成 ----------------------------------------------------------------------------------------------------------------------------------------- خطبة الجمعة بتاريخ 19 من شعبان 1434

More information

(A)3 4 (B)5 6 (C)7 9 (D)10 2 (E) (A) (B) (C) (D) (E) ( ) ( ) ( ) (A) (B) (C) (D) (E) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (

(A)3 4 (B)5 6 (C)7 9 (D)10 2 (E) (A) (B) (C) (D) (E) ( ) ( ) ( ) (A) (B) (C) (D) (E) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (A) (B) (C) (D) ( . (A) (B) (C) (D) (E). (A) (B) (C) (D) (E) (A) (B) (C) (D) (E) (A) (B) (C) (D) (E).. (E) (A) (B) (C) (D). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E) (A) (C) (D) (E) (A) (B) (C) (D) (E)

More information

C B X 7 4 3( 3 2) (2 3) A 9() X I II II S S III 0, A , A IV A 4

C B X 7 4 3( 3 2) (2 3) A 9() X I II II S S III 0, A , A IV A 4 C 7 8 7 5 B X 7 4 ( ) 8 8 6 ( ) A 9() X I II II S 5 5 4 5 S III 0,0 5 7 0 0 A 0 0 0,0 0 0 0 5 0 0 4 A IV A 4 5 0 A 7 9 5 9 A V a (a ) 8a B x y x 5 xy y x y x C z z 6 4 z z 5 z AC = 5 BC = AB = 4 ABC AM

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

大小净与礼拜

大小净与礼拜 大 小 净 与 礼 拜 3 清 洁 篇 洁 净 和 污 秽 污 秽 : 穆 斯 林 应 当 谨 防 污 物 的 污 染, 受 到 污 染 后 应 当 清 洗 如 果 是 可 见 的 污 物, 如 : 例 假 血, 污 染 了 衣 服 和 身 体, 就 当 清 洗, 若 洗 后 留 下 了 一 些 难 于 除 掉 的 痕 迹, 则 是 无 妨 的 ; 至 于 意 义 上 的 脏 物 只 需 清 洗 一

More information

1

1 1 بسم االله الرحمان الرحيم الفھرس: مقدمة. برمجة سكریبت الخادم. برمجة سكریبت الزبون. تطبیق البرنامج في شبكة محلیة استعمال تقنیة threading - - - - - 2 -1 المقدمة : لابد انك في یوم احتجت لربط بین برامجك وربما

More information

Safety Notice * Don t touch the Head of printer with anything. * Don t touch the cutter blade. * Don t bend the power cord excessively or place any he

Safety Notice * Don t touch the Head of printer with anything. * Don t touch the cutter blade. * Don t bend the power cord excessively or place any he Specification آتيب الاستعمال PRP-085 THERMAL RECEIPT PRINTER طابعة سندات حرارية Safety Notice * Don t touch the Head of printer with anything. * Don t touch the cutter blade. * Don t bend the power cord

More information

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

More information

Microsoft Word - Question Bank - Translation and Communication, Common Course for II Sem.BA Afzal-Ul-Ulama

Microsoft Word - Question Bank - Translation and Communication, Common Course for II Sem.BA Afzal-Ul-Ulama UNIVERSITY OF LIUT SHOOL OF ISTNE EUTION FZL-UL-ULM II SEMESTER ommon ourse Question ank U208- Translation and ommunication اختر الجواب الصحيح 1) معنى الترجمة لغة a) الرسم b) النقل c) الفتح d) التقديم

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

一对一视频聊天交友:微商可以代理香蕉计划避孕套?赚钱吗?是骗人的吗?

一对一视频聊天交友:微商可以代理香蕉计划避孕套?赚钱吗?是骗人的吗? 一 对 一 视 频 聊 天 交 友 : 微 商 可 以 代 理 香 蕉 计 划 避 孕 套? 赚 钱 吗? 是 骗 人 的 吗? www.ycdce.net http://www.ycdce.net 一 对 一 视 频 聊 天 交 友 : 微 商 可 以 代 理 香 蕉 计 划 避 孕 套? 赚 钱 吗? 是 骗 人 的 吗? 这 个 片 区 就 是 你 的 市 场! 跟 快 递 搞 好 关 系 这

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

( CIP ) /,,. - :, ISBN H193.2 CIP (2004) JIAOSHI KOUYU YISHU (0898 ) B /

( CIP ) /,,. - :, ISBN H193.2 CIP (2004) JIAOSHI KOUYU YISHU (0898 ) B / 2004 ( CIP ) /,,. - :, 2004.2 ISBN 7-5442-2673-5...- - -.H193.2 CIP (2004) 003902 JIAOSHI KOUYU YISHU (0898 )65350227 B 3 570203 nhcbgs@0898.net 8901240 1/ 32 14 374 2004 2 1 2004 2 1 ISBN 7-5442-2673-5

More information

ebook14-4

ebook14-4 4 TINY LL(1) First F o l l o w t o p - d o w n 3 3. 3 backtracking parser predictive parser recursive-descent parsing L L ( 1 ) LL(1) parsing L L ( 1 ) L L ( 1 ) 1 L 2 L 1 L L ( k ) k L L ( 1 ) F i r s

More information

Microsoft PowerPoint - Stat 115 ch8_soh(2003) [Read-Only] [Compatibility Mode]

Microsoft PowerPoint - Stat 115 ch8_soh(2003) [Read-Only] [Compatibility Mode] الثامن: الباب واختبارات الفروض التقدير Chapter 8: Estimation & Hypotheses Testing مقدمة نظرا للصعوبات التي تواجه الباحثين في الحصول علي بيانات المجتمع ككل واللجوء ا لى ا سلوب العينة في جمع البيانات ا صبحت

More information

000Book_CE16SA.indb

000Book_CE16SA.indb Hand Shear CE 16SA Handling instructions Read through carefully and understand these instructions before use. 1 2 2 1 0 8 4 3 5 6 7 9 3 4! 5 4 7 6 5 6 2 English 中國語 العربية 1 Name Plate لوحة الاسم 2 Swtich

More information

. (A) (B) (C) A (D) (E). (A)(B)(C)(D)(E) A

. (A) (B) (C) A (D) (E). (A)(B)(C)(D)(E) A . () () () () () (A) (B) (C) B (D) (E). (A) (B) (C) E (D) (E) (A) (B) (C) (D). () () () () E (A) (B) (C) (D) (E). C (A) (B) (C) (D) (E). (A) (B) (C) (D) D (E). () - () - () - () - () - D (A) (B) (C) (D)

More information

第5章修改稿

第5章修改稿 (Programming Language), ok,, if then else,(), ()() 5.0 5.0.0, (Variable Declaration) var x : T x, T, x,,,, var x : T P = x, x' : T P P, () var x:t P,,, yz, var x : int x:=2. y := x+z = x, x' : int x' =2

More information

关 注 本 期 证 券 未 办 理 抵 押 权 转 让 变 更 登 记 本 期 证 券 发 起 机 构 转 让 信 托 财 产 时, 按 惯 例 并 未 办 理 抵 押 权 转 让 变 更 登 记, 而 由 委 托 人 在 有 管 辖 权 的 政 府 机 构 登 记 部 门 继 续 登 记 为 名

关 注 本 期 证 券 未 办 理 抵 押 权 转 让 变 更 登 记 本 期 证 券 发 起 机 构 转 让 信 托 财 产 时, 按 惯 例 并 未 办 理 抵 押 权 转 让 变 更 登 记, 而 由 委 托 人 在 有 管 辖 权 的 政 府 机 构 登 记 部 门 继 续 登 记 为 名 优 势 基 础 资 产 信 用 质 量 很 好 入 池 贷 款 借 款 人 加 权 平 均 年 龄 37.04 岁, 借 款 人 年 龄 在 30~40( 含 ) 岁 的 贷 款 未 偿 本 金 余 额 占 入 池 贷 款 总 额 的 40.10%, 该 年 龄 段 借 款 人 一 般 收 入 较 为 稳 定, 多 处 于 职 业 及 收 入 的 上 升 期, 家 庭 状 况 较 为 稳 定, 还

More information

农银人寿发[2013]102号-4 农银寰宇至尊高端医疗保险条款

农银人寿发[2013]102号-4 农银寰宇至尊高端医疗保险条款 农 银 人 寿 [2013] 医 疗 保 险 004 号 请 扫 描 以 查 询 验 证 条 款 农 银 寰 宇 至 尊 高 端 医 疗 保 险 条 款 阅 读 指 引 本 阅 读 指 引 有 助 于 您 理 解 条 款, 对... 本 主 险 合 同... 内 容 的 解 释 以 条 款 为 准... C 您 拥 有 的 重 要 权 益 v 本 主 险 合 同 提 供 的 保 障 第 二 章 v

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

ii & iii

ii & iii 342C 993 20 1.5 ...................................................... ii & iii............................................................ 1-4................................................... 5-6......................................................

More information

Trays Brochure Mobile Version - V2

Trays Brochure Mobile Version - V2 TRUFFLES & TRAYS الترافلز والصواني Explore our selection of fine chocolates, silverware and handcrafted ceramics. اكتشف تشكيلتنا من الشوكولاتة الفضيات ومنتجات السيراميك المصنعة يدويا WHATSAPP +971 50 724

More information

穆斯林每天的赞主词

穆斯林每天的赞主词 作者 : 阿兹 达额斯坦 译者 : 艾布阿布杜拉 艾哈默德 本 阿布杜拉 穆士奎 来源 : 利雅得莱布宣传合作办公室 2 الطبعة الا ولى: 2006 / 1427 جميع الحقوق محفوظة لموقع دار الا سلام. ويسمح بطباعة الكتاب ونشره بشرطين: 1. الا شارة للناشر وهو المكتب التعاوني

More information

% %, 82

% %, 82 2013 5 May 2013 3 Arab World Studies No.3 2011 7 2 50 )) الدستور الجديد (( )) الجريدة الرسمية (( عدد 5964 مكرر 28 شعبان 30 1432 يوليو 2011 81 1956 20% 40 7 20%, 82 1961 1962 83 علي آريمي: الربط بين مطالب

More information

粤社保函〔2013〕80号

粤社保函〔2013〕80号 맣 뚫 쪡 짧 믡 놣 쿕 믹 뷰 맜 샭 뻖 粤 社 保 函 2016 120 号 맘폚뾪햹2016쓪뛈쪡횱웳튵횰릤믹놾퇸샏뷰 쇬좡룱죏횤폐맘쫂쿮뗄춨횪 参 加 省 直 企 业 职 工 社 会 保 险 各 单 位 和 离 退 休 人 员, 社 会 申 办 退 休 人 员 : 根 据 国 家 和 省 的 有 关 规 定, 省 社 保 局 从 2016 年 4 月 1 日 起, 开 展 2016 年

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

DL Human Element in UAE English V7

DL Human Element in UAE English V7 ﺑﺮﻧﺎﻣـﺞ اﻟﻌﻨﺼﺮ اﻟﺒﺸﺮي The Human Element ﻳﻘﺎم اﻟﺒﺮﻧﺎﻣﺞ ول ﻣﺮة ﻓﻲ اﻟﺸﺮق ا وﺳﻂ 7-3 ﻓﺒﺮاﻳﺮ 2019 ﻓﻨﺪق ﻛﻤﺒﻴﻨﻴﺴﻜﻲ ﻣﻮل ا ﻣﺎرات - دﺑﻲ ﻟﻠﺘﺴﺠﻴﻞ WWW.LSA.AC/HE ﺗﺘﻮﻓﺮ اﻟﺘﺮﺟﻤﺔ اﻟﻔﻮرﻳﺔ +965 22215622 Ext: 627 +965 51012111

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

UNIVACCO TECHNOLOGY INC. btlee@univacco.com.tw YHHsiao@univacco.com.tw 17 3 www.sinopac.com www.ey.com.tw () 1,515,358 1,466,953 3.30% 69,009 159,347 56.70% 1.01 3,258,852 3,016,500 242,352 8.03% ()

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

清洁

清洁 كتاب الطهارة ] صيين chinese [ 作 者 : 穆 罕 默 德 本 伊 布 拉 欣 艾 勒 图 外 洁 利 翻 译 : 艾 布 阿 布 杜 拉 艾 哈 默 德 穆 士 奎 校 正 : 李 清 霞 2009 430 2 كتاب الطهارة» باللغة الصينية «تا ف:حممد بن إبراهيم بن عبد االله احكوجيري ترمجة:

More information

i

i China Smartpay Group Holdings Limited 8325 67% 29 16 EGM-1 EGM-3 33 A18 48 i .............................................................. 1........................................................ 12..........................................................

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 阿拉伯语经贸谈判与口译 التفاوض بلغة الضاد في التجارة والاقتصاد 授课教师 : 杨言洪 运输条款及交货期谈判 التفاوض في شروط الشحن وتسليم البضاي ع 案例一 : 关于交货期的谈判 案例二 : 关于交货事宜的谈判 运输方式的分类 海洋运输 铁路运输 航空运输 班轮运输 租船运输 班机运输 包机运输 集中托运 航空急件传送方式 集装箱运输

More information

Microsoft PowerPoint - Lecture4.ppt

Microsoft PowerPoint - Lecture4.ppt بسم االله الرحمن الرحيم الجامعة الا سلامية غزة آلية الهندسة قسم الهندسة المعمارية مفهوم الهيكل التنظيمي: عند الكلاسيكيون: - الا طار أو البناء الذي يحدد العلاقات القاي مة في المو سسة وعلاقتها عموديا أو

More information

James Rosenau James Rosenau, The Scientific Study of Foreign Policy, London: Frances Printer, 1980, p

James Rosenau James Rosenau, The Scientific Study of Foreign Policy, London: Frances Printer, 1980, p 2013 5 May 2013 3 Arab World Studies No.3 Internet World Stats 2012 6 30 153294175 70% 50% 2003 33 2012 6 30 http://www.internetworldstats.com 107 James Rosenau 1 2 2008 4 James Rosenau, The Scientific

More information

1

1 1 2 3 4 5 GNUDebugger 6 7 void main(int argc, char **argv){ vulncpy(argv[1]); return; } void vulncpy(char *a){ char buf[30]; strcpy(buf, a); return; } *argv[1] buf Shellcode *argv[1]... &buf &buf 8 strcpy

More information

Microsoft PowerPoint - paper15 [Compatibility Mode]

Microsoft PowerPoint - paper15 [Compatibility Mode] الجامعة العالمية الا سلامية - ماليزيا ا.د. محمد زكي خضر الجامعة الا ردنية khedherju.edu.jo المعلوماتية في خدمة القرا ن الكريم 2004-6 25 1 التعامل مع القرا ن الكريم في عصر المعلوماتية نبذة تا ريخية مواقع

More information

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

新 竹 市 都 市 計 畫 委 員 會 第 233 次 會 議 紀 錄 壹 時 間 :102 年 8 月 28 日 ( 星 期 三 ) 上 午 9 時 30 分 貳 地 點 : 本 府 第 一 會 議 室 參 主 持 人 : 許 主 任 委 員 明 財 肆 出 席 委 員 : 詳 簽 到 簿 伍 列

新 竹 市 都 市 計 畫 委 員 會 第 233 次 會 議 紀 錄 壹 時 間 :102 年 8 月 28 日 ( 星 期 三 ) 上 午 9 時 30 分 貳 地 點 : 本 府 第 一 會 議 室 參 主 持 人 : 許 主 任 委 員 明 財 肆 出 席 委 員 : 詳 簽 到 簿 伍 列 新 竹 市 都 市 計 畫 委 員 會 第 233 次 會 議 紀 錄 壹 時 間 :102 年 8 月 28 日 ( 星 期 三 ) 上 午 9 時 30 分 貳 地 點 : 本 府 第 一 會 議 室 參 主 持 人 : 許 主 任 委 員 明 財 肆 出 席 委 員 : 詳 簽 到 簿 伍 列 席 單 位 : 詳 簽 到 簿 陸 確 認 前 次 ( 第 232 次 ) 會 議 紀 錄 : 同

More information

全民健康保險重大傷病範圍

全民健康保險重大傷病範圍 ICD-10-CM/PCS 碼 C73 C00.0-C06.9 C09.0- C10.9 C12-C14.8 C50.011-C50.929 C53.0-C53.9 C55 C00.0-C96.9 ( 不 含 C73 C94.4 C94.6) 全 民 健 康 保 險 重 大 傷 病 各 項 疾 病 檢 附 資 料 項 目 參 考 表 105/1/1 適 用 中 文 疾 病 名 稱 一 需 積 極 或

More information

D/A DAC ( 1us) (10~20 ) DAC0832 1

D/A DAC ( 1us) (10~20 ) DAC0832 1 D/A DAC0832 8 ( 1us) (10~20 ) DAC0832 1 1. 20 DI7~DI0 ILE 8 8 DAC 8 D/A LE LE & RFB VREF IOUT2 IOUT1 RFB CS WR1 XFER WR2 & & AGND VCC DGND 2 DI7~DI0 ILE & 8 LE 8 DAC LE 8 D/A RFB V REF IOUT2 IOUT1 R FB

More information

(4) 按语法理解规范朗读基础考察 即给段落文字打符号, 占比 25/240 主要考察考生对句中单词根据其语法地位的尾符变化情况, 工具词导致的动词 名词尾符变化情况, 单词词型的规范读音等方面的掌握情况 是很具有阿拉伯语言特色的经典考察方式 (5) 汉阿互译能力考察, 属于主观题, 占比 50/2

(4) 按语法理解规范朗读基础考察 即给段落文字打符号, 占比 25/240 主要考察考生对句中单词根据其语法地位的尾符变化情况, 工具词导致的动词 名词尾符变化情况, 单词词型的规范读音等方面的掌握情况 是很具有阿拉伯语言特色的经典考察方式 (5) 汉阿互译能力考察, 属于主观题, 占比 50/2 河北省普通高校专科接本科教育考试 阿拉伯语专业考试说明 I. 课程简介 一 内容概述与要求本考试面对我省具备国家大学专科水准的考生, 是其在本科继续学习阶段选择学习阿拉伯语言文学专业的入学考试 我省目前专科阿拉伯语相关专业的设置属高等职业教育类应用阿拉伯语专业, 其在培养目标上不同于本科学位教育, 在课程设置上也非本科低年级课程设置的瘦身, 为此, 本考试的设置是希望筛选出那些在知识结构 语言基础

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc 2 5 8 11 0 1. 13 2. 15 3. 18 1 1. 22 2. 25 3. 27 2 1. 35 2. 38 3. 41 4. 43 5. 48 6. 50 3 1. 56 2. 59 3. 63 4. 65 5. 69 13 22 35 56 6. 74 7. 82 8. 84 9. 87 10. 97 11. 102 12. 107 13. 111 4 114 1. 114 2.

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

گزارش گمان شکن

گزارش گمان شکن : : 90 :.. : (. www.avesta.org ) http://bertrandrussell.mihanblog.com farhad_98@ymail.com http://ketabnak.com .. :.. ). (............ Casartelli, Philosophie Religieuse du Mazdéisme sous les Sassanides,

More information

C

C C 14 2017 5 31 1. 2. 3. 4. 5. 2/101 C 1. ( ) 4/101 C C ASCII ASCII ASCII 5/101 C 10000 00100111 00010000 ASCII 10000 31H 30H 30H 30H 30H 1 0 0 0 0 0 ASCII 6/101 C 7/101 C ( ) ( ) 8/101 C UNIX ANSI C 9/101

More information

Microsoft PowerPoint خط تاثير [Compatibility Mode]

Microsoft PowerPoint خط تاثير [Compatibility Mode] خط تاثير بار واحد متحرک خط تاثير يک مقدار نيرويی (نيرو های داخلی يا عکس العملهای تکيه گاهی) عبار ت است از عرض معادله منحنی (خط تاثير) که در هر نقطه با ضرب شدن ا ن در مقدار بارمتمرکزدرجهت بار واحد کميت

More information

Microsoft Word - TPI-TJB-S-CR4-13-0181-PCC-VC

Microsoft Word - TPI-TJB-S-CR4-13-0181-PCC-VC 澳 門 特 別 行 政 區 初 級 法 院 第 四 刑 事 法 庭 合 議 庭 普 通 刑 事 案 第 CR4-13-0181-PCC 號 * 判 決 書 卷 宗 編 號 :CR4-13-0181-PCC 一. 案 件 概 述 ( 一 ) 檢 察 院 控 訴 書 內 容 澳 門 特 別 行 政 區 初 級 法 院 檢 察 院 對 嫌 犯 甲 提 出 控 訴, 嫌 犯 身 份 資 料 如 下 : -

More information

*33*!!! "!! #$! %#! "& "! #! %! # ( ) * # +, # -, # +., $ /# ( ) 0 $ +# ( ) 0 $.# ( ) 0 $ # $! % "" " % 1 % & ( * ) * % " " %.! % 2!!"+# ( "&! " ( "#

*33*!!! !! #$! %#! & ! #! %! # ( ) * # +, # -, # +., $ /# ( ) 0 $ +# ( ) 0 $.# ( ) 0 $ # $! %   % 1 % & ( * ) * %   %.! % 2!!+# ( &!  ( # 588!"! #$$%& &&#! ()! *(+ "! *(, "! (-.! *(/ "! (.! ().! (01! /0! *(. # 2(.! *2. $ *20 3 $! *( % ) % *+ " % * 4 5 6 % - % 0. % 7. *33*!!! "!! #$! %#! "& "! #! %! # ( ) * # +, # -, # +., $ /# ( ) 0 $ +#

More information

, 史密斯亲爱的约翰 عزيزي السيد مجدي ا حمد Minder formeel, men heeft reeds zaken met de geadresseerde gedaan, 亲爱的约翰 عزيزي مجدي Informeel, men is bevriend met d

, 史密斯亲爱的约翰 عزيزي السيد مجدي ا حمد Minder formeel, men heeft reeds zaken met de geadresseerde gedaan, 亲爱的约翰 عزيزي مجدي Informeel, men is bevriend met d - Aanhef Arabisch Chinees, 尊敬的主席先生 عزيزي السيد الري يس Zeer formeel, geadresseerde heeft een speciale titel die in plaats van de naam wordt gebruikt, 尊敬的先生 سيدي المحترم Formeel, mannelijke geadresseerde,

More information

c36022001.pdf

c36022001.pdf 1 i i i E 0 1 Eden email equality evening /'id%/ /'imel/ /i'kwal3t0/ /'ivn0h/ A sailor went to sea, sea, sea, To see what he could see, see, see. But all that he could see, see, see, Was the bottom of

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20 (Jump) (Loop) (Conditional jump) CMP CALL AND SAR/SHR TEST JMP NOT SAL/SHL Jnnn* OR RCR/ROR LOOP XOR RCL/ROL RETn * nnn, JNE JL -128 127-32,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far

More information

نظام التحليل والتصميم الانشائي باستخدام برنامج STAAD III

نظام التحليل والتصميم الانشائي باستخدام برنامج STAAD III نظام التحليل والتصميم الانشاي ي باستخدام برنامج STAAD III Structural Analysis And Design By Three Dimensions (III) المقدمة يعتب ر م ن الب رامج المهم ة ف ي تص ميم وتحلي ل المنش ا ت الهيكلي ة المبني ة م

More information

第一次段考 二年級社會領域試題 郭玉華 (A)(B) (C)(D)

第一次段考   二年級社會領域試題 郭玉華   (A)(B) (C)(D) 五 福 二 社 p1 高 雄 市 立 五 福 國 民 中 學 97 學 年 度 第 1 學 期 第 1 次 段 考 二 年 級 社 會 學 習 領 域 試 題 卷 代 號 :30 答 案 卡 塗 寫 注 意 事 項 1. 答 案 卡 劃 記 時, 必 須 用 黑 色 2B 鉛 筆 塗 黑 塗 滿, 但 不 可 超 出 圈 外 2. 年 班 級 座 號 科 目 請 劃 記 正 確 若 劃 記 錯 誤,

More information

<4D F736F F D20D3EDDFE6E1E6CCEDC920C7E1E1DAC820DAE4CF20C7E1C3D8DDC7E12E646F63>

<4D F736F F D20D3EDDFE6E1E6CCEDC920C7E1E1DAC820DAE4CF20C7E1C3D8DDC7E12E646F63> سيكولوجية اللعب عند الا طفال سيكولوجية اللعب عند الا طفال توطي ة oتعریف اللعب oأنواع اللعب عند الا طفال oأهمية اللعب في حياة الا طفال وفواي ده oالخصاي ص المميزة للعب الا طفال oالعوامل المو ثرة في لعب الا

More information

<4D6963726F736F667420576F7264202D203135343030AB4FA5C0A448ADFBA4FEAFC5C0B3C0CBB8EAAEC6B2C4A447B3A1A5F73938303230362E646F63>

<4D6963726F736F667420576F7264202D203135343030AB4FA5C0A448ADFBA4FEAFC5C0B3C0CBB8EAAEC6B2C4A447B3A1A5F73938303230362E646F63> 保 母 人 員 單 一 級 技 術 士 技 能 檢 定 術 科 測 試 應 檢 參 考 資 料 試 題 編 號 :15400-960401~8 審 定 日 期 :96 年 11 月 30 日 修 訂 日 期 :97 年 1 月 31 日 98 年 0 月 06 日 保 母 人 員 單 一 級 技 術 士 技 能 檢 定 術 科 測 試 應 檢 參 考 資 料 第 二 部 份 壹 保 母 人 員 技

More information

《中文核心期刊要目总览》2008年印刷版(即第五版)于2008年1月1日正式发行

《中文核心期刊要目总览》2008年印刷版(即第五版)于2008年1月1日正式发行 附 件 2: 第 一 编 哲 学 社 会 学 政 治 法 律 类 1. 中 国 社 会 科 学 2. 北 京 大 学 学 报. 哲 学 社 会 科 学 版 3. 学 术 月 刊 4. 中 国 人 民 大 学 学 报 5. 北 京 师 范 大 学 学 报. 社 会 科 学 版 6. 清 华 大 学 学 报. 哲 学 社 会 科 学 版 7. 浙 江 大 学 学 报. 人 文 社 会 科 学 版 8.

More information

(Microsoft Word - \275\327\244\345\265o\252\355\241G\277\275\254L\247g960527.doc)

(Microsoft Word - \275\327\244\345\265o\252\355\241G\277\275\254L\247g960527.doc) 論 文 發 表 七 處 理 國 中 小 懷 孕 學 生 的 性 別 教 育 觀 想 蕭 昭 君 ( 國 立 花 蓮 教 育 大 學 教 育 學 系 副 教 授 ) 中 華 民 國 96 年 5 月 27 日 B-121 壹 前 言 : 如 果 阿 英 晚 生 三 十 年 處 理 國 中 懷 孕 學 生 的 性 別 教 育 觀 想 蕭 昭 君 國 立 花 蓮 教 育 大 學 教 育 系 副 教 授 2007/5/21

More information

(E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E) (A) (B) (C) (D) (E) (A) (B) (C) (D). ( ) ( ) ( ) ( ) ( ) ( ) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (

(E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E) (A) (B) (C) (D) (E) (A) (B) (C) (D). ( ) ( ) ( ) ( ) ( ) ( ) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). ( . (A) (B) (C) (D) (E). ( ) ( ) ( ) ( ) ( ) ( ) (A) (B) (C) (D) (E) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). 1950 (A) (B) (C) (D) (E). 60 70 (A) (B) (C) (D) (E). ( ) ( ) ( ) ( ) (

More information

02

02 Thinking in C++: Volume One: Introduction to Standard C++, Second Edition & Volume Two: Practical Programming C++ C C++ C++ 3 3 C C class C++ C++ C++ C++ string vector 2.1 interpreter compiler 2.1.1 BASIC

More information

保母人員丙級應檢資料第二部份 doc

保母人員丙級應檢資料第二部份 doc 15400903018 9 09 15 95 01 10 95 11 16 ...-3...4-9... 10...11-1...13-16...17-54... 55...56-64 1 5 3 154-90301154-9030 1 1 3 1 4 60 1 180 L 5 1 6 1 7 1 8 1 9 90 70 1 10 1 11 1 1 1 13 1 14 1 15 1 16 1 17

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

epub 33-8

epub 33-8 8 1) 2) 3) A S C I I 4 C I / O I / 8.1 8.1.1 1. ANSI C F I L E s t d i o. h typedef struct i n t _ f d ; i n t _ c l e f t ; i n t _ m o d e ; c h a r *_ n e x t ; char *_buff; /* /* /* /* /* 1 5 4 C FILE

More information

C语言的应用.PDF

C语言的应用.PDF AVR C 9 1 AVR C IAR C, *.HEX, C,,! C, > 9.1 AVR C MCU,, AVR?! IAR AVR / IAR 32 ALU 1KBytes - 8MBytes (SPM ) 16 MBytes C C *var1, *var2; *var1++ = *--var2; AVR C 9 2 LD R16,-X ST Z+,R16 Auto (local

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

立 志 于 打 造 最 贴 近 考 生 实 际 的 辅 导 书 计 算 机 考 研 之 数 据 结 构 高 分 笔 记 率 辉 编 著 周 伟 张 浩 审 核 讨 论 群 :15945769

立 志 于 打 造 最 贴 近 考 生 实 际 的 辅 导 书 计 算 机 考 研 之 数 据 结 构 高 分 笔 记 率 辉 编 著 周 伟 张 浩 审 核 讨 论 群 :15945769 立 志 于 打 造 最 贴 近 考 生 实 际 的 辅 导 书 计 算 机 考 研 之 数 据 结 构 高 分 笔 记 率 辉 编 著 周 伟 张 浩 审 核 讨 论 群 :15945769 前 言 在 计 算 机 统 考 的 四 门 专 业 课 中, 最 难 拿 高 分 的 就 是 数 据 结 构 但 是 这 门 课 本 身 的 难 度 并 不 是 考 生 最 大 的 障 碍, 真 正 的 障 碍

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63> 因 为 路 过 你 的 路, 因 为 苦 过 你 的 苦, 所 以 快 乐 着 你 的 快 乐, 追 逐 着 你 的 追 逐 内 容 简 介 本 书 根 据 2005 年 下 半 年 实 施 的 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 嵌 入 式 系 统 设 计 师 级 考 试 大 纲 精 神, 在 深 入 研 究 历 年 计 算 机 技 术 与 软

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

<4D6963726F736F667420576F7264202D20313032303431312D2D3135343030AB4FA5C0A448ADFBB3E6A440AFC5C0CBA977B8D5C344B2C4A447B3A1A5F75FB6C25F2E646F63>

<4D6963726F736F667420576F7264202D20313032303431312D2D3135343030AB4FA5C0A448ADFBB3E6A440AFC5C0CBA977B8D5C344B2C4A447B3A1A5F75FB6C25F2E646F63> 保 母 人 員 單 一 級 技 術 士 技 能 檢 定 術 科 測 試 應 檢 參 考 資 料 試 題 編 號 :15400-101401~8 審 定 日 期 :101 年 1 月 03 日 修 訂 日 期 :10 年 0 月 7 日 10 年 04 月 11 日 保 母 人 員 單 一 級 技 術 士 技 能 檢 定 術 科 測 試 應 檢 參 考 資 料 壹 保 母 人 員 技 術 士 技 能

More information