- ارسال ها
- 1
- لایک ها
- 0
- امتیاز
- 0
سلام دوستان
پروژه تحلیلگر لغوی زبان سی پلاس پلاس مربوط به درس طراحی کامپایلر رو پیاده سازی کردم کامل اجرا میشه و مشکلی نداره فقط قسمت خطایاب خطاهای لغوی رو نمیتونه تشخیص بده و نمیدونم مشکل از کجاس لطفا کمکم کنید...خیلی عجله ای و اورژانسی هست
:17::17::17:
قسمت های مربوط به خطایاب رو کامنت here گذاشتم
پروژه تحلیلگر لغوی زبان سی پلاس پلاس مربوط به درس طراحی کامپایلر رو پیاده سازی کردم کامل اجرا میشه و مشکلی نداره فقط قسمت خطایاب خطاهای لغوی رو نمیتونه تشخیص بده و نمیدونم مشکل از کجاس لطفا کمکم کنید...خیلی عجله ای و اورژانسی هست
: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]