⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 本文是关于编绎原理中语法分析的重要内容,严格实验所以要求.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
/**********************SAMPLE语言的语法、语义分析器******************************/


#include<iostream.h>
#include<string.h>
#include <stdio.h>

char word[60][20];      //用来存放初使符号表
int n;                  //用来表示table1的元素个数
int q;                  //用来表示数组c的元素个数
char table1[100][20];   //表里存放标识符,整数,字符常数
int c[500];             //表里存放词法分析结果
int tetrad_num=0;       //记录四元式个数
int token_num=0;        //对token的内容记数
int token=0;            
int table1_num=0;       //
int table1_num2=0;
char stack[100][20];
int stack_num=0;
int flag=0;

typedef struct          //四元组类说明
{
	char opr[20];
	char p1[20];
	char p2[20];
	char p3[20];
}sys;
sys tetrad[500];        //四元组
void tet(char a1[],char a2[],char a3[],char a4[]);              //四元组赋值
void init();
int IsDigit(char ch);    //数字?
int IsAlpha(char ch);    //字母?
void getsym(FILE *fin);  //词法分析
int getnext();           
void putout();            //输出四元组

//以下为各产生式对应程序
//以下是程序
void program(); 
void id(int &token);
void var_explain(int &token);
void var_definition(int &token);
void mid_var(int &token);
void kind(int &token);
void id_table(int &token);
void mid_id(int &token);
//以下是表达式
void expression(int &token);
void a_expression(int &token);
void mid_a1(int &token);
void a_1(int &token);
void mid_a2(int &token);
void a_2(int &token);
void a_3(int &token);
void interger(int &token);
void b_expression(int &token);
void mid_b1(int &token);
void b_1(int &token);
void mid_b2(int &token);
void b_2(int &token);
void b_3(int &token);
void bool_digit(int &token);
void relation(int &token);
void mid(int &token);
//以下是语句
/*void sentence(int &token);
void complex(int &token);
void sentence_table(int &token);
void mid_sentence(int token);*/



void main()
{
	cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
		<<"*              姓名   薛江                                  *\n"
		<<"*              班级   05计算机联合班                        *\n"
		<<"*              学号   200530612154                          *\n"
	    <<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n";
	while(1)
	{
	cout<<"请输入要测试的程序:";
	char filename[10];
	cin>>filename;
	FILE* fin = fopen(filename,"r");
	getsym(fin);
	cout<<endl;
	expression(token);
	cout<<table1[0]<<table1[1]<<table1[2]<<table1[3]<<table1[4]<<table1[5]<<table1[6]<<table1[7]<<endl;
	cout<<stack[0]<<stack[1]<<stack[2]<<stack[3]<<stack[4]<<stack[5]<<stack[6]<<stack[7]<<endl;
	putout();
	fclose(fin);
	}
}
//以下是程序
void program()
{
	token=getnext();
	if(token==23)
	{
		token=getnext();
		id(token);
		if(token==52)
		{
			tet("program",table1[table1_num++],"-","-");
			token=getnext();
			var_explain(token);
			//complex(token);
			if(token==46)
			{
				tet("sys","-","-","-");
			}
			else
			{
				cout<<"error1"<<endl;
			}
		}
		else
		{
			cout<<"error2"<<endl;
		}
	}
	else
	{
		cout<<"error3"<<endl;
	}
}

void id(int &token)
{
	if(token==36)
	{
		token=getnext();
	}
	else
	{
		cout<<"error4"<<endl;
	}
}

void var_explain(int &token)
{
	if(token==33)
	{
		token=getnext();
		var_definition(token);
	}
	else if(token!=3)
	{
		cout<<"error5"<<endl;
	}
}

void var_definition(int &token)
{
	id_table(token);
	if(token==50)
	{
		token=getnext();
		kind(token);
		if(token==52)
		{
			token=getnext();
		}
		else
		{
			cout<<"error6"<<endl;
		}
		mid_var(token);
	}
	else
	{
		cout<<"error7"<<endl;
	}
}

