• 0
نادين01

مساعدة في برنامج lex

سؤال

السلام عليكم

 

لدي مشكلة في برنامج LEX 

%option noyywrap lettre        [A-Za-z]chiffre        [0-9]mot_clé        "prog"|"var"|"int"|"func"|"proc"|"begin"|"if"|"then"|"else"|"while"|"do"|"opaffect"|"oprel"|"opadd"|"opmul"|"nb"|"not"identificateur  {lettre}(_|{lettre}|{chiffre})*nb        {chiffre}{chiffre}*oprel  "=="|"<>"|"<"|">"|"<="|">="opadd        "+"|"-"|"or"opmul        "*"|"/"|"div"|"mod"opaffect "=" %% {identificateur} { printf ("id");}{nb} { printf ("nb");}{mot_clé } { printf ("mot_clé");}{oprel} { printf ("oprel");}{opadd} { printf ("opadd");}{opmul} { printf ("opmul");}{opaffect} { printf ("opaffect");} %% main() {yylex();}

حيث يظهر لي هذا الخطأ

2iDF0n.png

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

هناك مسافة هنا:

{mot_clé } { printf ("mot_clé");}        ^       مسافة

يلزم إزالتها واستبدلي é بحرف e (لاتدعم C غير رموز الإنجليزية و _ والأرقام مسموحة بعد الحرف الأول).

 

أيضاً لديكي مشكلة أن identificateur سيتم التحقق منها قبل mot_cle والتي يبدو أنها تمثل الكلمات المحجوزة في برنامجك، المشكلة في هذا الترتيب أن برنامجك سيعامل الكلمات المحجوزة كما لو كانت identificateur. يلزم التحقق من الكلمات المحجوزة أولاً.

%option noyywrap lettre          [A-Za-z]chiffre         [0-9]mot_cle         "prog"|"var"|"int"|"func"|"proc"|"begin"|"if"|"then"|"else"|"while"|"do"|"opaffect"|"oprel"|"opadd"|"opmul"|"nb"|"not"identificateur  {lettre}(_|{lettre}|{chiffre})*nb              {chiffre}{chiffre}*oprel           "=="|"<>"|"<"|">"|"<="|">="opadd           "+"|"-"|"or"opmul           "*"|"/"|"div"|"mod"opaffect        "=" %%{mot_cle}   { printf ("mot_cle");}{identificateur} { printf ("id");}{nb} { printf ("nb");}{oprel} { printf ("oprel");}{opadd} { printf ("opadd");}{opmul} { printf ("opmul");}{opaffect} { printf ("opaffect");} %% int main(void) {  yylex();  return 0;}

يمكنك تبسيط:

nb              {chiffre}{chiffre}*

إلى:

nb              {chiffre}+
تم تعديل بواسطه Mr.B
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله فيك اخي الكريم

شكرا لك على المساعدة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي الفاضل لدي سؤال آخر

%option noyywrapchiffre        [0-9]chiffre1         [1-9]nb       {chiffre}{chiffre}*nb1        {chiffre1}+rationel   ([+-]?{nb}"/"[+-]?{nb1})%%{rationel} { printf ("\n%s ---->est un nombre rationel \n", yytext);}%%main () {yylex();}

اذا كان عدد ناطق يتم طباعة ---->est un nombre rationel

 

لكن اذا كان العكس اي انه ليس عدد ناطق، كيف تتم طباعة ---->c'est pas  un nombre rationel

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

عدد ناطق = عدد كسري؟

 

يمكنك استخدام طريقة أطول تطابق، مثلأً إذا أردتي مطابقة علامة المساواة == وعلامة الإسناد =، لأن النمطين فيهما جزئ مشترك (عدد صحيح في حالتك)، فيلزم أن بدأين أولاً بالتحقق من علامة المساواة == لأنها الأطول ثم =، وإلا فسيعتبر flex أن == عبارة عن علامتي = متتاليتين.

 

في حالتك يلزم التحقق من أن العدد كسري أولاً لأنه الأطول (يتكون من عدد صحيح تتبعها شرطة مائلة يتبعها عدد صحيح) ثم بعدها يلزم التحقق من أن العدد صحيح.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

والله اخي الكريم لم افهم

فحبذا لو تعطيني مثال

بارك الله فيك استاذ

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
%option noyywrapchiffre       [0-9]nb            {chiffre}+integer       [+-]?{nb}rationel      {integer}"/"{integer}%%{rationel} { printf("rationel : %s\n", yytext); }{integer}  { printf("integer  : %s\n", yytext); }%%int main(void) {  yylex();  return 0;}
تم تعديل بواسطه Mr.B
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا استاذ لكن ليس هذا قصدي

 

مثال: يدخل المستخدم كلمة Bonjour

ف lex عندها لا يتعرف عليها لانها ليست عدد ناطق

ففي هذه الحالة سيتم طباعة نفس الكلمة

أنا أريده عوضا انه يكررها  يطبع كلمة اخرى ك: "!rationnel"

 

اظن انها ليست من خصائص lex ؟؟؟  والله اعلم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .