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

تطوير لهذا الكود

بدأه نبولي في 5 ديسمبر 2010 · 3 رد · 632 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم جميعا

طلب منا الاستاذ تصميم Lexical Analyzer بسيط يقوم بقراة جملة مدخلة ويترجم اجزائها

عمل البرنامج على هذا الشكل

input string : nab39+uy=45;

والــ output سوف يكون على هذا الشكل

nab : Identifier

39 : Number

+ : Plus

uy : Identifier

= : Ass

45 : Number

; : SimiColon

التطوير االمطلوب هو ان ندخل جملة معينه مثل هذه

x2=56a+85;

x2 : identifier

= : ass

56a : Not Number

+ : Plus

; : simi

التغيير باللون الاحمر اعلاه

حاولت ان اغير الكود لكي يقوم بهذه العملية ولم اوفق

فهل من افكار

هذا الكود اللذي كتبته انا


#include<iostream.h>
void main()
{
int i,k,s;
char c;
char str[20];
cout<<"ENTER THE ASSIGN STATMENT \n";
cin>>str;
i=0;
s=i;
c=str;
while(c!=';')
{
c=str;
if((c>='a')&&(c<='z')||(c>='A')&&(c<='Z'))
{
s=i;
while((c>='a')&&(c<='z')||(c>='A')&&(c<='Z'))
{
i++;
c=str;
}
for(k=s;k<i;k++)
cout<<str[k];
cout<<" : Idrntifier\n";
}
if((c>='0')&&(c<='9'))
{
s=i;
while((c>='0')&&(c<='9'))
{
i++;
c=str;
}
for(k=s;k<i;k++)
cout<<str[k];
cout<<" : Number\n";
}
if(c=='=')
cout<<c<<" : Assigment\n";
if(c=='+')
cout<<c<<" : Plus\n";
if(c=='-')
cout<<c<<" : Subtraction\n";
if(c=='*')
cout<<c<<" : Multi\n";
if(c=='/')
cout<<c<<" : Division\n";
if(c==';')
cout<<c<<" : SimiColon\n";
i++;
}
}

#2
اقتباس

السلام علیکم جمیعا

و علیک السلام و رحمة الله و برکاته

تفضل ، الکود بعد التصحیح:

 


#include <iostream> 
using namespace std;

void main() 
{ 
    	int i,k,s; 
    	char c; 
  char str[20]; 
    	cout<<"\nENTER THE ASSIGN STATMENT \n"; 
    	cin>>str; 
    	i=0; 
    	s=i; 
    	c=str;

  if ((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='='))
   cout<<"\nERROR! You need a left value";
  else
  {
   while(c!=';') 
   {  
     if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z'))) 
     { 
       s=i; 
       while((c!=';')&&(c!='=')&&(c!='+')&&(c!='-')&&(c!='*')&&(c!='/'))   // because if it was like this "abc123" is acceptable. but if it was one of operators it is not acceptable
       { 
         i++; 
         c=str; 
       } 
       for(k=s;k<i;k++) 
         cout<<str[k]; 
       cout<<" : Idrntifier\n"; 
     } 


     if((c>='0')&&(c<='9')) 
     {  bool NotNumber=false;
       s=i; 
       while((c!=';')&&(c!='=')&&(c!='+')&&(c!='-')&&(c!='*')&&(c!='/'))  	
       { 
         if (((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z')))  //if there was a thing like this "123abc" then it is not a number. but we read it completely and later we write it "is not a number" :(
          NotNumber=true;
         i++; 
         c=str; 
       }
       if (NotNumber)
       {
        for(k=s;k<i;k++) 
          cout<<str[k]; 
        cout<<" : Not Number\n"; 
       }
       else
       {
        for(k=s;k<i;k++) 
          cout<<str[k]; 
        cout<<" : Number\n"; 
       }
     }

     if(c=='=')
       cout<<c<<" : Assigment\n";       
     if(c=='+') 
       cout<<c<<" : Plus\n"; 
     if(c=='-') 
       cout<<c<<" : Subtraction\n"; 
     if(c=='*') 
       cout<<c<<" : Multi\n"; 
     if(c=='/') 
       cout<<c<<" : Division\n";
     if(c==';') break; 

     i++;
     c=str;

   }
   if (c==';') cout<<c<<" : Semicolon\n";

  }
  system("pause");
}

>(

تم تعديل هذه المشاركة بواسطة c77431 في 5 ديسمبر 2010 في 20:10

#3

عاشت يداك اخي الكريم

وماقصرت

الكود روعة كامل وبالضبط اعطاني النتيجة المطلوبة

عندي سؤال \\ انت شفت طريقة كتابتي في الكود

هل من الممكن تضمين فكرتك في الكود الخاص بي بدون استخدام

using name space

وبصراحة الفقرة هاي مافهمتها


s=i;
while((c!=';')&&(c!='=')&&(c!='+')&&(c!='-')&&(c!='*')&&(c!='/'))
{
if (((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))) //if there was a thing like this "123abc" then it is not a number. but we read it completely and later we write it "is not a number" :(
NotNumber=true;
i++;
c=str;
}
if (NotNumber)
bool NotNumber=false;

ماهو عمل كلمة bool

تحياتي وشكري الخالص لك

و

#4

حیاک الله...

( ملاحظة منذ بدایة، لا أقدر أکلم باللغة العربیة بشکل صحیح، فإن کان خطأ فیه أرجوا العفو)

اقتباس
عندي سؤال \\ انت شفت طريقة كتابتي في الكود

هل من الممكن تضمين فكرتك في الكود الخاص بي بدون استخدام

using name space

نعم، لقد تغیرت لیعمل مع المترجم الذی هو عندی. فأنت تغیر هکذا:

 

#include <iostream.h>  

void main()

ماهو عمل كلمة bool

کما أنت ذکرت إن دُخل عدد هکذا " 123abc" فهو خطأ. فلهذا أنا استخدمت

bool NotNumber=false

فلـ NotNumber هو إثنا القیم. الصحیح و الخطأ. true and false

إن کان NotNumber صحیح فلقد دخل عدد بشکل خطأ و إن کان NotNumber بشکل false فدخل عدد بشکل صحیح. نحن نستخدم هذا المتغیر هنا:

   	if (NotNumber) 
   	{ 
    	for(k=s;k<i;k++)  
      	cout<<str[k];  
    	cout<<" : Not Number\n";  
   	} 
   	else 
   	{ 
    	for(k=s;k<i;k++)  
      	cout<<str[k];  
    	cout<<" : Number\n";  
   	}

هنا إن کان عدد مثلا هذا: 123abc فالقیمة NotNumber هو true و یکتب لنا

اقتباس
123abc : Not Number

أرجوا أن یکون واضح...

إن کان سوال فأنا فی الخدمة

تحیاتی

>(

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