الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

دالة scanner و parser

بدأه بوارق الفجر في 27 أكتوبر 2011 · 6 رد · 1,094 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

صباحكم / مساءكم < فُـــــــــــل

لو سمحتوا اريد شرح للدوال scanner و parser

بداية دالة سكانر 

tokentype scanner()

{char in_char,c;
clear_buffer();
if(infile.eof()) {element="THE END"; return EndOFile;}



While (!infile.eof())
{
infile.get(in_char);    

if(isspace(in_char)) infile.get(in_char);

else if ( in_char=='(' ) {element="(    "; return LPAREN;}

else if ( in_char==')' ) {element=")    "; return RPAREN;}

else if ( in_char==';' ) {element=";    "; return SEMICOLON;}

else if ( in_char==',' ) {element=",    "; return COMMA;}

else if ( in_char=='+' ) {element="+    "; return PLUSOP;}

else if ( in_char=='.' ) {element=".   "; return DOT;}



else if (in_char==':'){
infile.get(c);
if (c== '=') { element= ":=    ";  return ASSIGNOP; }   else infile.putback(c);
}


else if (in_char=='-')   { infile.get(c);
if (c== '-')   do  infile.get(in_char); While (in_char !='\n';

else { infile.putback(c); element="-      ";}


}


else if (isalpha(in_char))

{i=0; bufffer_char(in_char);

for (c=infile.get(); isalnum (c) || c =='_';  infile.get(c) )   {i=i+1;  buffer_char(c); }

infile.putback(c);

return check();

}

else if (isdigit(in_char))

{i=0;  buffer_char (in_char);

for(c=infile.get(); isdigit(c); c=infile.get() )    {i=i+1;  buffer_char(c);}

infile.putback(c);

element=this_token;

return INTLITERAL;

}

else  if (infile.eof()) {element="THE END";  return EndOFile;}

else f2 <<"ERROR " <<in_char<<"is an illegal character "<<endl;

}

element="THE END";   return EndOFile;


}



//-----------------------------------------------------------------------------------------------------------------------------------------



void make_token_file()

{
tokentype t;
int test=1;
while (test)
{
t=scanner(); if(t==EndOFile) test=0;
elementRecord.tokeName=t;  elementRecord.tokenSpelling=element;

file.write (reinterpret_cast<char *>  (&elementRecord), sizeof (tokenRecord   ));

}
}

هذه دالة الـ scanner بعد ما افهمها بنزل دالة parser انتظركم ولكم الأجر

تم تعديل هذه المشاركة بواسطة بوارق الفجر في 27 أكتوبر 2011 في 10:43

#2

الداله scanner تقوم بقراءة الحروف من infile (حسب عدد حروف اكبر token او عدد حروف الـ literal) و تقوم بإرجاع ثابت يمثل الـ token التى تم إيجادها، هذا الثابت هو احد عناصر tokentype (قد يكون typedef أو enum).

قمت من فترة بكتابة parser لتحليل العمليات الحسابيه فى هذا الموضوع.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#3

أخي محمد علا الدين رفع الله قدرك واعطاك ماتتمنى

هل ممكن اجد كتاب باللغه العربيه يشرح مادة بناء المترجمات

وإذا لديك وقت هل من الممكن ان تشرح لي كل فقره في الكود

وجزيت جنه عرضها السماوات والارض

#4

كيف احل المثالين التاللين :

س1/ عدل في الداله scanner الذي يقبل الكلمات الثابته و ID بإسم متغير لايحتوي على اثنين _ _ ولاينتهي بـ _ ؟

else if (isalpha(in_char)) 

{i=0; bufffer_char(in_char); 

for (c=infile.get(); isalnum (c) || c =='_';  infile.get(c) )   {i=i+1;  buffer_char(c); } 

infile.putback(c); 

return check(); 

}

س2/ عدل في الجزء التالي ليقبل ارقام كسريه 5452.378 ؟

else if (isdigit(in_char)) 

{i=0;  buffer_char (in_char); 

for(c=infile.get(); isdigit(c); c=infile.get() )    {i=i+1;  buffer_char(c);} 

infile.putback(c); 

element=this_token; 

return INTLITERAL; 

}
#5
بوارق الفجر كتب:

أخي محمد علا الدين رفع الله قدرك واعطاك ماتتمنى

هل ممكن اجد كتاب باللغه العربيه يشرح مادة بناء المترجمات

وإذا لديك وقت هل من الممكن ان تشرح لي كل فقره في الكود

وجزيت جنه عرضها السماوات والارض

http://www.vc4arab.com/showthread.php?t=2104

http://www.uqucs.com/vb/attachment.php?attachmentid=2445&d=1267649696

هذان الكتابان لا ثالث لهما للمترجمات بالعربية

الانجليزية كتب كثيرة وعديدة

GoodBye

#6

MohamedIBrahim

الله يجزااااااااك كل خييييييييير

طيب كيف احل الامثله في الرد 4 في هذا الموضوع

#7

انا فـــــــــــــــــــــــــي انتظاركم

مواضيع مشابهة