void mid_var(int &token)
{
	var_definition(token);
	if(token!=3)
	{
		cout<<"error8"<<endl;
	}
}
void kind(int &token)
{
	if(token==17||token==4||token==25)
	{
		token=getnext();
	}
	else
	{
		cout<<"error9"<<endl;
	}
}
void id_table(int &token)
{
	id(token);
	mid_id(token);
}
void mid_id(int &token)
{
	if(token==44)
	{
		token=getnext();
		id_table(token);
	}
	else if(token!=3)
	{
		cout<<"error10"<<endl;
	}
}
//以下是语句
/*void complex(int &token)
{
	if(token==3)
	{
		token=getnext();
		sentence_table(token);
		if(token==12)
		{
			token=getnext();
		}
		else 
		{
			cout<<"error"<<endl;
		}
	}
	else 
	{
		cout<<"error"<<endl;
	}
}
void sentence_table(int &token)
{
	sentence(token);
	mid_sentence(token);
}
void mid_sentence(int token)
{
	int schain=statstack[--top1],p,q;
	//backpatch(sentence.chain,nextstat)
	p=q=schain;
	while(p!=0)
	{
		q=sen[p].next;
		sen[p].next=nextstat;
		p=q;
	}
	if(token==52)
	{
		token=getnext();
		sentence(token);
	}
	else if(token!=12)
	{
		cout<<"error"<<endl;
	}
}

void Sentence()
{
	if(!strcmp(token,"while"))
	{
		//while 语句
		//w.codebegin入栈
		statstack[top1++]=nextstat;
		gettoken();
		SBoolExp();//statstack栈顶为E.false,E.true,E.codebegin
		if(!strcmp(token,"do"))
		{
			int f,t,cb,wcb,p,q;
			f=statstack[--top1];//E.false
			t=statstack[--top1];//E.true
			cb=statstack[--top1];//E.codebegin
			wcb=statstack[--top1];//get w.codebegin
			//backpatch(E.true,nextstat)
			p=q=t;
			while(p!=0)
			{
				q=sen[p].next;
				sen[p].next=nextstat;      
				p=q;
			}
			//w.codebegin入栈
			statstack[top1++]=wcb;
			//w1.codebegin=w.codebegin(w1为whlie E do)
			statstack[top1++]=wcb;
			//w1.chain=E.false
			statstack[top1++]=f;
			gettoken();
			Sentence();
			//backpatch(s.chain,w1.codebegin)
			int schain=statstack[--top1];//得到do后面的sentence的chain
			int wchain=statstack[--top1];//得到w1.chain
			wcb=statstack[--top1];//得到w1.codebegin
			cb=statstack[--top1];//得到w.codebegin
			p=q=schain;
			while(p!=0)
			{
				q=sen[p].next;
				sen[p].next=wcb;
				p=q;
			}
			//emit(j,-,-,w.codebegin)
			strcpy(sen[nextstat].op,"j");
			strcpy(sen[nextstat].oprand1,"-");
			strcpy(sen[nextstat].oprand2,"-");
			sen[nextstat++].next=cb;
			//s.chain=w1.chain
			statstack[top1++]=wchain;
		}
		else
			cout<<"ERROR3: MISSING DO AFTER WHILE\n";
	}
	else if(!strcmp(token,"repeat"))
	{
		//repeat语句
		//repeat.codebegin=nextstat
		statstack[top1++]=nextstat;
		gettoken();
		Sentence();
		if(!strcmp(token,"until"))
		{
			//backpatch(S1.chain,nextstat)
			int s1chain,p,q;
			s1chain=statstack[--top1]; //得到S1.chain
			p=q=s1chain;
			while(p!=0)
			{
				q=sen[p].next;
				sen[p].next=nextstat;
				p=q;
			}
			gettoken();
			SBoolExp();
			//backpatch(E.false,repeat.codebegin)
			int f,t,cb;
			f=statstack[--top1];t=statstack[--top1];
			--top1;cb=statstack[--top1];//get repeat.codebegin
			p=q=f;
			while(p!=0)
			{
				q=sen[p].next;
				sen[p].next=cb;
				p=q;
			}
			statstack[top1++]=t;
		}
		else
			cout<<"ERROR4: MISSING UNTIL AFTER REPEAT\n";
	}
	else if(!strcmp(token,"if"))
	{
		//if then 语句
		gettoken();
		SBoolExp();
		if(!strcmp(token,"then"))
		{
			//backpatch(E.true,nextstat)
			int f,t,cb,p,q;
			f=statstack[--top1];//E.false
			t=statstack[--top1];//E.true
			cb=statstack[--top1];//E.codebegin
			p=q=t;
			while(p!=0)
			{
				q=sen[p].next;
				sen[p].next=nextstat;
				p=q;
			}
			
			gettoken();
			Sentence();
//-〉modify			//C.chain=E.false(C.chain=if E then)
			statstack[top1++]=f;
			//if then else 语句
			SenElse();
		}
		else
			cout<<"ERROR5: MISSIG THEN AFTER IF\n";
	}
	else if(!strcmp(token,"begin"))
	{
		SComSen();
	}
	else if(token[0]>='a'&&token[0]<='z'||token[0]>='A'&&token[0]<='Z')//改为36,标示符
	{
		SIdent();
		if(!strcmp(token,":="))
		{
			//赋值语句
			gettoken();
			SArithExp();
			strcpy(sen[nextstat].op,":=");
			strcpy(sen[nextstat].oprand1,idstack[--idtop]);
			strcpy(sen[nextstat].oprand2,"-");
			strcpy(sen[nextstat].result, idstack[--idtop]);
			sen[nextstat++].next=-1;
			//s.chain=0
			statstack[top1++]=0;
		}
		else
			cout<<"ERROR6: MISSING := AFTER IDENTIFIER\n";
	}
	else cout<<"ERROR7\n";
}

void SenElse()
{
	int s1chain,cchain;
	cchain=statstack[--top1]; //get C.chain
	s1chain=statstack[--top1];//get Sen1.chain
	if(!strcmp(token,"else"))
	{
		//q:=nextstat
		int q=nextstat;
		//emit(j,-,-,0)
		strcpy(sen[nextstat].op,"j");
		strcpy(sen[nextstat].oprand1,"-");
		strcpy(sen[nextstat].oprand2,"-");
		sen[nextstat++].next=0;
		//backpatch(c.chain,nextstat)
		int r,s;
		r=s=cchain;
		while(r!=0)
		{
			s=sen[r].next;
			sen[r].next=nextstat;
			r=s;
		}
		//seneles.chain=merge(sen1.chain,q)
		if(q==0)
			statstack[top1++]=s1chain;
		else
		{
			sen[1].next=s1chain;
			statstack[top1++]=q;
		}
		gettoken();
		Sentence();
		//Sen.chain=merge(SenElse.chain,Sen_2.chain)
		int s2chain,selsechain;
		s2chain=statstack[--top1];
		selsechain=statstack[--top1];
		if(s2chain==0)
			statstack[top1++]=s2chain;
		else
		{
			sen[s2chain].next=selsechain;
			statstack[top1++]=s2chain;
		}
	}
	else if(strcmp(token,"end")&&strcmp(token,";"))
		cout<<"ERROR8\n";
	else
	{
		//空产生式
		//merge(C.chain,S1.chain)
		if(s1chain==0)
			statstack[top1++]=cchain;
		else
		{
			sen[s1chain].next=cchain;
			statstack[top1++]=s1chain;
		}
	}
}

*/











