تحلیلگر لغوی درس طراحی کامپایلر

ehsan_amd72

New Member
ارسال ها
1
لایک ها
0
امتیاز
0
#1
سلام دوستان
پروژه تحلیلگر لغوی زبان سی پلاس پلاس مربوط به درس طراحی کامپایلر رو پیاده سازی کردم کامل اجرا میشه و مشکلی نداره فقط قسمت خطایاب خطاهای لغوی رو نمیتونه تشخیص بده و نمیدونم مشکل از کجاس لطفا کمکم کنید...خیلی عجله ای و او
رژانسی هست
:17::17::17:
قسمت های مربوط به خطایاب رو کامنت here گذاشتم


کد
#include<stdio.h> [/B]
[B]#include<string.h> [/B]
[B]#include<stdlib.h>[/B]
[B]#include<iostream>[/B]
[B]#include<ctype.h>[/B]
[B]#include<conio.h>[/B]
[B]using namespace std;[/B]


[B]void removeduplicate();[/B]
[B]void final();[/B]
[B]int Isiden(char ch);[/B]
[B]int Isop(char ch);[/B]
[B]int Isdel(char ch);[/B]
[B]int Iskey(char * str);[/B]


[B]char op[8]={'+','-','*','/','=','<','>','%'}; [/B]
[B]char del[8]={'}','{',';','(',')','[',']',','}; [/B]
[B]char *key[]={"int","void","main","char","float","return","cout","cin","if","else","while","for"}; [/B]


[B]int idi=0,idj=0,k,opi=0,opj=0,deli=0,uqdi=0,uqidi=0,uqoperi=0,kdi=0,liti=0,ci=0,ei=0; //heeeeeeeeeeeereeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee[/B]
[B]int uqdeli[20],uqopi[20],uqideni[20],l=0,j; [/B]
[B]char uqdel[20],uqiden[20][20],uqop[20][20],keyword[20][20]; [/B]
[B]char iden[20][20],oper[20][20],delem[20],litral[20][20],lit[20],constant[20][20],err[20][20]; [/B]

[B]void lexanalysis(char *str) [/B]
[B] { [/B]
[B]   int i=0; [/B]
[B]   while(str[i]!='\0') [/B]
[B]    {[/B]
[B]     if(Isiden(str[i]))     //for identifiers [/B]
[B]       { [/B]
[B]          while(Isiden(str[i])) [/B]
[B]        { [/B]
[B]            iden[idi][idj++]=str[i++]; [/B]
[B]        } [/B]
[B]          iden[idi][idj]='\0'; [/B]
[B]          idi++;[/B]
[B]	  idj=0; [/B]
[B]       }[/B]

[B]      else[/B]
[B]      if(str[i]=='"')         //for literals [/B]
[B]         { [/B]
[B]         lit[l++]=str[i]; [/B]
[B]         for(j=i+1;str[j]!='"';j++) [/B]
[B]           { [/B]
[B]            lit[l++]=str[j]; [/B]
[B]           } [/B]
[B]         lit[l++]=str[j];lit[l]='\0'; [/B]
[B]         strcpy(litral[liti++],lit); [/B]
[B]         i=j+1; [/B]
[B]         } [/B]
[B]      else [/B]
[B]      if(Isop(str[i]))        // for operators [/B]
[B]          { [/B]
[B]         while(Isop(str[i])) [/B]
[B]            { [/B]
[B]             oper[opi][opj++]=str[i++]; [/B]
[B]            } [/B]
[B]         oper[opi][opj]='\0'; [/B]
[B]         opi++;opj=0; [/B]
[B]          } [/B]
[B]       else [/B]
[B]       if(Isdel(str[i]))     //for delemeters [/B]
[B]          { [/B]
[B]          while(Isdel(str[i])) [/B]
[B]            { [/B]
[B]              delem[deli++]=str[i++]; [/B]
[B]            } [/B]
[B]           } [/B]
[B]        else [/B]
[B]           { [/B]
[B]            i++; [/B]
[B]        } [/B]
[B]     } [/B]

[B]   removeduplicate(); [/B]
[B]   final(); [/B]
[B]} [/B]

[B]int Isiden(char ch) [/B]
[B] { [/B]
[B]   if(isalpha(ch)||ch=='_'||isdigit(ch)||ch=='.') [/B]
[B]   return 1; [/B]
[B]   else [/B]
[B]   return 0; [/B]
[B] } [/B]
[B]int Iserror(char * str)		//heeeeeeeeeeeeeeeeeeeereeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee[/B]
[B] { [/B]
[B]   int x=0;[/B]
[B]   if(isdigit(str[x]))[/B]
[B]	for (x=1;x<10;x++)[/B]
[B]		if(isalpha(str[x]))[/B]
[B]	return 1;      [/B]
[B]  }[/B]
[B]int Isop(char ch) [/B]
[B] { [/B]
[B]  int f=0,i; [/B]
[B]  for(i=0;i<8&&!f;i++) [/B]
[B]   { [/B]
[B]    if(ch==op[i]) [/B]
[B]     f=1; [/B]
[B]   } [/B]
[B] return f; [/B]
[B]} [/B]

[B]int Isdel(char ch) [/B]
[B] { [/B]
[B]  int f=0,i; [/B]
[B]  for(i=0;i<8&&!f;i++) [/B]
[B]   { [/B]
[B]    if(ch==del[i]) [/B]
[B]     f=1; [/B]
[B]   } [/B]
[B] return f; [/B]
[B] } [/B]

