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

أين الخطأ في هذا البرنامج؟؟؟

مغلق
بدأه MissJoOry في 10 مايو 2007 · 4 رد · 804 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عملت برنامج في لغة السي

يحول من

postfix to infix

قمت بالتعريف للمتغيرات وكامل ان شاللله

بس بمجرد ما تطلع لي الشاشه السوداء على طول يطلع لي

syntax error

وعجزت احدد فين الخطاااا

يالييييت تساعدوني فيه

انا كاتبه تعليق على شغل كل داله للتوضيح

 

#include <stdio.h>
#include <ctype.h>
#include <string.h>


#define BSIZE   128 //حجم البفر
#define NONE  -1
#define EOS ''	// نهاية السلسلة الحرفية
#define NUM   256  // الاعداد والتوكن الخاص بهاه
#define DIV   257  // الكلمة المحجوزة div والتوكن الخاص بها
#define MOD   258  // الكلمة المحجوزة mod والتوكن الخاص بها
#define ID   259  // الاسماء  والتوكن الخاص بها
#define DONE  260  // نهاية الملف والتوكن الخاص بها
#define SYMMAX 100  // عدد الرمموز الممكن أن تحتوي عليها مصفوفة الرموز
#define STRMAX 999  // الحد الأقصى لمصفوفة الحروف lexemes[]


int lastentery = 0; // متغير يحتوي على رقم أخر عنصر تم اضافته لمصفوفة الرموز
int lineno = 1;   // متغير يحتوي على رقم السطر الذي نقرأه من الملف
int tokenval = NONE;  // متغير يحتوي على قيمة العدد أو دليل مصفوفة الرموز
int lastchar = -1;  // متغير يحتوي على رقم الحرف الذي نقرأه من مصفوفة الحروف lexemes[]

char lexemes[STRMAX];   // مصفوفة الحروف
char lexbuf[BSIZE];	 // مصفوفة مؤقتة تستخدم داخل دالة المحلل المفرداتي


int lookahead;
/* الاعلان عن السجل الخاص بالكلمات المحجوزة */

struct entry
{
 char * lexptr; //مؤشر  إلى النص الذي نقرأه من المستخدم
 int token;	 // التوكن الخاص بكل كلمة نقرأها
};


// الاعلان عن مصفوفة الكلمات المحجوزة للغة المصدر
struct entry keyword[] = 
{
 "div",DIV,
 "mod",MOD,
 0,0
};

struct entry Symtable[SYMMAX];  //الاعلان عن مصفوفة الرموز

//الاعلان عن الدوال\\\


// دالة البحث عن  الكلمة هل هي موجودة في مصفوفة الرموز
int Lookup( char * s );

//دالة الاضافة الكلمة في مصفوفة الرموز
int Insert( char * s, int tok );

//دالة طباعة رسالة عن الخطأ
void error(char * M);

// دالة المحلل المفرداتي
int lexen();

//دالة ادخال الكلمات المحجوزة في مصفوفة الرموز
void init();


//دالة المحلل النحوي
void parse();
void expr();
void match( int t );
void term();
void factor();
void emit(int t,int tval);




// دالة المحلل المفرداتي
int lexen()
{
 int  t;  


 while( 1 )
 {
   t = getchar();  

  if( t == ' ' || t == '\t' );  
  else if( t == '\n' )
   lineno=lineno+1;
  else if( isdigit(t) )//t is digit
  {   
   ungetc(t,stdin);
   scanf("%d",&tokenval); //tokenval = 0;
   return NUM;
  }
  else if( isalpha(t) )
  {
   //تتم قراءة وحدة نص تشمل أحرف وأ عداد
   int p,b=0;

   while( isalnum(t) )
   {
	lexbuf = t;
	t = getchar();  
	b ++;

	if( b >= BSIZE )
	 error("error: Lexbuf is Full");

   }

   lexbuf = EOS;

   if( t != EOF )
	ungetc(t,stdin);

   p = Lookup(lexbuf);

   if( p == 0 )
	p = Insert(lexbuf,ID);

   tokenval = p;

   return  Symtable[p].token;

  }
  else if( t == EOF )
  {   
   return  DONE;
  }
  else
  {
   tokenval = NONE;

   return  t;
  }
 } 

}


//دالة ادخال الكلمات المحجوزة في مصفوفة الرموز
void init()
{
 struct entry * p;

 for( p = keyword; p->token != 0; p++ )
  Insert( p->lexptr,p->token );

}



void parse()
{ 
 int lookahead = lexen();
 while(lookahead!=DONE)
 {
 expr();
 match(';');
 }
}//end of function

void expr()
{
 int t;
 term();
 while(1)
 {
  switch(lookahead)
 {
 case '+':case '-':

   t = lookahead;   
   match(lookahead);
   term();
   emit(t,NONE);
   continue;

 default:
  error("Syntax Error2222");
  break;
 }//end of switch
}
}//end of function

