السلام عليكم
عملت برنامج في لغة السي
يحول من
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;
}ولكم جزيل الشككررررر
اختكم جوري