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;bdata; 
			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<<"词法分析结果如下:"<