void term()
{
  int t;
  factor();
  while(1)
 {
  switch(lookahead)
  {
  case '*':case '/':case DIV:case MOD:
   {
	t = lookahead;
	match(lookahead);
	factor();
	emit(t,NONE);
	continue;
   }
  default:
   return;   

  }//end of switch
 }//end of while
}//end of function



void factor()
{
 switch(lookahead)
 {
 case '(':
  {
   match('(');
   expr();
   match(')');
   break;
  }
 case NUM:
  {
   emit(NUM,tokenval);
   match(NUM);
   break;
  }
 case ID:
  {
   emit(ID,tokenval);
   match(ID);
   break;
  }
 default:
  error("Syntax error 111");
  break;
 }//end of switch
}//end of function

void match( int t )
{
 if( lookahead == t )
  lookahead = lexen();
 else
  error("Syntax error 4444");
}//end of function

void emit(int t,int tval)
{

 switch(t)
 {
 case '+':case '-':case '*':case '/':
  {
   printf("%c\n",t);
   break;
  }

 case DIV:
  {
   printf("DIV\n",t);
   break;
  }
 case MOD:
  {
   printf("MOD\n",t);
   break;
  }
 case NUM:
  {
   printf("%d\n",tval);
   break;
  }
 case ID:
  {
   printf("%s\n",Symtable[tval].lexptr);
   break;
  }
 default:
  printf("token %d, tokenval %d\n",t,tval);

 }//end switch

}//end function


// دالة البحث عن  الكلمة هل هي موجودة في مصفوفة الرموز

int Lookup( char *s )

{
 int p;

 for( p=lastentery; p>0; p-- )
 {
  if( strcmp( Symtable[p].lexptr,s ) == 0 )
   return p;
 }

 return 0;
}


//دالة الاضافة الكلمة في مصفوفة الرموز
int Insert(char *s, int tok )

{
 int len;
 len = strlen(s);
 if( lastentery+1>= SYMMAX )
  error("Symbol table Full");

 if( lastchar+len+1 >= STRMAX )
  error("Lexems Array Full");

 lastentery ++;

 Symtable[lastentery].token = tok;

 Symtable[lastentery].lexptr = & lexemes[lastchar++];

 lastchar = lastchar + len + 1;


 //قم بنسخ محتويات السلسة s الى مصفوفة الحروف lexemes[]
 strcpy(Symtable[lastentery].lexptr,s);   // strcpy(lexemes[lastchar],S);

 return  lastentery;

}

//دالة طباعة رسالة عن الخطأ
void error(char * M)
{

 printf("line:%d, %s\n",lineno,M );

}



int main()
{

 init();
 parse();

 return 0;
}

ولكم جزيل الشككررررر

اختكم جوري

تم تعديل هذه المشاركة بواسطة MissJoOry في 10 مايو 2007 في 21:36

#2

السلام عليكم

لقد أعجبتني كثيرا كتابة الكود وهذه بعض ملاحظاتي:

في دالة إدخال الرموز تم إدخال رمزان فقط وهما div, mod في الأمكنة2 ﻭ 1 وليس 0 و 1

راجع هذا الكود

strcpy(Symtable[lastentery].lexptr,s);

إستعمل دالة ترجع متغير عوض

 while( 1 )
{...

مثال

 while(factor())
{
  switch(lookahead)
  {...

علما أني غيرت نوع الدالة factor من voidالى int

  switch(lookahead)
  {
  case '*':case '/':case DIV:case MOD:
   {

عوض هذه التعيمات ب

  if((lookahead=='*')||(lookahead=='/')||(lookahead==DIV)||(lookahead==MOD))
  {
....
   {....

لم تستعمل التعليمة التالية في محلها لأنها تستعمل لأخذ حرف من الشاشة وترجع الرقم المقابل له

t = getchar();

حاولت تتبع الكود ولكنه مقسم للعديد من الدوال ا لصغيرة المتداخلة.

إ ستعمل Debug mode وسيسر لك تتبع الكود ومعرفة مكان الخطأ. وإن كنت لا تعلم كيفية ذلك فأنقر في حافة شاشة الفيزوال ستوديو بجانب مكان كتابة الكود وستظهر لك كرة حمراء ثم عند الترجمة سيتوقف في تلك النقطة.

F10 للمرور الى التعليمة الموالية

F11 لدخول الى كود دالة أخرى مستدعاة في تلك الأسطﺭ

والله أعلم

#3

أهليين اخوي Ben_Laiid

شكرا على حضورك الرائع

جربت اللي قلت لي في ال

while

ما ضبط يطلع لي ال

syntax error

:(

#5

السلام عليكم

لقد أشرت لجملة من الأخطاء ليس فقط ال

while

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…