//以下是表达式
void expression(int &token)
{
	token=getnext();
	a_expression(token);
	b_expression(token);
	//c_expression(token);
}

void a_expression(int &token)
{
	a_1(token);
	mid_a1(token);
}
void mid_a1(int &token)
{
	if(token==43)
	{
		token=getnext();
		a_1(token);
		mid_a1(token);
		tet("+",stack[stack_num-2],stack[stack_num-1],"T");
	}
	else if(token==45)
	{
		token=getnext();
		a_1(token);
		mid_a1(token);
		tet("-",stack[stack_num-2],stack[stack_num-1],"T");
	}
	else if(token!=40||token!=20||token!=1||
		    token!=56||token!=53||token!=55||
			token!=54||token!=58||token!=57||
			token!=52||token!=11||token!=32||
			token!=12||token!=10||token!=29)
	{
	    cout<<"error11"<<endl;
	}
}
void a_1(int &token)
{
	a_2(token);
	mid_a2(token);
}
void mid_a2(int &token)
{
	if(token==41)
	{
		token=getnext();
		a_2(token);
		mid_a2(token);
		tet("*",stack[stack_num-2],stack[stack_num-1],"T");
	}
	else if(token==48)
	{
		token=getnext();
		a_2(token);
		mid_a2(token);
		tet("/",stack[stack_num-2],stack[stack_num-1],"T");
	}
	else if(token!=43||token!=45||token!=40||
		    token!=56||token!=1||token!=20||
			token!=53||token!=54||token!=55||
			token!=57||token!=58||token!=52||
			token!=11||token!=32||token!=12||
			token!=10||token!=29)
	{
		cout<<"error12"<<endl;
	}
}
void a_2(int &token)         
{
	if(token==45)
	{
		token=getnext();
		a_2(token);
	}
	else if(token==36||token==37||token==39)
	{
		a_3(token);
	}
	else
	{
		cout<<"error"<<endl;
	}
}
void a_3(int &token)
{
	if(token==39)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -