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

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

بدأه نادين01 في 14 ديسمبر 2014 · 7 رد · 2,044 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

لدي مشكلة في برنامج 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

#2

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

{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 في 15 ديسمبر 2014 في 00:10

1
#3

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

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

#4

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

%option noyywrap

chiffre        [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

#5

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

 

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

 

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

#6

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

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

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

#7
%option noyywrap

chiffre       [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 في 22 ديسمبر 2014 في 23:03

#8

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

 

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

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

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

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

 

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

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