[B]int Iskey(char * str) [/B]
[B]{ [/B]
[B]  int i,f=0; [/B]
[B]  for(i=0;i<5;i++) [/B]
[B]   { [/B]
[B]    if(!strcmp(key[i],str)) [/B]
[B]      f=1; [/B]
[B]    } [/B]
[B]  return f; [/B]
[B]} [/B]


[B]void removeduplicate() [/B]
[B] { [/B]
[B]   int i,j; [/B]
[B]   for(i=0;i<20;i++) [/B]
[B]    { [/B]
[B]     uqdeli[i]=0; [/B]
[B]     uqopi[i]=0; [/B]
[B]     uqideni[i]=0; [/B]
[B]    } [/B]
[B]   for(i=1;i<deli+1;i++)  //remove duplicate delemeters [/B]
[B]     { [/B]
[B]       if(uqdeli[i-1]==0) [/B]
[B]     { [/B]
[B]           uqdel[uqdi++]=delem[i-1]; [/B]
[B]           for(j=i;j<deli;j++) [/B]
[B]          { [/B]
[B]               if(delem[i-1]==delem[j]) [/B]
[B]                uqdeli[j]=1; [/B]
[B]          } [/B]
[B]      } [/B]
[B]     } [/B]

[B]    for(i=1;i<idi+1;i++)  //remove duplicate  identifiers [/B]
[B]       { [/B]
[B]      if(uqideni[i-1]==0) [/B]
[B]         { [/B]
[B]        strcpy(uqiden[uqidi++],iden[i-1]); [/B]
[B]        for(j=i;j<idi;j++) [/B]
[B]         { [/B]
[B]            if(!strcmp(iden[i-1],iden[j])) [/B]
[B]               uqideni[j]=1; [/B]
[B]         } [/B]
[B]          } [/B]
[B]    } [/B]

[B]     for(i=1;i<opi+1;i++)  //remove duplicate  operators [/B]
[B]     { [/B]
[B]        if(uqopi[i-1]==0) [/B]
[B]           { [/B]
[B]           strcpy(uqop[uqoperi++],oper[i-1]); [/B]
[B]           for(j=i;j<opi;j++) [/B]
[B]             { [/B]
[B]               if(!strcmp(oper[i-1],oper[j])) [/B]
[B]                 uqopi[j]=1; [/B]
[B]             } [/B]
[B]           } [/B]
[B]     } [/B]

[B] } [/B]

[B]void final() [/B]
[B] { [/B]
[B]  int i=0; [/B]
[B]  idi=0; [/B]
[B]  for(i=0;i<uqidi;i++) [/B]
[B]   { [/B]
[B]     if(Iskey(uqiden[i]))       [/B]
[B]     strcpy(keyword[kdi++],uqiden[i]); [/B]

[B]     else [/B]
[B]      if(isdigit(uqiden[i][0]))    [/B]
[B]     strcpy(constant[ci++],uqiden[i]); [/B]
[B]     else			//heeeeeeereeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee[/B]
[B]	if(Iserror(uqiden[i]))[/B]
[B]	strcpy(err[ei++],uqiden[i]);[/B]
[B]     else [/B]
[B]     strcpy(iden[idi++],uqiden[i]); [/B]
[B]  	[/B]
[B]   } [/B]

[B]	[/B]
[B] printf("\n\n#################################################################################\n\n\tDelemeter are : \n"); [/B]
[B]for(i=0;i<uqdi;i++) [/B]
[B]printf("\t%c\n",uqdel[i]); [/B]

[B]	cout<<"\n\tOperators are : \n";[/B]
[B]	for (i = 0; i<uqoperi; i++)[/B]
[B]	{[/B]
[B]		cout<<"\t";[/B]
[B]		puts(uqop[i]);[/B]
[B]	}[/B]

[B]	cout<<"\n\tIdentifiers are : \n";[/B]
[B]	for (i = 0; i<idi; i++)[/B]
[B]	{[/B]
[B]		cout<<"\t";[/B]
[B]		puts(iden[i]);[/B]
[B]	}[/B]

[B]	cout<<"\n\tKeywords are : \n";[/B]
[B]	for (i = 0; i<kdi; i++)[/B]
[B]	{[/B]
[B]		cout<<"\t";[/B]
[B]		puts(keyword[i]);[/B]
[B]	}[/B]

[B]	cout<<"\n\tNumbers are :\n";[/B]
[B]	for (i = 0; i<ci; i++)[/B]
[B]	{[/B]
[B]		printf("\t");[/B]
[B]		puts(constant[i]);[/B]
[B]	}[/B]

[B]	cout<<"\n\tLiterals are :\n";[/B]
[B]	for (i = 0; i<liti; i++)[/B]
[B]	{[/B]
[B]		cout<<"\t";[/B]
[B]		puts(litral[i]);[/B]
[B]	}[/B]
[B]	[/B]
[B]	cout<<"\n\tErrors are :\n";	//heeeeeeereeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee[/B]
[B]	for (i = 0; i<ei; i++)[/B]
[B]	{[/B]
[B]		cout<<"\t";[/B]
[B]		puts(err[i]);[/B]
[B]	}[/B]
[B]}[/B]
[B]void main() [/B]
[B]{ [/B]
[B]	char str[500]; [/B]
[B]	cout<<"\t\t\tEnter your code then type # and press ENTER to implement Lexical Analyzer:\n\t";[/B]
[B]	cin.getline(str,500,'#');[/B]
[B]	lexanalysis(str); [/B]
[B]	getch(); [/B]
[B]}[/B]

[B]
 
بالا