www.pudn.com > del62755882442.rar > zhanghui.cpp
#include#include #include #include #include struct danci { int id; //单词种别 char name[10]; //单词属性值 }; int fout[20]; int index=1; int G_table[9][6]; int k[20]; int n=0; danci word[20]; int boo(int); int compare(int); int not(int); int forid(int); typedef struct node{ int data; node* next; }* link; link insert(link stack,int n)//向前插入链表 { link newnode; newnode=new node; if(!newnode) { cout<<"error!"< data=n; newnode->next=stack; stack=newnode; return stack; } link del(link stack,int &value)//删除链表元素 { link top; if(stack) { top=stack; stack=stack->next; value=top->data; delete top; return stack; } value=-1; return NULL; } void error() { cout<<"词法错误,标志符不能以数字开头"< "< "< "< "< "< "< "< "< "< ':if(buf[i+1]=='=') { i++; word[n].id=8; strcpy(word[n].name,">="); } else { word[n].id=4; strcpy(word[n].name,">"); } n++;break; case '<':if(buf[i+1]=='=') { i++; word[n].id=9; strcpy(word[n].name,"<="); } else { word[n].id=5; strcpy(word[n].name,"<"); } n++;break; case '=': word[n].id=6;strcpy(word[n].name,"=");n++;break; case '!': if(buf[i+1]=='=') { i++; word[n].id=7;strcpy(word[n].name,"!="); n++; } break; case '(': word[n].id=10;strcpy(word[n].name,"(");n++;break; case ')': word[n].id=11;strcpy(word[n].name,")");n++;break; } i++; } } strcpy(word[n].name,"#"); word[n].id=999; return n;//单词符号个数 } void gram(int * kind) { int n=0; link state; link lex; link operate; link ID; state=new node[30];lex=new node[15]; if(!state||!lex) { cout<<"over stack! "< data; if(Stable[staTop][kind[a]]==0) { break; } else if(Stable[staTop][kind[a]]<20) { //规约 int sta1; int letter1; if(state!=NULL) state=del(state,sta1); else { error1(); } int num=0; //出栈次数 int b; for(b=1;b data; state=insert(state,Stable[staTop1][G_table[Stable[staTop][kind[a]]][0]]-50); a--; if(num>1) { if(ch1==0)//总结符 { ID=del(ID,ch1); ch1=trace;trace--; } else ch1=-1; operate=del(operate,operater); ID=del(ID,ch2); ch2=trace;trace--; ch1--; } } else if(Stable[staTop][kind[a]]<50) {//移进一个符号 state=insert(state,Stable[staTop][kind[a]]-20); lex=insert(lex,kind[a]); if(kind[a]==0) { trace++; ID=insert(ID,kind[a]); } else operate=insert(operate,kind[a]); } else if(Stable[staTop][kind[a]]==99) { cout< ";break; case 5: cout<<"< ";break; case 6: cout<<"= ";break; case 7: cout<<"!= ";break; case 8: cout<<">= ";break; case 9: cout<<"<= ";break; } } } index=0; } int compare(int i) { int ii; i=not(i); while(word[i].id==4||word[i].id==5||word[i].id==6 ||word[i].id==7||word[i].id==8||word[i].id==9) { ii=i; i++; i=not(i); fout[index]=ii; index++; } return i; } void main() { char buffer[30]; int i=0; int length; char *inword; init(); print(); cout<<"输入布尔表达式,以#结束 :"< >buffer[i]; while(buffer[i]!='#') { i++; cin.get(buffer[i]); } buffer[i]='\0'; length=i+1; inword=new char[length]; memcpy(inword,buffer,length); length=lex(inword); cout<<"词法分析结果如下:"<